2021-05-05

阿里云天池金融风控训练营广东工业-梁钰莹task6学习笔记

学习链接:https://tianchi.aliyun.com/competition/entrance/531830/introduction


一、学习知识点概要
了解金融风控赛题和赛制

二、学习内容
重温了一下往期学习内容

  • 数据EDA部分我们已经对数据的大概和某些特征分布有了了解,数据预处理部分一般我们要处理一些EDA阶段分析出来的问题,这里介绍了数据缺失值的填充,时间格式特征的转化处理,某些对象类别特征的处理。

首先我们查找出数据中的对象特征和数值特征

[4]:

numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)

category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))

label = 'isDefault'

numerical_fea.remove(label)

在比赛中数据预处理是必不可少的一部分,对于缺失值的填充往往会影响比赛的结果,在比赛中不妨尝试多种填充然后比较结果选择结果最优的一种; 比赛数据相比真实场景的数据相对要“干净”一些,但是还是会有一定的“脏”数据存在,清洗一些异常值往往会获得意想不到的效果。

缺失值填充

  • 把所有缺失值替换为指定的值0

    data_train = data_train.fillna(0)

  • 向用缺失值上面的值替换缺失值

    data_train = data_train.fillna(axis=0,method='ffill')

  • 纵向用缺失值下面的值替换缺失值,且设置最多只填充两个连续的缺失值

    data_train = data_train.fillna(axis=0,method='bfill',limit=2)

[12]:

def employmentLength_to_int(s):

if pd.isnull(s):

return s

else:

return np.int8(s.split()[0])

for data in [data_train, data_test_a]:

data['employmentLength'].replace(to_replace='10+ years', value='10 years', inplace=True)

data['employmentLength'].replace('< 1 year', '0 years', inplace=True)

data['employmentLength'] = data['employmentLength'].apply(employmentLength_to_int)

[5]:

#查看缺失值情况

data_train.isnull().sum()

[5]:

id 0
loanAmnt 0
term 0
interestRate 0
installment 0
grade 0
subGrade 0
employmentTitle 1
employmentLength 46799
homeOwnership 0
annualIncome 0
verificationStatus 0
issueDate 0
isDefault 0
purpose 0
postCode 1
regionCode 0
dti 239
delinquency_2years 0
ficoRangeLow 0
ficoRangeHigh 0
openAcc 0
pubRec 0
pubRecBankruptcies 405
revolBal 0
revolUtil 531
totalAcc 0
initialListStatus 0
applicationType 0
earliesCreditLine 0
title 1
policyCode 0
n0 40270
n1 40270
n2 40270
n3 40270
n4 33239
n5 40270
n6 40270
n7 40270
n8 40271
n9 40270
n10 33239
n11 69752
n12 40270
n13 40270
n14 40270
dtype: int64

[6]:

#按照平均数填充数值型特征

data_train[numerical_fea] = data_train[numerical_fea].fillna(data_train[numerical_fea].median())

data_test_a[numerical_fea] = data_test_a[numerical_fea].fillna(data_train[numerical_fea].median())

#按照众数填充类别型特征

data_train[category_fea] = data_train[category_fea].fillna(data_train[category_fea].mode())

data_test_a[category_fea] = data_test_a[category_fea].fillna(data_train[category_fea].mode())

[7]:

data_train.isnull().sum()

[7]:

id 0
loanAmnt 0
term 0
interestRate 0
installment 0
grade 0
subGrade 0
employmentTitle 0
employmentLength 46799
homeOwnership 0
annualIncome 0
verificationStatus 0
issueDate 0
isDefault 0
purpose 0
postCode 0
regionCode 0
dti 0
delinquency_2years 0
ficoRangeLow 0
ficoRangeHigh 0
openAcc 0
pubRec 0
pubRecBankruptcies 0
revolBal 0
revolUtil 0
totalAcc 0
initialListStatus 0
applicationType 0
earliesCreditLine 0
title 0
policyCode 0
n0 0
n1 0
n2 0
n3 0
n4 0
n5 0
n6 0
n7 0
n8 0
n9 0
n10 0
n11 0
n12 0
n13 0
n14 0
dtype: int64

[8]:

#查看类别特征

category_fea

[8]:

['grade', 'subGrade', 'employmentLength', 'issueDate', 'earliesCreditLine']

  • category_fea:对象型类别特征需要进行预处理,其中['issueDate']为时间格式特征。

时间格式处理

[9]:

#转化成时间格式

for data in [data_train, data_test_a]:

data['issueDate'] = pd.to_datetime(data['issueDate'],format='%Y-%m-%d')

startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')

#构造时间特征

data['issueDateDT'] = data['issueDate'].apply(lambda x: x-startdate).dt.days

[11]:

data_train['employmentLength'].value_counts(dropna=False).sort_index()

[11]:

1 year 52489
10+ years 262753
2 years 72358
3 years 64152
4 years 47985
5 years 50102
6 years 37254
7 years 35407
8 years 36192
9 years 30272
< 1 year 64237
NaN 46799
Name: employmentLength, dtype: int64

[12]:

def employmentLength_to_int(s):

if pd.isnull(s):

return s

else:

return np.int8(s.split()[0])

for data in [data_train, data_test_a]:

data['employmentLength'].replace(to_replace='10+ years', value='10 years', inplace=True)

data['employmentLength'].replace('< 1 year', '0 years', inplace=True)

data['employmentLength'] = data['employmentLength'].apply(employmentLength_to_int)

[13]:

data['employmentLength'].value_counts(dropna=False).sort_index()

[13]:

0.0 15989
1.0 13182
2.0 18207
3.0 16011
4.0 11833
5.0 12543
6.0 9328
7.0 8823
8.0 8976
9.0 7594
10.0 65772
NaN 11742
Name: employmentLength, dtype: int64

  • 对earliesCreditLine进行预处理

[14]:

data_train['earliesCreditLine'].sample(5)

[14]:

443256 Oct-1996
721367 May-2005
164834 Sep-2005
121565 Sep-2001
55358 Nov-2006
Name: earliesCreditLine, dtype: object

[15]:

for data in [data_train, data_test_a]:

data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))

类别特征处理

[16]:

部分类别特征

cate_features = ['grade', 'subGrade', 'employmentTitle', 'homeOwnership', 'verificationStatus', 'purpose', 'postCode', 'regionCode', \

'applicationType', 'initialListStatus', 'title', 'policyCode']

for f in cate_features:

print(f, '类型数:', data[f].nunique())

grade 类型数: 7
subGrade 类型数: 35
employmentTitle 类型数: 79282
homeOwnership 类型数: 6
verificationStatus 类型数: 3
purpose 类型数: 14
postCode 类型数: 889
regionCode 类型数: 51
applicationType 类型数: 2
initialListStatus 类型数: 2
title 类型数: 12058
policyCode 类型数: 1

像等级这种类别特征,是有优先级的可以labelencode或者自映射

[17]:

for data in [data_train, data_test_a]:

data['grade'] = data['grade'].map({'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7})

[18]:

类型数在2之上,又不是高维稀疏的,且纯分类特征

for data in [data_train, data_test_a]:

data = pd.get_dummies(data, columns=['subGrade', 'homeOwnership', 'verificationStatus', 'purpose', 'regionCode'], drop_first=True)

三、学习问题与解答

四、学习思考与总结
通过这十几天的学习,我了解了金融风控的赛题,学习了EDA探索性数据分析、特征工程、建模与调参以及模型融合等有关于金融风控方面的知识。虽然说还不能够深入理解,但是对于零基础者来说确实是学到了很多。感谢平台给我们提供了这么好的学习机会,我受益匪浅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值