逻辑回归实战2--同盾分数与同盾多头借贷

python金融风控评分卡模型和数据分析微专业课:http://dwz.date/b9vv

同盾科技公司
同盾科技是中国智能分析和决策领域领军企业,以人工智能、云计算、大数据三大核心技术体系为基础,基于对数据的探索洞察和深刻理解,将深度学习、联邦学习等领先技术与业务场景深度融合,为金融、保险、互联网、政务、零售、物流等行业提供智能分析与决策服务,赋能并激发客户,帮助客户做出更佳决策。截至目前,累计已有超过一万家客户选择了同盾的产品及服务。
受客户信赖的同时,同盾备受国内外顶尖资本关注,已获多轮共数亿美元融资。此外,同盾也获得了政府、公众与行业的持续认可,成功入选国家科技创新2030“新一代人工智能”重大项目课题组,荣获2019工信部中国互联网成长型企业20强、2019世界人工智能创新大赛20强 、2019年银行家杂志“十佳智能风控创新奖”、2019亚洲银行家年度风险数据与分析技术实施大奖等殊荣。
同盾有强大爬虫团队,收集数据质量在国内相对较好。但2019年公安部严厉打击非法爬虫行为,同盾公司受到不小影响。

同盾科技比较出名的就是同盾分数,一般中小企业用同盾分数来过滤坏客户,同盾分数大于80分的客户基本强行拒绝准入。下图是同盾分数和同盾多头借贷对应表。我们可以验证一下同盾分数效果。
excel保留两个字段,一个字段是二分类变量,一个字段是数值

同盾分数越高,多头命中概率越高

预测,当同盾分数为20,60,80分时,同盾多头借贷命中概率。这里就可以看出同盾80分时,预测坏客户概率达到0.87,已经非常高了,可以用于做强规则hard-rule强拒坏客户。

卡方检验数据偏大,对模型保持谨慎


下面是python脚本
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 7 10:07:49 2018
@author: 231469242@qq.com
"""
import
csv
import
numpy as np
import
pandas as pd
from
statsmodels.formula.api
import
glm
from
statsmodels.genmod.families
import
Binomial
import
matplotlib.pyplot as plt
import
seaborn as sns
#中文字体设置
from
matplotlib.font_manager
import
FontProperties
font
=
FontProperties(fname
=
r
"c:\windows\fonts\simsun.ttc"
,size
=
14
)
#该函数的其他的两个属性"notebook"和"paper"却不能正常显示中文
sns.set_context(
'poster'
)
fileName
=
"同盾多头借贷与同盾分数回归分析.csv"
reader
=
csv.reader(
open
(fileName))
#获取数据,类型:阵列
def
getData():
'''Get the data '''
inFile
=
'同盾多头借贷与同盾分数回归分析.csv'
data
=
np.genfromtxt(inFile, skip_header
=
1
, usecols
=
[
0
,
1
],
missing_values
=
'NA'
, delimiter
=
','
)
# Eliminate NaNs 消除NaN数据
data1
=
data[~np.isnan(data[:,
1
])]
return
data1
def
prepareForFit(inData):
''' Make the temperature-values unique, and count the number of failures and successes.
Returns a DataFrame'''
# Create a dataframe, with suitable columns for the fit
df
=
pd.DataFrame()
#np.unique返回去重的值
df[
'同盾分数'
]
=
np.unique(inData[:,
0
])
df[
'同盾多头借贷命中'
]
=
0
df[
'同盾多头借贷未命中'
]
=
0
df[
'total'
]
=
0
df.index
=
df.同盾分数.values
# Count the number of starts and failures
#inData.shape[0] 表示数据多少
for
ii
in
range
(inData.shape[
0
]):
#获取第一个值的温度
curTemp
=
inData[ii,
0
]
#获取第一个值的值,是否发生故障
curVal
=
inData[ii,
1
]
df.loc[curTemp,
'total'
]
+
=
1
if
curVal
=
=
1
:
df.loc[curTemp,
'同盾多头借贷命中'
]
+
=
1
else
:
df.loc[curTemp,
'同盾多头借贷未命中'
]
+
=
1
return
df
#逻辑回归公式
def
logistic(x, beta, alpha
=
0
):
''' Logistic Function '''
#点积,比如np.dot([1,2,3],[4,5,6]) = 1*4 + 2*5 + 3*6 = 32
return
1.0
/
(
1.0
+
np.exp(np.dot(beta, x)
+
alpha))
def
setFonts(
*
options):
return
#绘图
def
Plot(data,alpha,beta,picName):
#阵列,数值
array_values
=
data[:,
0
]
#阵列,二分类型
array_type
=
data[:,
1
]
plt.figure(figsize
=
(
10
,
10
))
setFonts()
#改变指定主题的风格参数
sns.set_style(
'darkgrid'
)
#numpy输出精度局部控制
np.set_printoptions(precision
=
3
, suppress
=
True
)
plt.scatter(array_values, array_type, s
=
200
, color
=
"k"
, alpha
=
0.5
)
#获x轴列表值,同盾分数
list_values
=
[row[
0
]
for
row
in
inData]
list_values
=
[
int
(i)
for
i
in
list_values]
#获取列表最大值和最小值
max_value
=
max
(list_values)
print
(
"max_value:"
,max_value)
min_value
=
min
(list_values)
print
(
"min_value:"
,min_value)
#最大值和最小值留有多余空间
x
=
np.arange(min_value, max_value
+
1
)
y
=
logistic(x, beta, alpha)
print
(
"test"
)
plt.hold(
True
)
plt.plot(x,y,
'r'
)
#设置y轴坐标刻度
plt.yticks([
0
,
1
])
#plt.xlim()返回当前的X轴绘图范围
plt.xlim([min_value,max_value])
outFile
=
picName
plt.ylabel(
"同盾多头借贷命中概率"
,fontproperties
=
font)
plt.xlabel(
"同盾分数"
,fontproperties
=
font)
plt.title(
"逻辑回归-同盾分数VS同盾多头借贷命中概率"
,fontproperties
=
font)
#产生方格
plt.hold(
True
)
#图像外部边缘的调整
plt.tight_layout
plt.show(outFile)
#用于预测逻辑回归概率
def
Prediction(x):
y
=
logistic(x, beta, alpha)
print
(
"probability prediction:"
,y)
'''
Prediction(80)
probability prediction: 0.872046286637
Prediction(100)
probability prediction: 0.970179520648
'''
#获取数据
inData
=
getData()
#得到频率计算后的数据
dfFit
=
prepareForFit(inData)
#Generalized Linear Model 建立二项式模型
model
=
glm(
'同盾多头借贷未命中 +同盾多头借贷命中 ~ 同盾分数'
, data
=
dfFit, family
=
Binomial()).fit()
print
(model.summary())
chi2
=
model.pearson_chi2
'''Out[37]: 46.893438309853522 分数越小,p值越大,H0成立,模型越好'''
print
(
"the chi2 is smaller,the model is better"
)
alpha
=
model.params[
0
]
beta
=
model.params[
1
]
Plot(inData,alpha,beta,
"logiscti regression"
)
#测试
Prediction(
20
)
Prediction(
60
)
Prediction(
80
)
python机器学习生物信息学系列课(博主录制):http://dwz.date/b9vw

微信公众号:pythonEducation
