零基础入门金融风控-贷款违约预测-1

子曰:工欲善其事必先利其器。要成为一名优秀的数据分析师或者算法工程师就必须要熟练掌握python中的几个分析利器如pandas,sklearn等。之前我们学习那么多技术,是时候找个练兵场把学到的东西拿出来练练手了,看看自己到底几斤几两。基于此,从本期开始我们来尝试着完成一个完整的比赛项目。
参加比赛好处多多:

  1. 检验自己到学到东西的掌握程度同时可以查缺补漏,考察是否可以熟练运用。不要一看就会,一试就废。做技术就要要扎实,拒绝当手残党!
  2. 积累解决实际问题的经验和技能。在以往的学习过程虽然也会接触到一些案例,但是大部分都是简化过的。通过接触实际案例的解决过程,来对自己学习到的知识进行系统化的整合,同时可以积累处理一般问题的套路。
  3. 和业内人士互相交流,学习,在提高!很多时候只有你自己对一个问题有过深入的思考,你才能明白别人到底在讲什么,同时也能通过别人的解题思路给自己启发,从别人身上看到自己的不足,扩大自己的边界。

在此,也非常推荐大家从阿里天池上面的比赛开始练手。上面的赛题都是来自于业界的真实场景,可以很好的作为作为实战的演练场。

本次的赛题以金融风控中的个人信贷为背景,目的是根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题。通过这个项目大家可以了解金融风控中的一些业务背景,并学到一些解决实际问题的技能。

由于这是一个完整的比赛项目,内容比较多。我会按照下面几个模块进行分期介绍:

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,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

好了,本期内容结束。下一次我们开始具体的分析数据了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352