信贷违约风险预测(二)简单的数据探索 – 机器会学习的博客

By sayhello 2019年2月13日

版权预告:定冠词是视频博客作者的原型文字。,还缺乏博主答应,不得武断地转载。。

  消息曾经短文绍介过。,客户的违约风险的预测是一个人监视念书的布道所,它次要是对买东西的人停止花色品种。,谁能接待存款?,哪个不克不及?,每个请求者可能性违约的概率在0~1当中。,0、使知晓请求者可以即时还债存款。,1:请求者将难以正点还债,将违约。

消息初探

鉴于普通的的消息 Credit
有8种差数的消息。:

  • bureau.csv
  • bureau_balance.csv
  • previous_application.csv
  • POS_CASH_BALANCE.csv
  • credit_card_balance.csv
  • installments_payment.scv

运用的Python库:numpy,pandas,sklearn, matplotlib

import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings(疏忽)
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

Training data

train_data = (''data/'')
print("范本总计:",[0])
print(特点量(包罗致力于[副标志]):,[1])
范本总计: 307511

特点量(包罗致力于[副标志] 122
train_data.head()
 

SK_ID_CURR TARGET NAME_CONTRACT_TYPE CODE_GENDER FLAG_OWN_CAR FLAG_OWN_REALTY CNT_CHILDREN AMT_INCOME_TOTAL AMT_CREDIT AMT_ANNUITY FLAG_DOCUMENT_18 FLAG_DOCUMENT_19 FLAG_DOCUMENT_20 FLAG_DOCUMENT_21 AMT_REQ_CREDIT_BUREAU_HOUR AMT_REQ_CREDIT_BUREAU_DAY AMT_REQ_CREDIT_BUREAU_WEEK AMT_REQ_CREDIT_BUREAU_MON AMT_REQ_CREDIT_BUREAU_QRT AMT_REQ_CREDIT_BUREAU_YEAR
0 100002 1 Cash loans M N Y 0 202500.0 406597.5 2470 0 0 0 0 0.0 0.0 0.0 0.0 0.0 1.0
1 100003 0 Cash loans F N N 0 270000.0 129350 35698.5 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0
2 100004 0 Revolving loans M Y Y 0 67500.0 135000.0 6750.0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0
3 100006 0 Cash loans F N Y 0 135000.0 31268 29686.5 0 0 0 0 NaN NaN NaN NaN NaN NaN
4 100007 0 Cash loans M N Y 0 121500.0 513000.0 21865.5 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0

5 rows × 122 columns

Test data 条款(无以雕刻装饰)

test_data = (''data/'')
print(受测验范本数:",[0])
print(受测验战利品特点(不包罗致力于):",[1])

受测验范本上胶料: 48744
受测验战利品特点(不包罗致力于): 121

test_data.head()

消息文件 thead 独生子女 th {
text-align: right;
}

消息文件 thead th {
text-align: left;
}

消息文件 tbody tr th {
vertical-align: top;
}

SK_ID_CURR NAME_CONTRACT_TYPE CODE_GENDER FLAG_OWN_CAR FLAG_OWN_REALTY CNT_CHILDREN AMT_INCOME_TOTAL AMT_CREDIT AMT_ANNUITY AMT_GOODS_PRICE FLAG_DOCUMENT_18 FLAG_DOCUMENT_19 FLAG_DOCUMENT_20 FLAG_DOCUMENT_21 AMT_REQ_CREDIT_BUREAU_HOUR AMT_REQ_CREDIT_BUREAU_DAY AMT_REQ_CREDIT_BUREAU_WEEK AMT_REQ_CREDIT_BUREAU_MON AMT_REQ_CREDIT_BUREAU_QRT AMT_REQ_CREDIT_BUREAU_YEAR
0 100001 Cash loans F N Y 0 135000.0 568800.0 2056 450000.0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0
1 100005 Cash loans M N Y 0 99000.0 222768.0 17370.0 180000.0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 3.0
2 100013 Cash loans M Y Y 0 202500.0 663264.0 69777.0 630000.0 0 0 0 0 0.0 0.0 0.0 0.0 1.0 4.0
3 100028 Cash loans F N Y 2 315000.0 1575000.0 49018.5 1575000.0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 3.0
4 100038 Cash loans M Y N 1 180000.0 625500.0 32067.0 625500.0 0 0 0 0 NaN NaN NaN NaN NaN NaN

5 rows × 121 columns

Distribution of the TARGET


train_data[目标].value_counts()
0    282686
1     24825
Name: TARGET, D型 int64
train_data[目标].astype(int).()

这里写图片描述

在锻炼中 data中,这可能性是1/10个可以正点支出的。,一个人类型的类失衡成绩。
处置仁慈的失衡成绩的瘸的有三种。:

  • 采样是反向移动过度的范本停止的。,会错过很多消息。
  • 对大批范本停止过采样。
  • 经过实践察看消息的概率,类加重于是用来克复缺乏平衡狂暴的数量。

Examine Missing Value

count_miss_val = ().sum()

(10)
SK_ID_CURR             0
TARGET                 0
NAME_CONTRACT_TYPE     0
CODE_GENDER            0
FLAG_OWN_CAR           0
FLAG_OWN_REALTY        0
CNT_CHILDREN           0
AMT_INCOME_TOTAL       0
AMT_CREDIT             0
AMT_ANNUITY           12
D型 int64
miss_val_percent = 100 * count_miss_val / [0]

(10)
SK_ID_CURR            0.000000
TARGET                0.000000
NAME_CONTRACT_TYPE    0.000000
CODE_GENDER           0.000000
FLAG_OWN_CAR          0.000000
FLAG_OWN_REALTY       0.000000
CNT_CHILDREN          0.000000
AMT_INCOME_TOTAL      0.000000
AMT_CREDIT            0.000000
AMT_ANNUITY           0.003902
D型 float64

miss_val_table = pd.concat([count_miss_val,
                 miss_val_percent], axis = 1)

new_miss_val_table = (列) = {0:"Count",
                          1:"% Percent"})
(10)
Count % Percent
SK_ID_CURR 0 0.000000
TARGET 0 0.000000
NAME_CONTRACT_TYPE 0 0.000000
CODE_GENDER 0 0.000000
FLAG_OWN_CAR 0 0.000000
FLAG_OWN_REALTY 0 0.000000
CNT_CHILDREN 0 0.000000
AMT_INCOME_TOTAL 0 0.000000
AMT_CREDIT 0 0.000000
AMT_ANNUITY 12 0.003902

new_miss_val_table = new_miss_val_table[[:,1] != 0].sort_values(
    "% Percent", ascending = False).round(1)
(20)
 

Count % Percent
COMMONAREA_MEDI 214865 69.9
COMMONAREA_AVG 214865 69.9
COMMONAREA_MODE 214865 69.9
NONLIVINGAPARTMENTS_MEDI 213514 69.4
NONLIVINGAPARTMENTS_MODE 213514 69.4
NONLIVINGAPARTMENTS_AVG 213514 69.4
FONDKAPREMONT_MODE 210295 68.4
LIVINGAPARTMENTS_MODE 210199 68.4
LIVINGAPARTMENTS_MEDI 210199 68.4
LIVINGAPARTMENTS_AVG 210199 68.4
FLOORSMIN_MODE 208642 67.8
FLOORSMIN_MEDI 208642 67.8
FLOORSMIN_AVG 208642 67.8
YEARS_BUILD_MODE 204488 66.5
YEARS_BUILD_MEDI 204488 66.5
YEARS_BUILD_AVG 204488 66.5
OWN_CAR_AGE 202929 66.0
LANDAREA_AVG 182590 59.4
LANDAREA_MEDI 182590 59.4
LANDAREA_MODE 182590 59.4

消息摸索阶段仍在停止中。,不要率先处置不足额值。,但在使成为机具念书典范时,,反向移动差数的算法咱们可能性要处置这些不足额值,停止填空.假如算法对不足额值不敏感也可以不必处置.或许径直使屈从不足额面积较高的特点,但终于做可能性会摈弃最起作用的特点。,指前面提到的事物人戒除,控制所非常特点。

Examine features type

反省每个列的消息类型是延续的不狂暴的团圆的。,情人:包括特点和特点串。

()
float64    65
int64      41
object     16
D型 int64

train_data.select_dtypes(include = [情人]).apply(pd.Series.nunique, axis = 0)
NAME_CONTRACT_TYPE             2
CODE_GENDER                    3
FLAG_OWN_CAR                   2
FLAG_OWN_REALTY                2
NAME_TYPE_SUITE                7
NAME_INCOME_TYPE               8
NAME_EDUCATION_TYPE            5
NAME_FAMILY_STATUS             6
NAME_HOUSING_TYPE              6
OCCUPATION_TYPE               18
WEEKDAY_APPR_PROCESS_START     7
ORGANIZATION_TYPE             58
FONDKAPREMONT_MODE             4
HOUSETYPE_MODE                 3
WALLSMATERIAL_MODE             7
EMERGENCYSTATE_MODE            2
D型 int64

  许多的典范(而且LITGBM)不径直运用这些特点变量。,终于,咱们需求重行计算变量。有两种经用的办法。:
– label 编码:表现一个人概数中每个属性的特点值。
这里写图片描述
– One-hot 编码:每个类特点用用无线电引导表现。
这里写图片描述
虽然助动词=have这两种编码办法,有点提议,label encodeing 是毫不迟疑分理性的每个类的概数值。,当典范运用这些消息时,,可能性会有调停。,鉴于这些值可能性无法复制这些特点值的固有加重于。,可能性还远缺乏如此的。,单独地两类特点值。,劝告副标志 encodeing,没完没了两个类别运用One HythHead,但一个人叫座法典。,也有缺陷。,当特点值仁慈的较多时,这将事业消息维度的急剧攀登。,可以运用PCA或宁静降维技术来紧缩

Label, One-hoe encodeing

运用一个人热编码,特点值的类别大于2。,2种运用副标志编码。


le = LabelEncoder()
count = 0for col in train_data:
    if 锻炼消息[科尔] == 情人:
        if len(list(train_data[col].unique())) <=2:
            (train_data[col])
            train_data[col] = (train_data[col])
            test_data[col] = (test_data[col])
            count = count + 1
print("%d 列特点是副标志编码。伯爵)
3 列特点是副标志编码。

train_data = (train_data)
test_data = (test_data)
print(耕作判情境:%d,特点量(包罗致力于):%d"%([0],[1]))
print(受测验用情境:%d,特点量(不包罗致力于):%d"%([0],[1]))
耕作判情境:307511,特点量(包罗致力于):243
受测验用情境:48744,特点量(不包罗致力于):239

  锻炼和受测验用例的特点列差数,这是鉴于相当特点列的相当花色品种所做的证据。,为了自动记载器消息,这些特点列被期望从锻炼消息中使死亡。

train_labels = train_data[目标]

train_data, test_data = (test_data, join = , axis = 1)

train_data[目标] = train_labels
print(耕作判情境:%d,特点量(包罗致力于):%d"%([0],[1]))
print(受测验用情境:%d,特点量(不包罗致力于):%d"%([0],[1]))
耕作判情境:307511,特点量(包罗致力于):240
受测验用情境:48744,特点量(不包罗致力于):239

如今锻炼,受测验消息共享协同特点。,接下来,更多摸索消息。

Anomalies Data Analysis

  消息探查术做事方法中需求注意到的另一个人成绩。,这执意消息做成某事失常气象。,无规律可能性鉴于人工控制或策略毛病。,它也可能性是正交的的。,但它代表了一个人不寻常的顶点情境,这可能性会事业成绩。,终于,在锻炼前应制服这些非常消息。


(train_data[''DAYS_BIRTH'']/ -365).describe()
count    307511.000000
mean         43.936973
std          11.956133
min          217808
25%          34.008219
50%          43.150685
75%          53.923288
max          69.120548
Name: DAYS_BIRTH, D型 float64

(train_data[''DAYS_EMPLOYED''] / -365).describe()
count    307511.000000
mean       -174.835742
std         387.056895
min       -10065753
25%           0.791781
50%           3.323288
75%           7.561644
max          49.073973
Name: DAYS_EMPLOYED, D型 float64

任务时期如同有些不正交的。,1000到何种地步任务?


(train_data[''DAYS_EMPLOYED'']/-365(第三档) = 年 Employed 柱状图)
(年_失业)
Text(,年_失业)

这里写图片描述


train_data[''DAYS_EMPLOYED''].value_counts().head()
 365243    55374
-200         156
-224         152
-199         151
-230         151
Name: DAYS_EMPLOYED, D型 int64

anom = train_data[train_data[''DAYS_EMPLOYED''] == 365243]
non_anom = train_data[train_data[''DAYS_EMPLOYED''] != 365243]
print(正交的战利品不克不及正点报酬的客户面积:%.2f%%''%(100 * non_anom[目标].mean()))
print(非常战利品不克不及正点报酬的客户面积:%.2f%%''%(100 * anom[目标].mean()))
print(任务时期非常运用次数:%d''莱恩(阿诺姆)
正交的战利品不克不及正点还债的客户面积:
非常战利品不克不及正点报酬的客户面积:
任务时期非常运用次数:55374

非常范本的弃权率比正交的值低约3%。,到何种地步处置非常?
最简略最粗犷的办法是,径直错过,虽然有不计其数的范本要高处。,单身点置换,和添加一个人新的列。,在锻炼消息中邮票这些非常范本。


train_data[''DAYS_EMPOLYED_ANOM''] = train_data[''DAYS_EMPLOYED''] == 365243
train_data[''DAYS_EMPLOYED''].replace({365243:}, inplace = True)
(train_data[''DAYS_EMPLOYED'']/-365(第三档) = 年 Employment 柱状图)
(年 失业)
Text(,年 失业)

这里写图片描述

 任务时期的散布如同契合要求的估量。,非常交换,添加了特点邮票消息做成某事新非常。其次,在单身点,始终控制消息自动记载器。

test_data[''DAYS_EMPLOYED_ANOM''] = test_data[''DAYS_EMPLOYED''] == 365243
test_data[''DAYS_EMPLOYED''].replace({365243: }, inplace = True)
print(受测验消息中任务时期非常范本数:%d''%test_data[''DAYS_EMPLOYED_ANOM''].sum())
受测验消息中任务时期非常范本数:9274

(test_data[''DAYS_EMPLOYED'']/ -365(第三档) = 年 Employment 柱状图)
(年 失业)
Text(,年 失业)

这里写图片描述

Correlations Analysis

  相互相干性辨析,次要致力于是找出特点变量与TA当做成某事相互相干性。,扶助咱们查明消息当做成某事潜在触感。

  • “very weak”
  • “weak”
  • “moderate”
  • “strong”
  • “very strong”

correlations = ()[目标].sort_values()
print(最强相互相干性的10个特点:\n'',(10))
print(最弱相互相干的10个特点:\n'',(10))
最强相互相干性的10个特点:
DAYS_ID_PUBLISH                0.051457
CODE_GENDER_M                  0.054713
DAYS_LAST_PHONE_CHANGE         0.055218
NAME_INCOME_TYPE_Working       0.057481
REGION_RATING_CLIENT           0.058899
REGION_RATING_CLIENT_W_CITY    0.060893
DAYS_EMPLOYED                  0.074958
DAYS_BIRTH                     0.078239
TARGET                         1.000000
DAYS_EMPOLYED_ANOM                  NaN
Name: TARGET, D型 float64
最弱相互相干的10个特点:
EXT_SOURCE_3                           -0.178919
EXT_SOURCE_2                           -0.160472
EXT_SOURCE_1                           -0.155317
NAME_EDUCATION_TYPE_Higher education   -0.056593
CODE_GENDER_F                          -0.054704
NAME_INCOME_TYPE_Pensioner             -6209
ORGANIZATION_TYPE_XNA                  -5987
FLOORSMAX_AVG                          -4003
FLOORSMAX_MEDI                         -3768
FLOORSMAX_MODE                         -3226
Name: TARGET, D型 float64

与靶相互相干性最强的是尼桑。,出生时期:记载买东西的人在推荐前的年岁(天)。,正数记载,面值越小。,你年岁越大。

Effect of Age on Repayment

更多摸索以下,客户年岁对还款压力的有影响的人


train_data[''DAYS_BIRTH''] = abs(train_data[''DAYS_BIRTH''])
train_data[''DAYS_BIRTH''].corr(train_data[目标])

(train_data[''DAYS_BIRTH'']/365).corr(train_data[目标])

原始正相互相干相干呈负相互相干。,年岁单位替换为年,相互相干系数很小。
年岁散布经过柱状图停止概观。,天数变为年份。


(train_data[''DAYS_BIRTH''] / 365, edgecolor = ''k'', bins = 25)
(年岁 of 客户机)
(年岁 (年))
(伯爵)
译本(0),,伯爵)

 这里写图片描述

年岁散布无猛烈地非常。,上面是本致力于值的内核。 density 估量(KDE)核的密度估量,KDE方镞箭参数估量。,不要添加无论什么先验知。,它是本消息其的特点。、属性以合适的散布。

核密度估量


(figsize = (10, 6))

([train_data[目标] == 0, ''DAYS_BIRTH'']/365, label = 絮絮叨叨地说 = 0'')

([train_data[目标] == 1, ''DAYS_BIRTH'']/365, label = 絮絮叨叨地说 = 1'')
(年岁 (年))
(0, )
(密度)
(KDE Distribution of 年头)
Text(,1,KDE Distribution of 年头)

 这里写图片描述

上图,咱们可以明确的地通知稍许的情境。:

  • target = 0,蓝色的够支付,代表时期支出的客户年岁在30-60岁当中。,打算年岁高。
  • target = 1,白色的够支付,代表手头没货客户,30后,随年岁增长,Windows 默认值在减小。

差数年岁的年岁计算,违约的面积。

age_data = train_data[[目标, ''DAYS_BIRTH'']]
age_data[''YEARS_BIRTH''] = age_data[''DAYS_BIRTH''] / 365
age_data[''YEARS_BINNED''] = (age_data[''YEARS_BIRTH''], bins = (20, 70,num = 11))
(10)
 

TARGET DAYS_BIRTH YEARS_BIRTH YEARS_BINNED
0 1 9461 25.920548 (25.0, 30.0]
1 0 16765 45.931507 (45.0, 50.0]
2 0 19046 52.180822 (50.0, 55.0]
3 0 19005 52.068493 (50.0, 55.0]
4 0 19932 54.608219 (50.0, 55.0]
5 0 16941 46.413699 (45.0, 50.0]
6 0 13778 37.747945 (35.0, 40.0]
7 0 18850 51.643836 (50.0, 55.0]
8 0 20099 55.065753 (55.0, 60.0]
9 0 14469 39.641096 (35.0, 40.0]

age_groups = (''YEARS_BINNED'').mean()
age_groups
 

TARGET DAYS_BIRTH YEARS_BIRTH
YEARS_BINNED
(20.0, 25.0] 0.123036 8532.795625 23.377522
(25.0, 30.0] 0.111436 10155.219250 27.822518
(30.0, 35.0] 0.102814 11854.848377 32.479037
(35.0, 40.0] 0.089414 13707.908253 37.555913
(40.0, 45.0] 0.078491 15497.661233 42.459346
(45.0, 50.0] 0.074171 17323.900441 47.462741
(50.0, 55.0] 0.066968 19196.494791 593136
(55.0, 60.0] 0.055314 20984.262742 57.491131
(60.0, 65.0] 0.052737 227847460 62.412459
(65.0, 70.0] 0.037270 24292.614340 66.555108
(figsize = (10,4))
((STR)), 100 * age_groups[目标])
(旋转) = 45)
(年岁 Group (年))
(衰退 to 酬报(%))
(衰退 to Repay by Age 归类)
Text(,1,衰退 to Repay by Age 归类)

 这里写图片描述

 很猛烈地,违约率高级的的是(20)。, 25)当中,以后跟随年岁增长客户正点还款的主动精神越来越强了.这是一个人很起作用的交流.

Exterior Source

致力于的三个特点与内涵最负相互相干,EXT_SOURCE_2,ExtXEXCELSTY3。这些消息鉴于表面消息的使标准化分。,Home 信誉并缺乏称呼委任消息的详细含意。


ext_data = train_data[[目标, ''EXT_SOURCE_1'', ''EXT_SOURCE_2'', ''EXT_SOURCE_3'', ''DAYS_BIRTH'']]
ext_data_corrs = ()
print(ext_data_corrs)
                TARGET  EXT_SOURCE_1  EXT_SOURCE_2  EXT_SOURCE_3  DAYS_BIRTH
TARGET        1.000000     -0.155317     -0.160472     -0.178919   -0.078239
EXT_SOURCE_1 -0.155317      1.000000      0.213982      0.186846    00610
EXT_SOURCE_2 -0.160472      0.213982      1.000000      0.109167    0.091996
EXT_SOURCE_3 -0.178919      0.186846      0.109167      1.000000    0.205478
DAYS_BIRTH   -0.078239      00610      0.091996      0.205478    1.000000
(figsize = (7,7))
(ext_data_corrs, cmap = plt.cm.RdYlBu_r, vmin = 0.25, annot = True, vmax = )
(相互相干 热图)
Text(,1,相互相干 热图)

这里写图片描述

EXT_SOURCE,KDE,核密度估量

()
 

TARGET EXT_SOURCE_1 EXT_SOURCE_2 EXT_SOURCE_3 DAYS_BIRTH
0 1 0.083037 0.262949 0.139376 9461
1 0 0.311267 22246 NaN 16765
2 0 NaN 55912 0.729567 19046
3 0 NaN 50442 NaN 19005
4 0 NaN 0.322738 NaN 19932
(figsize = (10, 15))
for i, col_name in enumerate([''EXT_SOURCE_1'',''EXT_SOURCE_2'',''EXT_SOURCE_3'']):
    (3, 1, i+1)
    
    ([ext_data[目标] == 0, col_name], label = 絮絮叨叨地说 = 0'')
    
    ([ext_data[目标] == 1, col_name], label = 絮絮叨叨地说 = 1'')
    (KDE Distribution of %s by 絮絮叨叨地说% col_name)
    (''%s'' % col_name)
    (密度)
    (0, 3)

(h_pad = )

这里写图片描述

ExtS源表面使标准化评分,详细含意不明。,但已往相互相干系数矩阵,ExtSouthSouth1和DaysSyBiSH当做成某事相互相干系数,终于KDE够支付也有类似的的旨趣。,违约的情境跟随EXT_SOURCE_1的高处在渐减.

Pairs Plot

为了更多根究磷的散布当做成某事相干,经过塞浦路斯做准备的帕里斯图使成为巴黎 Plot,

(3)
TARGET EXT_SOURCE_1 EXT_SOURCE_2 EXT_SOURCE_3 DAYS_BIRTH
0 1 0.083037 0.262949 0.139376 9461
1 0 0.311267 22246 NaN 16765
2 0 NaN 55912 0.729567 19046
(3)
TARGET DAYS_BIRTH YEARS_BIRTH YEARS_BINNED
0 1 9461 25.920548 (25.0, 30.0]
1 0 16765 45.931507 (45.0, 50.0]
2 0 19046 52.180822 (50.0, 55.0]
plot_data = ([''DAYS_BIRTH''], axis = 1).copy()
plot_data[''YEAR_BIRTH''] = age_data[''YEARS_BIRTH'']

plot_data = ().loc[:10000,:]


grid = (消息) = plot_data, size = 3,diag_sharey = False,
                    hue = 目标,
                    vars = [x for x in list() if x != 目标])

()
()
(, cmap = plt.cm.OrRd_r)

(''EXT_SOURCE and Age Pairs 密谋, size = 32, y = )
Text(,,''EXT_SOURCE and Age Pairs 密谋)

这里写图片描述

  白色是指违背和约。,蓝色说明正点还款。,YEAR_BIRTH和EXT_SOURCE_1当中有很强的正相互相干.为了使标准化分可能性跟客户的年岁参与.
消息是易于摸索的。,其次是特点工程。

这里写图片描述

发表评论

电子邮件地址不会被公开。 必填项已用*标注