子曰:工欲善其事必先利其器。要成为一名优秀的数据分析师或者算法工程师就必须要熟练掌握python中的几个分析利器如pandas,sklearn等。之前我们学习那么多技术,是时候找个练兵场把学到的东西拿出来练练手了,看看自己到底几斤几两。基于此,从本期开始我们来尝试着完成一个完整的比赛项目。
参加比赛好处多多:
- 检验自己到学到东西的掌握程度同时可以查缺补漏,考察是否可以熟练运用。不要一看就会,一试就废。做技术就要要扎实,拒绝当手残党!
- 积累解决实际问题的经验和技能。在以往的学习过程虽然也会接触到一些案例,但是大部分都是简化过的。通过接触实际案例的解决过程,来对自己学习到的知识进行系统化的整合,同时可以积累处理一般问题的套路。
- 和业内人士互相交流,学习,在提高!很多时候只有你自己对一个问题有过深入的思考,你才能明白别人到底在讲什么,同时也能通过别人的解题思路给自己启发,从别人身上看到自己的不足,扩大自己的边界。
在此,也非常推荐大家从阿里天池上面的比赛开始练手。上面的赛题都是来自于业界的真实场景,可以很好的作为作为实战的演练场。
本次的赛题以金融风控中的个人信贷为背景,目的是根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题。通过这个项目大家可以了解金融风控中的一些业务背景,并学到一些解决实际问题的技能。
由于这是一个完整的比赛项目,内容比较多。我会按照下面几个模块进行分期介绍:
1. 赛题理解部分:
主要是项目基本介绍和数据集情况预览。同时也明确赛题的评判指标。
2. 数据分析部分:
主要是了解数据,熟悉数据,为后续的特征工程做准备。同时在这一部分我们要着重理解变量间的相互关系、变量与预测值之间的存在关系,这些主要通过数据可视化等工具来完成。
3. 特征工程部分:
该部分是整个项目的核心部分。包括特征预处理、缺失值异常值处理、数据分桶、特征交互、特征编码等特征处理方法。
4. 建模与调参部分:
学习金融风控领域常用的机器学习模型,解各种模型以及模型的评价和调参策略。
5. 模型融合部分:
将之前建模调参的结果进行模型融合。 尝试多种融合方案,来提升成绩。
下面开始本期的内容,赛题理解部分。
该数据来自某信贷平台的贷款记录,总数据量超过120万条数据,每条数据包含47列变量信息(字段信息),其中15列为匿名变量。赛题将会从中抽取80万条作为训练集(train data),20万条作为测试集A(test A),20万条作为测试集B(test B),同时会对employmentTitle、purpose、postCode和title等信息进行脱敏。
1. 导入数据进行初步查看
import numpy as np
import pandas as pd
train = pd.read_csv('./train.csv')
test = pd.read_csv('./testA.csv')
print('train data shape is: ', train.shape)
print('test data shape is: ', test.shape)
>>> train data shape is: (800000, 47)
>>> test data shape is: (200000, 46)
多学一招:
当数据集比较大时,例如上面的测试集有80万条,训练集有20万条,如果读入比较慢,可以只读取一部分进行数据的初步分析。这个在read_csv函数中加入nrows参数即可,如下:
train = pd.read_csv('./train.csv',nrows = 10000)
train.shape
>>> (10000, 47)
2. 字段信息查看
print(train.columns)
>>>Index(['id', 'loanAmnt', 'term', 'interestRate', 'installment', 'grade',
'subGrade', 'employmentTitle', 'employmentLength', 'homeOwnership',
'annualIncome', 'verificationStatus', 'issueDate', 'isDefault',
'purpose', 'postCode', 'regionCode', 'dti', 'delinquency_2years',
'ficoRangeLow', 'ficoRangeHigh', 'openAcc', 'pubRec',
'pubRecBankruptcies', 'revolBal', 'revolUtil', 'totalAcc',
'initialListStatus', 'applicationType', 'earliesCreditLine', 'title',
'policyCode', 'n0', 'n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8',
'n9', 'n10', 'n11', 'n12', 'n13', 'n14'],
dtype='object')
各个字段的含义如下:
id 为贷款清单分配的唯一信用证标识
loanAmnt 贷款金额
term 贷款期限(year)
interestRate 贷款利率
installment 分期付款金额
grade 贷款等级
subGrade 贷款等级之子级
employmentTitle 就业职称
employmentLength 就业年限(年)
homeOwnership 借款人在登记时提供的房屋所有权状况
annualIncome 年收入
verificationStatus 验证状态
issueDate 贷款发放的月份
purpose 借款人在贷款申请时的贷款用途类别
postCode 借款人在贷款申请中提供的邮政编码的前3位数字
regionCode 地区编码
dti 债务收入比
delinquency_2years 借款人过去2年信用档案中逾期30天以上的违约事件数
ficoRangeLow 借款人在贷款发放时的fico所属的下限范围
ficoRangeHigh 借款人在贷款发放时的fico所属的上限范围
openAcc 借款人信用档案中未结信用额度的数量
pubRec 贬损公共记录的数量
pubRecBankruptcies 公开记录清除的数量
revolBal 信贷周转余额合计
revolUtil 循环额度利用率,或借款人使用的相对于所有可用循环信贷的信贷金额
totalAcc 借款人信用档案中当前的信用额度总数
initialListStatus 贷款的初始列表状态
applicationType 表明贷款是个人申请还是与两个共同借款人的联合申请
earliesCreditLine 借款人最早报告的信用额度开立的月份
title 借款人提供的贷款名称
policyCode 公开可用的策略代码=1新产品不公开可用的策略代码=2
n系列匿名特征 匿名特征n0-n14,为一些贷款人行为计数特征的处理
3. 缺省值查看
train.info()
>>><class 'pandas.core.frame.DataFrame'>
RangeIndex: 800000 entries, 0 to 799999
Data columns (total 47 columns):
id 800000 non-null int64
loanAmnt 800000 non-null float64
term 800000 non-null int64
interestRate 800000 non-null float64
installment 800000 non-null float64
grade 800000 non-null object
subGrade 800000 non-null object
employmentTitle 799999 non-null float64
employmentLength 753201 non-null object
homeOwnership 800000 non-null int64
annualIncome 800000 non-null float64
verificationStatus 800000 non-null int64
issueDate 800000 non-null object
isDefault 800000 non-null int64
purpose 800000 non-null int64
postCode 799999 non-null float64
regionCode 800000 non-null int64
dti 799761 non-null float64
delinquency_2years 800000 non-null float64
ficoRangeLow 800000 non-null float64
ficoRangeHigh 800000 non-null float64
openAcc 800000 non-null float64
pubRec 800000 non-null float64
pubRecBankruptcies 799595 non-null float64
revolBal 800000 non-null float64
revolUtil 799469 non-null float64
totalAcc 800000 non-null float64
initialListStatus 800000 non-null int64
applicationType 800000 non-null int64
earliesCreditLine 800000 non-null object
title 799999 non-null float64
policyCode 800000 non-null float64
n0 759730 non-null float64
n1 759730 non-null float64
n2 759730 non-null float64
n3 759730 non-null float64
n4 766761 non-null float64
n5 759730 non-null float64
n6 759730 non-null float64
n7 759730 non-null float64
n8 759729 non-null float64
n9 759730 non-null float64
n10 766761 non-null float64
n11 730248 non-null float64
n12 759730 non-null float64
n13 759730 non-null float64
n14 759730 non-null float64
dtypes: float64(33), int64(9), object(5)
memory usage: 286.9+ MB
可以看到employmentTitle、employmentLength、dti 以及匿名特征等字段存在缺省值,如何处理我们会在第3部分特征工程中具体讲解。
4. 赛题评价指标
本次竞赛采用AUC作为评价指标。那么问题来了,什么是AUC呢?AUC(Area Under Curve)被定义为 ROC曲线 下与坐标轴围成的面积。要理解AUC,必须先搞明白ROC。
让我们先从头说起。首先我们要明白AUC是一种用来度量分类模型好坏的一个标准。但其实这样的标准有很多,比如我们最常见的准确率等。那既然有了准确率这样容易理解又容易计算的指标,我们为什么还要发明其他的指标呢?这其实恰好反应了人们认识事物不断深入的一个过程。
一开始,机器学习等理论知识只出现在论文中,大家都用一个标准来评判模型的好坏——分类精度;近年来,随着机器学习的相关技术从实验室走向实际应用,一些实际的问题对度量标准提出了新的需求。特别的,现实中样本在不同类别上的不均衡分布(class distribution imbalance problem),使得分类精度这样的传统的度量标准不能恰当的反应分类器的“好坏”。
举个例子:假设一个100个待分类人群中有90个阴性和10个阳性病人。现在有一些分类器A、B对这个样本集进行分类。A分类器把这100个人全部当成了阴性,B分类器找出了10个阳性中的5个,剩下的95个全部当成了阴性。我们可以简单计算出A、B分类器的精度(Accury)都是90%。但是很明显,B分类器的performance要由于A。
另外,在一些分类问题中犯不同的错误代价是不同的(cost sensitive learning)。比如上面的例子中A分类器将阳性错分成阴性其后果要比阴性错分成阳性要高的多。
为了解决上述问题,人们从医疗分析领域引入了一种新的分类模型performance评判方法——ROC分析。
ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一个画在二维平面上的曲线——ROC curve。平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,此分类器就可以映射成ROC平面上的一个点。调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0, 0),(1, 1)的曲线,这就是此分类器的ROC曲线。如下图:
image.png
ROC曲线其实是多个混淆矩阵的结果组合。一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。因为(0, 0)和(1, 1)连线形成的ROC曲线实际上代表的是一个随机分类器。如果很不幸,你得到一个位于此直线下方的分类器的话,一个直观的补救办法就是把所有的预测结果反向,即:分类器输出结果为正类,则最终分类的结果为负类,反之,则为正类。虽然,用ROC curve来表示分类器的performance很直观好用。可是,人们总是希望能有一个数值来标志分类器的好坏。于是Area Under roc Curve(AUC)就出现了。顾名思义,AUC的值就是处于ROC curve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的performance。如下图:
image.png
1) AUC = 1,是完美分类器(上图中的左图),绝大多数预测的场合,不存在完美分类器。
2) 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值(上图中间的图)。
3)AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值(上图中的左图)。
4)AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
好了,本期内容结束。下一次我们开始具体的分析数据了。
网友评论