零基础数据挖掘——金融风控(三)特征工程

本文介绍了金融风控中特征工程的重要性和步骤,包括数据清洗、异常值处理、重复值处理、特征分箱、特征编码、特征选择、交互及降维。特征工程在数据挖掘中起到关键作用,良好的特征工程能提升模型性能。文中详细讨论了各种处理方法,如时间格式转换、缺失值填充、异常值检测、分箱策略和多种特征编码技术,并探讨了各种特征选择和降维方法,如Filter、Wrapper、Embedded策略及PCA、LDA和t-SNE等。

1、前言

在重看我的项目的过程中发现自己对于相关知识点理解并不透彻,希望能理论联系实际,加深自己对基础知识的理解。项目来源于阿里天池学习赛——零基础入门金融风控-贷款违约预测,感兴趣的小伙伴可以自己去原文了解。特征工程是数据挖掘过程中至关重要的一块, 因为数据和特征决定了机器学习的上限,而算法和模型只是逼近这个上限而已,所以特征工程的好坏往往决定着最后的结果。特征工程在我看来分为数据清洗过程以及特征降维&交互&选择的过程。 前者通过重复值、异常值、缺失值的去除/填充,更好地表示出潜在问题的特征;后者或通过构造新特征使得数据的表达能力进一步放大,或根据相关性等进行特征的选择和降维以减少“维度灾难”。

这里尽量总结更多的方法,在后续实际应用中再具体模型具体分析。

2、数据清洗

2.0 时间格式处理

2.0.1 ['issueDate']

构造['issueDateDT']代表据最早日期(2007-06-01)的天数,连续型变量

import datatime
#转化成时间格式
for data in [train, testA]:
    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
sns.histplot(data_train['issueDateDT'],kde=True)

 构造['issueDateM']代表贷款的月份,可以作为一个离散型变量

for data in [data_train, data_testA]:
    data['issueDate'] = pd.to_datetime(data['issueDate'],format='%Y-%m-%d')
    data['issueDateM'] = data['issueDate'].dt.month
data_train['issueDateM'].value_counts(dropna=False).sort_index()
1     67280
2     62108
3     74774
4     65147
5     62159
6     59689
7     76969
8     66842
9     54091
10    81035
11    67785
12    62121
Name: issueDateM, dtype: int64

2.0.2 ['employmentLength']保留数字

#定义一个函数:非零值取空格前的数字,且设置为int8格式
def employmentLength_to_int(s):
    if pd.isnull(s):
        return s
    else:
        return np.int8(s.split()[0])
for data in [data_train, data_testA]:
    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)
data_train['employmentLength'].value_counts(dropna=False).sort_index()
0.0      64237
1.0      52489
2.0      72358
3.0      64152
4.0      47985
5.0      50102
6.0      37254
7.0      35407
8.0      36192
9.0      30272
10.0    262753
NaN      46799
Name: employmentLength, dtype: int64

2.0.3 ['earliesCreditLine']保留年份

#取最后4个数字作为年份
for data in [data_train, data_testA]:
    data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))
data['earliesCreditLine'].value_counts(dropna=False).sort_index()
1944       1
1945       1
1949       1
1950       2
1951       2
        ... 
2011    2490
2012    1676
2013     850
2014     388
2015      50
Name: earliesCreditLine, Length: 69, dtype: int64

2.1 缺失值处理

2.1.1 不处理

部分模型可以自动处理缺失值,如xgboost,不用我们对其进行处理。

2.1.2 填充(fillna)

用某个统计量或缺失值前后数据填充

data_train.fillna(0, inplace=True) # 填充 0
data_train.fillna(train_data.mean(),inplace=True) # 填充均值
data_train.f
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值