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

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经过有很强的正相互相干.这么标定分可能性跟客户的年龄段涉及.
资料是宽裕的摸索的。,其次是特点工程。

这里写图片描述

发表评论

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