美文网首页
零基础入门金融风控-贷款违约预测-1

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

作者: 木头里有虫911 | 来源:发表于2020-09-15 20:57 被阅读0次

    子曰:工欲善其事必先利其器。要成为一名优秀的数据分析师或者算法工程师就必须要熟练掌握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,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

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

    相关文章

      网友评论

          本文标题:零基础入门金融风控-贷款违约预测-1

          本文链接:https://www.haomeiwen.com/subject/tjkfyktx.html