逻辑回归实战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 csvimport numpy as npimport pandas as pdfrom statsmodels.formula.api import glmfrom statsmodels.genmod.families import Binomialimport matplotlib.pyplot as pltimport seaborn as sns#中文字体设置from matplotlib.font_manager import FontPropertiesfont=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


