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

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 编码:每个类特点用矢量表现。
这里写图片描述
除了朝着这两种编码方式,少数数量提议,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私下有很强的正互插.这样一致分可能性跟客户的使苍老使关心.
记载是容易地探究的。,其次是特点工程。

这里写图片描述

发表评论

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