贷款违约行为预测_第1页
贷款违约行为预测_第2页
贷款违约行为预测_第3页
贷款违约行为预测_第4页
贷款违约行为预测_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机器学习实战案例

——贷款违约行为预测复旦大学赵卫东

业务背景分析互联网金融在为金融机构和用户提供诸多便利的同时,也存在着信用风险和欺诈问题。自2013年年底以来,我国商业银行的贷款率一直偏高。由于我国商业银行个人信贷的部分业务不需要提供担保和抵押,因此个人信贷业务面临较大的信用风险。个人信贷的信用风险,是网络个人信贷机构和出借人面临的重要风险。个人信贷背景下的信用风险的危害性日益凸显,违约事件背后产生的道德风险也比较普遍。这不仅给信贷机构造成损失,同时也可能导致借贷市场运行效率低下。因此,金融机构急需通过必要的手段来提高信用风险控制的水平。数据概况信贷机构出借资金给贷款人前,会对贷款人的基本信息和以前的信用状况进行收集,以评估贷款人是否有贷款资格以及贷款额度的上限值,因此信贷机构会积累贷款人的大量基本信息。本案例中将某贷款机构脱敏后的历史业务数据作为原始数据,在海量的个人信用历史和信息行为的数据基础,采用机器学习技术得出信用模式,能更加准确地预测个人未来的信用表现,能够提高操作的效率,降低授信成本,精确估计消费信贷的风险,为金融机构进行风险预测提供重要的工具。数据表样例(基础信息表)关键属性名字段含义备注REPORT_ID报告编号用于关联其他数据表ID_CARD身份证包含居民常住户口所在地LOAN_DATE放款时间AGENT客户渠道IS_LOCAL是否本地户籍取值分为本地户籍、非本地户籍WORK_PROVINCE工作省份EDU_LEVEL教育水平MARRY_STATUS是否有公积金SALARY收入HAS_FUND是否有公积金二值属性。取值为1代表有公积金,取值为0代表无。Y目标变量值只在训练集中存在,y=1代表逾期客户,y=0代表未逾期客户步骤数据准备与预处理将初始表进行预处理将预处理后的表合并将合并后的表再做预处理四种模型分别在训练集和测试集上进行拟合:带正则项的Logistic回归模型、随机森林、朴素贝叶斯、SVM计算每种数据集在每种模型得到的AUC值数据准备与预处理先对12个表格做预处理,处理后合并表格,再对合并后的表格进行预处理,可以得到用于建立模型的最终数据。在预处理阶段,主要进行了以下几个内容:变量属性识别与标注空值处理异常值处理维归约独热编码标准化变量属性识别与标注

变量属性分为定性属性和定量属性,而定性属性分为标称属性(例如性别)和序数属性(例如学历),定量属性分为区间属性(例如日期)和比率属性(例如年龄、工资)。对不同变量属性的处理方法都不相同。首先通过代码对每个表的变量进行自动化的变量属性识别,并结合人工进行标注,得到每个变量的属性类型。如“gender”一项可按身份证号标记男女为1和0,“MARRY_STATUS”根据其不同的婚姻状态可以标记为0~5。#根据身份证号获取性别(男1,女0)train['gender']=list(map(lambdax:1ifint(str(x)[-2])%2==1else0,train['ID_CARD']))#用字典对特征类别进行标注is_local_repalce_dict={'本地籍':"0","非本地籍":"1"}train["IS_LOCAL"]=train["IS_LOCAL"].map(is_local_repalce_dict)train['MARRY_STATUS'].value_counts()marry_status_dict={"已婚":"0","未婚":"1","离异":"2","离婚":"2","其他":"4","丧偶":"5"}train["MARRY_STATUS"]=train["MARRY_STATUS"].map(marry_status_dict)变量名属性类型取值REPORT_ID/数字,例如8787ID_CARD标称属性数字,例如320382**********13LOAN_DATE区间属性日期,例如2017/2/15AGENT标称属性文字,例如“app”“wechat”等IS_LOCAL标称属性(二值)文字,例如“本地户籍”“非本地户籍”WORK_PROVINCE标称属性(多值)数字,例如320000、230000等EDU_LEVEL序数属性文字,例如“高中”“专科”“本科”等MARRY_STATUS标称属性(多值)文字,例如“未婚”“已婚”“离异”等SALARY比率属性数字,例如2、3、4、5等HAS_FUND标称属性(二值)数字,例如0、1Y标称属性(二值)数字,例如0、1空值处理

对空值的统计如下表所示,可以发现空值较多的变量为WORK_PROVINCE、EDU_LEVEL、AGENT和SALARY。首先评判该属性是否重要、其影响是否显著。若该变量重要,则处理的方法有:使用其他信息的相关内容进行填补(如身份证号前6位可代表出生地区),使用样本均值或建立模型。若该变量不重要,则可直接使用.drop()方法将变量剔除。变量名空值数REPORT_ID0ID_CARD0LOAN_DATE0AGENT21048IS_LOCAL0WORK_PROVINCE2258EDU_LEVEL3058MARRY_STATUS0SALARY21136HAS_FUND0Y0#对于重要变量:地区,选择填补#地区归并到省,取地区编码前两位,缺失值用身份证前两位替代(出生地)province=list(map(lambdax,y:y[:2]ifnp.isnan(x)elsestr(x)[:2],train['WORK_PROVINCE'],train['ID_CARD']))train['WORK_PROVINCE']=province#对非重要变量AGENT,使用drop()方法剔除train_part=pd.get_dummies(train.loc[:,["AGENT","IS_LOCAL","WORK_PROVINCE","MARRY_STATUS"]],drop_first=True)train[train_part.columns]=train_partif'AGENT'intrain.columns:train.drop(['AGENT','IS_LOCAL','WORK_PROVINCE','MARRY_STATUS'],axis=1,inplace=True)异常值检测

异常值处理主要针对连续变量,防止出现某些远超分布范围的值对整个分布造成影响。本案例只有一个连续变量(SALARY),变量属性类型为比率属性。选择winsorize变换处理异常值,其思想是通过上下分位数对特征的分布进行约束,选择99%和1%分位数作为阈值,当值超过99%分位数时,用99%分位数的值进行替换;当值低于1%分位数时,用1%分位数的值进行替换。代码部分:#可能出现异常值的变量:###SALARYprint(train['SALARY'].describe())输出值:维归约

维归约就是指数据特征维度数目减少或者压缩,摒弃掉不重要的维度特征,尽量只用少数的关键特征来描述数据。人们总是希望看到的现象主要是由少数的关键特征造成的,找到这些关键特征也是数据分析的目的。如果数据经过归约处理得当,不影响数据重新构造而不丢失任何信息,则该数据归约是无损的。对变量WORK_PROVINCE进行空值处理后,发现该变量的值比较多,这将导致对该变量独热编码时,产生大量的二元特征,且非常稀疏,因此将其进行维规约,将城市变量规约到省份变量中,最终得到近30个代表省份的虚拟变量。#对WORK_PROVINCE进行维规约处理if'AGENT'intrain.columns:train.drop(['AGENT','IS_LOCAL','WORK_PROVINCE','MARRY_STATUS'],axis=1,inplace=True)#注意其中省份为两位数编码,但是原数据读进去的是浮点型,需要先转成字符串train_part=pd.get_dummies(train.loc[:,["AGENT","IS_LOCAL","WORK_PROVINCE","MARRY_STATUS"]],drop_first=True)train[train_part.columns]=train_part独热编码

独热编码又称为一位有效编码,采用N为状态寄存器对N个状态进行编码,每个状态都有它的独立寄存器位,并且在任意时候只对一位有效。例如“性别”这一属性可选值为[”男”、“女],可以定义值为[01,10]。针对标称变量IS_LOCAL、WORK_PROVINCE、MARRY_STATUS,进行独热编码,生成该变量每一个类别对应的虚拟变量,同时需要注意虚拟变量陷阱,剔除作为对照组的虚拟变量,以防止多重共线性。#2.给变量独热编码(onehotencoding),产生dummy#注意其中省份为两位数编码,但是原数据读进去的是浮点型,需要先转成字符串train_part=pd.get_dummies(train.loc[:,["AGENT","IS_LOCAL","WORK_PROVINCE","MARRY_STATUS"]],drop_first=True)train[train_part.columns]=train_part标准化

数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不同的标准化方法,对系统的评价结果会产生不同的影响。针对比率属性变量SALARY、区间属性变量LOAN_DATE、序数属性变量EDU_LEVEL,为了防止计算距离时量纲不统一带来的问题,对其进行标准化,即用该变量值减去均值后除以标准差。#连续指标标准化##需要标准化的变量:SALARY、LOAN_TIME、EDU_LEVELdefscalar(series):theMean=series.mean()theStd=series.std()returnseries.map(lambdax:(x-theMean)/theStd)train['SALARY']=scalar(train['SALARY'])train['LOAN_TIME']=scalar(train['LOAN_TIME'])train['EDU_LEVEL']=scalar(train['EDU_LEVEL'])df_train=train.copy()多表合并每张表预处理完毕后,通过report_id属性将table_1至table_11合并成一张表train_all.csv。

importpandasaspdimportnumpyasnpdf_table_1_train=pd.read_csv('...\table_1_train.csv',index_col=0)df_table_2=pd.read_csv('...\table_2.csv',index_col=0)...df_table_11=pd.read_csv('...\table_11.csv',index_col=0)df_all=pd.merge(df_table_1_train,df_table_2,how='left',left_index=True,right_index=True)df_all=pd.merge(df_all,df_table_3,how='left',left_index=True,right_index=True)...df_all=pd.merge(df_all,df_table_11,how='left',left_index=True,right_index=True)df_all.shapedf_all.to_csv('...\train_all.csv')对合并后的表进行最终处理合并完毕后,pre_train.py将对合并的数据进行最终的预处理,包括去除空值、去除非重要信息。df_table_all=pd.read_csv("..\data_handled\test_all.csv",index_col=0)df_table_all=df_table_all.drop(['LOAN_DATE'],axis=1)df_table_all=df_table_all.dropna(axis=1,how='all')columns=df_table_all.columnsimr=Imputer(missing_values='NaN',strategy='mean',axis=0)df_table_all=pd.DataFrame(imr.fit_transform(df_table_all.values))df_table_all.columns=columnsdf_table_all.to_csv("..\data_handled\testafter.csv") 模型选择与运行步骤为了选择较优的模型,下面使用多种能对贷款违约行为进行预测的分类算法进行比较。本案例中,分别使用了以下几个模型:带正则项的Logistic回归模型朴素贝叶斯模型随机森林模型SVM模型实现步骤如下:将数据拆分成训练集和测试集分别使用Python中Sklearn库的四种模型进行评估,得到每种模型的ROC曲线计算每种模型的AUC值带正项的Logistic模型Logistic回归模型在两分类问题中具有非常广泛的应用,它能将待分类样本的类别分成两类,是该模型的核心是通过Sigmoid函数将因变量的值转换成概率。但该模型在分类的精准度上有一定欠缺,容易产生过拟合的现象。同时,Logistic回归模型通常用来处理两分类问题,不能很好地处理多分类的情况。而对贷款违约行为进行预测正是贷款是否逾期的两分类问题,比较适合Logistic回归模型处理。实验发现Logistic回归模型作用在非平衡数据上效果较差,AUC值要低于使用SMOTE+TOMEK处理后数据的AUC结果,因此需要选择经过平衡处理后再经过特征选择的训练集和测试集进行测试。使用带正项的Logistic模型进行训练:model1=LogisticRegression(penalty='l1',C=1.0)model1.fit(X_train_st_tiny,y_train_st)y_pred=model1.predict_proba(X_test_st_tiny)朴素贝叶斯模型朴素贝叶斯模型假设每个特征对分类变量的影响是独立的,这使得分类的联合条件概率很容易计算。其在信用评估方面得到了广泛的应用。因为在信用评估中,多数变量的属性为标称变量,并且原始数据存在较多的空值,而朴素贝叶斯主要对标称数据进行分析,对空值又不太敏感,因此,选择该分类器对贷款违约行为进行预测。使用朴素贝叶斯模型进行训练:model1=GaussianNB()model1.fit(X_train_st_tiny,y_train_st)y_pred=model1.predict_proba(X_test_st_tiny)随机森林模型随机森林近年来广泛应用的领域是信用评估,信用评估中样本量较大,原始数据存在较多的空值,并且数据中离散变量占多数。随机森林模型可以很好地处理这样的数据,因此可以选用随机森林算法对贷款违约行为的数据进行拟合预测。随机森林模型虽然对空值不敏感,但在部分样本的特征属性为空值的情况下,仍可以维持分类的准确度。随机森林模型既能够通过随机抽取的方式,抽取不同的特征变量进行分类,又能够处理大批量、多维度的复杂数据,模型的泛化能力强,不易造成过拟合问题,而且具有较高的分类准确度。随机森林要求每个决策树差异尽可能的大,从而在最大程度上减少模型的方差。随机森林模型超参数,比较复杂,不仅需要每一棵决策树的参数,还需要整个集成模型的参数,经检验发现,随机森林在非平衡数据上依旧有着很好的效果。使用随机森林模型进行训练:rf=RandomForestClassifier(n_estimators=100,n_jobs=-1,criterion='gini')rf.fit(X_train_tiny,y_train)支持向量机模型支持向量机也适用于有监督的两分类问题。研究表明,SVM在分类过程中可以利用少量的样本获得很好的分类效果,因此在贷款违约预测方面有很好的适用性。SVM的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。少数支持向量决定了最终结果,这不但可以抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“稳健”性。经典的SVM算法只给出了两分类的算法,而本案例主要也是处理两分类问题,因此该算法的特点和所要分析的数据的特点较为符合。使用SVM进行训练:model=SVC(C=0.1,kernel='linear',probability=True)model.fit(X_train_st_tiny,y_train_st)y_pred=model.predict_proba(X_test_st_tiny)结果分析

假正率是通过求解混淆矩阵得到的,在求解混淆矩阵时,首先通过“Dist”指标求解出每个模型的最优阈值,因为设置不同的预测阈值会影响假正率的求解结果,因此表3.7所示的假正率是基于最优阈值的截断值计算所得。按照各个模型的假正率从小到大的顺序为朴素贝叶斯(0.012)、Logistic(0.021)、随机森林(0.023)、SVM(0.037)。根据AUC值,本案例选择预测模型的优先顺序为Logistic(0.8511)、SVM(0.8439)、随机森林(0.8096)、朴素贝叶斯(0.7984),而根据假正率,本案例选择预测模型的优先顺序为朴素贝叶斯(0.012)、Logistic回归模型(0.021)、随机森林(0.023)、SVM(0.037),二者存在矛盾。查看相关文献可知,假正率是基于较佳的截断值计算的,而AUC是基于所有可能的截断值计算的,所以AUC更加稳健。怎么理解“稳健”这个词呢?可以理解为计算假正率时所基于的较佳截断值并不是总体分布中的较佳截断值,正确率只是某个随机样本的一个属性指标。而AUC不是关注某个随机样本截断值的表现如何,而是综合所有截断值预测性能,所以假正率低,或者说准确率高,AUC不一定大,反之亦然。因此应该根据AUC较大的原则选择模型作为较佳模型。Logistic回归模型适用于特征维度适中、离散变量少的大容量样本,在特征变量选取适当的情况下,能够对两分类问题有较为准确的评分效果,但不能很好地处理多分类的情况。本案例对贷款违约的预测是两分类问题(逾期或不逾期),并且样本容量大,起重要作用的特征数目为15个左右,特征数目较少,因此Logistic回归模型可以很好地处理该问题。但本案例的样本包含一些离散变量,因此Logistic回归模型对最终的贷款预测结果AUC值只达到0.8511。SVM算法有两个不足:一是SVM算法对大规模训练样本难以实施,由于SVM是借助二次规划来求解支持向量的,而求解二次规划涉及m阶矩阵的计算(m为样本的个数),当m数目很大时,该矩阵的存储和计算将耗费大量的机器内存和运算时间;二是用SVM解决多分类问题存在困难,经典的支持向量机局限于两分类的问题。本案例对贷款违约的预测是两分类问题(逾期或不逾期),这符合SVM算法的要求,但本案例提供的样本容量大,存储和计算耗费大量的机器内存和运算时间。如果考虑运行效率问题,由于Logistic回归模型、随机森林算法、朴素贝叶斯均无法进行增量拟合,因此每当加入新样本,需要重新拟合数据,运行一次的效率格外重要。而SVM运行的速度低于其他模型,且SVM的AUC值达到0.8439,与Logistic回归模型的AUC值0.8511比较接近,因此考虑运行效率问题,优选Logistic。随机森林算法通常适用于离散变量、连续变量混合的样本,对于特征变量维度较高的样本集具有良好的分类效果,对于数据特征属性变量少、噪声比例大的样本,随机森林算法易出现过拟合的情况,且对样本容量和特征数目的要求较高。本案例分析的是离散变量、连续变量混合的大容量样本,这比较符合随机森林算法的要求,而且随机森林算法已经可以较好地解决多分类问题。但是本案例起重要作用的特征数目为15个左右,特征数目较少,这将导致随机森林算法出现过拟合的情况,影响最终的预测结果。若提供更多的客户分类级别,例如不违约、逾期和违约等,那么这里的贷款违约问题就变成了一个多分类问题,随机森林算法相对于Logistic回归模型算法可能会得到更好的预测结果。朴素贝叶斯的成功之处在于使得原本不独立的变量近似认为是独立的,大大减少了模型的参数,从而在一定程度上避免了过拟合的现象。但这也是朴素贝叶斯模型的主要缺陷之一,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。朴素贝叶斯模型还有一个缺陷就是需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型存在问题导致预测效果不佳。本案例的变量并不是相互独立的,例如教育和收入之间就存在着明显的相关性。这会对预测的结果产生重大的影响,因为模型的前提假设就值得商榷,所以朴素贝叶斯模型在四个模型中的预测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论