当前位置:   article > 正文

Kaggle竞赛介绍: Home Credit default risk(一)

home credit default risk

请点击上方“AI公园”,关注公众号


本文选自Kaggle

作者:Will Koehrsen

编译:ronghuaiyang

Kaggle的信用卡违约风险预测竞赛,非常有参考价值,做风控和大数据挖掘的同学可以参考一下,非常详细,非常适合入门,从数据处理到模型的构建,非常全面,文章比较长,分几次发出来,这是第一部分,主要讲数据的预处理。

这篇文章是为那些机器学习比赛的新人准备的。我故意的跳过了复杂的方法以及联合大量的数据,就是为了展示如何开始机器学习的基础。非常欢迎大家的评论和建议。

在本文中,我将大致介绍一下Kaggle正在举办的这个Home Credit default risk的机器学习竞赛。这个竞赛的目的是使用历史的贷款数据来预测申请者是否会还贷款。这是个标准的监督分类的任务。

  • 监督的:训练中是有标签数据的,目的是训练一个模型来预测特征对应的标签

  • 分类:标签是二值的,0表示会按时还款,1表示按时还款有困难

数据

数据由Home Credit提供,一个专门为没有银行卡的人群提供贷款的服务。预测一个客户是否有困难还款是个非常重要的商业需求,Home Credit举办这个竞赛就是为了看看在机器学习领域是否有好的方法可以帮助解决这个问题。

总共有7个不同的数据来源:

  • application_train/application_test: 申请数据集,最主要的训练和测试数据,里面包括每个贷款者的申请信息。每个贷款人就是一行,使用 SK_ID_CURR来唯一标识。训练数据的 TARGET ,0:贷款已还,1:贷款未还。

  • bureau:客户的来自其他金融机构的历史信用数据。每个历史信用数据在bureau中占据一行,但是application数据中的一个贷款数据可以有多条历史应用数据。

  • bureau_balance: 在bureau数据中的每个月的数据。每一行是一条历史信用的一个月的数据,单条历史信用可以有多行,每一行是一个月期间的信用。

  • previous_application:过去的申请贷款数据,每个application数据中的申请者可以有多个历史申请数据。每个历史申请数据占据一行,使用 SK_ID_PREV来唯一标识。

  • POS_CASH_BALANCE:客户已有的每个月的过去的销售额或者现金贷数据,每一行是一个月的过去的销售额或者现金贷数据,单个过去的贷款可以有许多行。

  • credit_card_balance:信用卡客户的过去的每个月的数据,每一行是一个月的信用卡数据,单个信用卡可以有很多行的数据。

  • installments_payment:以前贷款的付款记录。每笔付款都有一行,每笔未付款都有一行。

这个图显示了所有的数据的相关性:

640?wx_fmt=png

我们还提供了每一列的定义(在 HomeCredit_columns_description.csv)还有提交文件的样本文件。

本文中,我们会只使用主要的申请数据的训练和测试数据。如果我们想进行正在的比赛,我们需要使用所有的数据,目前我们只使用一个文件,这样更加容易管理。这个可以让我们建立一个基线然后我们可以提升。通过这个项目,最好一步一步的建立对这个问题的理解,而不是一下子全部栽倒数据里,把自己搞糊涂了。

度量: ROC AUC

一旦我们理解了数据(阅读 column descriptions 会很有帮助),我们需要了解我们的提交是如何评估的。在这个问题中,这是个普通的分类评估使用ROC AUC来进行评估。

ROC AUC 听起来挺吓人的,实际上就是真阳率和假阳率绘制的图形:

640?wx_fmt=png

图中的一条曲线就代表了一个模型,沿着曲线运动就表示设置不同的分类阈值,阈值最小是0,最大是1。曲线越凸表示模型越好,比如说蓝色线表示的模型就比红色线表示的模型好,黑色线表示的模型是一个随机猜测的模型。

AUC的意思就是曲线下的面积,就是指的ROC曲线下的面积,也是0到1之间的值,分数越高,模型越好。一个随机猜测的模型,ROC AUC为0.5。

当我们用ROC AUC来评估模型的时候,我们并不直接预测0或者1,而是预测一个概率,因为当我们的数据集是不均衡的时候,准确率并不能很好的衡量模型的好坏。比如我们要训练一个模型检测恐怖分子的准确率是99.9999%,那我只要将这个模型的输出全部变成不是恐怖分子就好了。很显然,这个模型是没用的(召回率是0),我们还可以使用更加高级一点的度量,如F1 score等,也可以反映分类器的好坏。一个具有高的ROC AUC的模型,同样也具有很高的F1 score的得分,但是ROC AUC是一个对于模型能力更好的表示方法。

了解了数据和评估方法后,我们就可以来处理数据了,之前我们说过,我们只会使用主要的申请数据,建立一个简单的模型。

导入工具包

我们会使用最常用的数据科学的工具: numpy, pandas, sklearn, matplotlib.

In [1]:

 
 

读数据

首先,我们列一下所有的数据文件。总共有9个文件:1个主要的训练文件(带target),1个主要的测试文件(没有target),1个样例提交文件,6个其他的补充信息数据文件。

In [2]:

 
 
 
 

In [3]:

 
 
 
 

Out[3]:


SK_ID_CURRTARGETNAME_CONTRACT_TYPECODE_GENDERFLAG_OWN_CARFLAG_OWN_REALTYCNT_CHILDRENAMT_INCOME_TOTALAMT_CREDITAMT_ANNUITYAMT_GOODS_PRICENAME_TYPE_SUITENAME_INCOME_TYPENAME_EDUCATION_TYPENAME_FAMILY_STATUSNAME_HOUSING_TYPEREGION_POPULATION_RELATIVEDAYS_BIRTHDAYS_EMPLOYEDDAYS_REGISTRATIONDAYS_ID_PUBLISHOWN_CAR_AGEFLAG_MOBILFLAG_EMP_PHONEFLAG_WORK_PHONEFLAG_CONT_MOBILEFLAG_PHONEFLAG_EMAILOCCUPATION_TYPECNT_FAM_MEMBERSREGION_RATING_CLIENTREGION_RATING_CLIENT_W_CITYWEEKDAY_APPR_PROCESS_STARTHOUR_APPR_PROCESS_STARTREG_REGION_NOT_LIVE_REGIONREG_REGION_NOT_WORK_REGIONLIVE_REGION_NOT_WORK_REGIONREG_CITY_NOT_LIVE_CITYREG_CITY_NOT_WORK_CITYLIVE_CITY_NOT_WORK_CITY...LIVINGAPARTMENTS_MEDILIVINGAREA_MEDINONLIVINGAPARTMENTS_MEDINONLIVINGAREA_MEDIFONDKAPREMONT_MODEHOUSETYPE_MODETOTALAREA_MODEWALLSMATERIAL_MODEEMERGENCYSTATE_MODEOBS_30_CNT_SOCIAL_CIRCLEDEF_30_CNT_SOCIAL_CIRCLEOBS_60_CNT_SOCIAL_CIRCLEDEF_60_CNT_SOCIAL_CIRCLEDAYS_LAST_PHONE_CHANGEFLAG_DOCUMENT_2FLAG_DOCUMENT_3FLAG_DOCUMENT_4FLAG_DOCUMENT_5FLAG_DOCUMENT_6FLAG_DOCUMENT_7FLAG_DOCUMENT_8FLAG_DOCUMENT_9FLAG_DOCUMENT_10FLAG_DOCUMENT_11FLAG_DOCUMENT_12FLAG_DOCUMENT_13FLAG_DOCUMENT_14FLAG_DOCUMENT_15FLAG_DOCUMENT_16FLAG_DOCUMENT_17FLAG_DOCUMENT_18FLAG_DOCUMENT_19FLAG_DOCUMENT_20FLAG_DOCUMENT_21AMT_REQ_CREDIT_BUREAU_HOURAMT_REQ_CREDIT_BUREAU_DAYAMT_REQ_CREDIT_BUREAU_WEEKAMT_REQ_CREDIT_BUREAU_MONAMT_REQ_CREDIT_BUREAU_QRTAMT_REQ_CREDIT_BUREAU_YEAR
01000021Cash loansMNY0202500.0406597.524700.5351000.0UnaccompaniedWorkingSecondary / secondary specialSingle / not marriedHouse / apartment0.018801-9461-637-3648.0-2120NaN110110Laborers1.022WEDNESDAY10000000...0.02050.01930.00000.00reg oper accountblock of flats0.0149Stone, brickNo2.02.02.02.0-1134.0010000000000000000000.00.00.00.00.01.0
11000030Cash loansFNN0270000.01293502.535698.51129500.0FamilyState servantHigher educationMarriedHouse / apartment0.003541-16765-1188-1186.0-291NaN110110Core staff2.011MONDAY11000000...0.07870.05580.00390.01reg oper accountblock of flats0.0714BlockNo1.00.01.00.0-828.0010000000000000000000.00.00.00.00.00.0
21000040Revolving loansMYY067500.0135000.06750.0135000.0UnaccompaniedWorkingSecondary / secondary specialSingle / not marriedHouse / apartment0.010032-19046-225-4260.0-253126.0111110Laborers1.022MONDAY9000000...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.00.00.00.0-815.0000000000000000000000.00.00.00.00.00.0
31000060Cash loansFNY0135000.0312682.529686.5297000.0UnaccompaniedWorkingSecondary / secondary specialCivil marriageHouse / apartment0.008019-19005-3039-9833.0-2437NaN110100Laborers2.022WEDNESDAY17000000...NaNNaNNaNNaNNaNNaNNaNNaNNaN2.00.02.00.0-617.001000000000000000000NaNNaNNaNNaNNaNNaN
41000070Cash loansMNY0121500.0513000.021865.5513000.0UnaccompaniedWorkingSecondary / secondary specialSingle / not marriedHouse / apartment0.028663-19932-3038-4311.0-3458NaN110100Core staff1.022THURSDAY11000011...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.00.00.00.0-1106.0000000100000000000000.00.00.00.00.00.0

训练数据有307511条,122个特征包括Target(我们需要预测的值)在内。

In [4]:

 
 
 
 

Out[4]:


SK_ID_CURRNAME_CONTRACT_TYPECODE_GENDERFLAG_OWN_CARFLAG_OWN_REALTYCNT_CHILDRENAMT_INCOME_TOTALAMT_CREDITAMT_ANNUITYAMT_GOODS_PRICENAME_TYPE_SUITENAME_INCOME_TYPENAME_EDUCATION_TYPENAME_FAMILY_STATUSNAME_HOUSING_TYPEREGION_POPULATION_RELATIVEDAYS_BIRTHDAYS_EMPLOYEDDAYS_REGISTRATIONDAYS_ID_PUBLISHOWN_CAR_AGEFLAG_MOBILFLAG_EMP_PHONEFLAG_WORK_PHONEFLAG_CONT_MOBILEFLAG_PHONEFLAG_EMAILOCCUPATION_TYPECNT_FAM_MEMBERSREGION_RATING_CLIENTREGION_RATING_CLIENT_W_CITYWEEKDAY_APPR_PROCESS_STARTHOUR_APPR_PROCESS_STARTREG_REGION_NOT_LIVE_REGIONREG_REGION_NOT_WORK_REGIONLIVE_REGION_NOT_WORK_REGIONREG_CITY_NOT_LIVE_CITYREG_CITY_NOT_WORK_CITYLIVE_CITY_NOT_WORK_CITYORGANIZATION_TYPE...LIVINGAPARTMENTS_MEDILIVINGAREA_MEDINONLIVINGAPARTMENTS_MEDINONLIVINGAREA_MEDIFONDKAPREMONT_MODEHOUSETYPE_MODETOTALAREA_MODEWALLSMATERIAL_MODEEMERGENCYSTATE_MODEOBS_30_CNT_SOCIAL_CIRCLEDEF_30_CNT_SOCIAL_CIRCLEOBS_60_CNT_SOCIAL_CIRCLEDEF_60_CNT_SOCIAL_CIRCLEDAYS_LAST_PHONE_CHANGEFLAG_DOCUMENT_2FLAG_DOCUMENT_3FLAG_DOCUMENT_4FLAG_DOCUMENT_5FLAG_DOCUMENT_6FLAG_DOCUMENT_7FLAG_DOCUMENT_8FLAG_DOCUMENT_9FLAG_DOCUMENT_10FLAG_DOCUMENT_11FLAG_DOCUMENT_12FLAG_DOCUMENT_13FLAG_DOCUMENT_14FLAG_DOCUMENT_15FLAG_DOCUMENT_16FLAG_DOCUMENT_17FLAG_DOCUMENT_18FLAG_DOCUMENT_19FLAG_DOCUMENT_20FLAG_DOCUMENT_21AMT_REQ_CREDIT_BUREAU_HOURAMT_REQ_CREDIT_BUREAU_DAYAMT_REQ_CREDIT_BUREAU_WEEKAMT_REQ_CREDIT_BUREAU_MONAMT_REQ_CREDIT_BUREAU_QRTAMT_REQ_CREDIT_BUREAU_YEAR
0100001Cash loansFNY0135000.0568800.020560.5450000.0UnaccompaniedWorkingHigher educationMarriedHouse / apartment0.018850-19241-2329-5170.0-812NaN110101NaN2.022TUESDAY18000000Kindergarten...NaN0.0514NaNNaNNaNblock of flats0.0392Stone, brickNo0.00.00.00.0-1740.0010000000000000000000.00.00.00.00.00.0
1100005Cash loansMNY099000.0222768.017370.0180000.0UnaccompaniedWorkingSecondary / secondary specialMarriedHouse / apartment0.035792-18064-4469-9118.0-1623NaN110100Low-skill Laborers2.022FRIDAY9000000Self-employed...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.00.00.00.00.0010000000000000000000.00.00.00.00.03.0
2100013Cash loansMYY0202500.0663264.069777.0630000.0NaNWorkingHigher educationMarriedHouse / apartment0.019101-20038-4458-2175.0-35035.0110100Drivers2.022MONDAY14000000Transport: type 3...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.00.00.00.0-856.0000000100000000000000.00.00.00.01.04.0
3100028Cash loansFNY2315000.01575000.049018.51575000.0UnaccompaniedWorkingSecondary / secondary specialMarriedHouse / apartment0.026392-13976-1866-2000.0-4208NaN110110Sales staff4.022WEDNESDAY11000000Business Entity Type 3...0.24460.37390.03880.0817reg oper accountblock of flats0.3700PanelNo0.00.00.00.0-1805.0010000000000000000000.00.00.00.00.03.0
4100038Cash loansMYN1180000.0625500.032067.0625500.0UnaccompaniedWorkingSecondary / secondary specialMarriedHouse / apartment0.010032-13040-2191-4000.0-426216.0111100NaN3.022FRIDAY5000011Business Entity Type 3...NaNNaNNaNNaNNaNNaNNaNNaNNaN0.00.00.00.0-821.001000000000000000000NaNNaNNaNNaNNaNNaN

测试数据集没有Target列,而且小很多。

探索性数据分析

Exploratory Data Analysis (EDA)是一个开放的过程,我们计算统计值,让数字找到趋势,异常值,模式以及相互关系。EDA的目的学到数据可以告诉我们的东西。通常从一个高度的概述开始,然后深入到特定的领域。会发现许多有趣的东西,可以用来指导我们的模型选择,比如帮助我们决定哪些特征可以用。

检查目标列的分布

我们需要预测的目标:要不就是0,按时还款,要不就是1,没有按时还款。我们首先检查一下每个类别的数量。

In [5]:

 
 

Out[5]:

 
 

In [6]:

 
 

640?wx_fmt=png

从这个信息中,我们可以看到一个类别不均衡的问题。按时还款的记录比不按时还款的记录要多得多。一旦我们使用了更多的复杂的模型,我们可以为类别设置权值来反映数据的不均衡性。

检查缺失值

接下来我们看下每一列的缺失值的比例。

In [7]:

 
 

In [8]:

 
 
 
 

Out[8]:


Missing Values% of Total Values
COMMONAREA_MEDI21486569.9
COMMONAREA_AVG21486569.9
COMMONAREA_MODE21486569.9
NONLIVINGAPARTMENTS_MEDI21351469.4
NONLIVINGAPARTMENTS_MODE21351469.4
NONLIVINGAPARTMENTS_AVG21351469.4
FONDKAPREMONT_MODE21029568.4
LIVINGAPARTMENTS_MODE21019968.4
LIVINGAPARTMENTS_MEDI21019968.4
LIVINGAPARTMENTS_AVG21019968.4
FLOORSMIN_MODE20864267.8
FLOORSMIN_MEDI20864267.8
FLOORSMIN_AVG20864267.8
YEARS_BUILD_MODE20448866.5
YEARS_BUILD_MEDI20448866.5
YEARS_BUILD_AVG20448866.5
OWN_CAR_AGE20292966.0
LANDAREA_AVG18259059.4
LANDAREA_MEDI18259059.4
LANDAREA_MODE18259059.4

当开始搭建我们的机器学习模型时,我们需要把这些缺失值填上。后面的工作中,我们会使用如XGBoost的方法,可以处理缺失值,不需要插补。另一个选择就是把缺失比列过高的列丢掉,但是由于无法事先知道这些列是否对我们的模型有帮助,我们先还是留着这些列。

列的类型

我们再看一下数字列的类型。 int64float64 是数字变量(可以连续也可以离散),object列包括了字符串和分类的特征。

In [9]:

 
 

Out[9]:

 
 

我们再看下每个object列的不同的值的个数。

In [10]:

 
 

Out[10]:

 
 

大部分的类别中不同的类别数一般都是比较小的,我们需要找个方法来处理这些类别变量。

编码类别变量

在我们更进一步之前,我们需要搞定麻烦的类别变量。机器学习模型是处理不了类别变量的(除了某些像LightGBM之类的模型外)。所以,我们需要找个办法将这些变量编码成数字。有两个主要的方法来处理:

  • 标签编码: 把每个类别中不同的类型赋值成一个整数。不需要生成新的列,下面是个简单的例子:

640?wx_fmt=png

  • 独热编码: 为每个类别中的单独的类型都新建一列,其中个,对应的类型为值1,其余的类型值为0。

640?wx_fmt=png

标签编码的问题是这给了不同的类别一个任意的顺序。每个类别的值是随机的,而且和类别本身没有任何的关系。上面的例子中,programer的值是4,data scientist的值是1,如果再进行一次这个操作,标签就可能变得不一样了。赋值的数字是随意的。但是,当我们使用了标签编码后,模型可能会使用这个数字作为类别的权重,这是我们不希望看到的。如果我们只有两个不同的种类,标签编码是ok的(比如男/女),大于两个类别时,独热编码比较好。

对于处理类别标签编码有各种的讨论,我认为使用独热编码是比较安全的,唯一的问题是,当类别很多的时候容易造成维度的爆炸。为了解决这个问题,我们可以在独热编码之后再做个PCA用来降维。

在本文中,我们对只有两个类别的种类使用标签编码,大于两个类别的使用独热编码。这个策略之后可能会改,但是目前我们还是先这样做,看看效果怎么样。

标签编码和独热编码

我们来实现以下上面的策略。对于标签编码,我们使用Scikit-Learn LabelEncoder ,对于独热编码使用pandas get_dummies(df)函数。

In [11]:

 
 
 
 

In [12]:

 
 
 
 

对齐训练和测试数据

我们需要训练数据的特征数和测试数据是一样的。使用独热编码,会产生新的列,有些列只在训练数据中出现,而没有在测试数据中出现。为了将这些列从训练数据中移除,我们需要对dataframe进行对齐。首先我们提取训练数据中的target列(这个列在测试集中是没有的)。但我们做对齐的时候,我们需要设置 axis = 1 ,这样就可以对列进行对齐,而不是行。

In [13]:

 
 

这样,训练数据和测试数据都具有了相同的维度。进行了独热编码之后,维度大大的增加了。有些时候我们需要进行降维(去掉一些不相干的维度)来减小数据集的大小。

(未完待续)


本文可以任意转载,转载时请注明作者及原文地址。


640?wx_fmt=jpeg

请长按或扫描二维码关注我们


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/870599
推荐阅读
  

闽ICP备14008679号