零基础入门金融风控-贷款违约预测TASK 3
- 3.特征工程
-
- 3.1时间格式处理
- 3.2类别特征的处理
- 3.3连续型变量的处理
- 3.4 特征选择
3.特征工程
3.1时间格式处理
issueDate属性:
// 查看贷款发放的最早月份
train.sort_index(by='issueDate')['issueDate'];//按照issueDate索引排序;
// 查询到最早的日期为:
2007-06-01;
转换成时间格式
:
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
employmentLength属性:
// 查询得到最早的月份为:
train['employmentLength'].value_counts(dropna=False).sort_index();
//dropna=False 表示保留NAN;
查询结果:
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
将其转换成数值类型
:
def employmentLength_to_int(s):if pd.isnull(s):return selse:return np.int8(s.split()[0])//split()为字段拆分;
for data in [train, 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)
转换结果:
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属性:
for data in [data_train, data_test_a]:data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))
3.2类别特征的处理
// 查看各类别数:
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', 248683)
('homeOwnership', 6)
('verificationStatus', 3)
('purpose', 14)
('postCode', 932)
('regionCode', 51)
('applicationType', 2)
('initialListStatus', 2)
('title', 39644)
('policyCode', 1)
转换方法:
//1.map方法:
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})
//2.one-hot方法:
for data in [data_train, data_test_a]:data = pd.get_dummies(data, columns=['subGrade', 'homeOwnership', 'verificationStatus', 'purpose', 'regionCode'], drop_first=True)
3.3连续型变量的处理
连续型的变量在值的跨度可能会很大,例如在利用k-均值使用欧式距离来计算相似度时,该类型的变量会有计算困难,因此,将其离散化,对其进行分箱操作,即量化,会对建模后带来很大的好处,模型会更稳定,降低了模型过拟合的风险。
无监督分箱法:
1.等距/等宽分箱:将变量的取值范围分为k个等宽的区间,每个区间当作一个分箱。
2.等频分箱:把观测值按照从小到大的顺序排列,根据观测的个数等分为k部分,每部分当作一个分箱.
# 通过除法映射到间隔均匀的分箱中,每个分箱的取值范围都是loanAmnt/1000
data['loanAmnt_bin1'] = np.floor_divide(data['loanAmnt'], 1000)
//floor_divide返回整数结果。相当于先调用divide函数,再调用floor函数,floor函数将对浮点数进行向下取整并返回整数。## 通过对数函数映射到指数宽度分箱
data['loanAmnt_bin2'] = np.floor(np.log10(data['loanAmnt']))data['loanAmnt_bin3'] = pd.qcut(data['loanAmnt'], 10, labels=False)
pd.cut()参数介绍:
pd.cut( x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', )
x : 一维数组
bins :整数,标量序列或者间隔索引,是进行分组的依据,
如果填入整数n,则表示将x中的数值分成等宽的n份(即每一组内的最大值与最小值之差约相等);如果是标量序列,序列中的数值表示用来分档的分界值如果是间隔索引,“ bins”的间隔索引必须不重叠
right :布尔值,默认为True表示包含最右侧的数值
当“ right = True”(默认值)时,则“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]
当bins是一个间隔索引时,该参数被忽略。
labels : 数组或布尔值,可选.指定分箱的标签
如果是数组,长度要与分箱个数一致,比如“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]一共3个区间,则labels的长度也就是标签的个数也要是3
如果为False,则仅返回分箱的整数指示符,即x中的数据在第几个箱子里
当bins是间隔索引时,将忽略此参数.
有监督分箱法:
1.卡方分箱法(ChiMerge):自底向上的(即基于合并的)数据离散化方法。
它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。
2.最小熵法分箱:
3.4 特征选择
特征选择技术可以精简掉无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。特征选择不是为了减少训练时间(实际上,一些技术会增加总体训练时间),而是为了减少模型评分时间。
特征选择的方法:
1.Filter
a. 方差选择法
b. 相关系数法(pearson 相关系数)
c. 卡方检验
d. 互信息法
2.Wrapper (RFE)
a. 递归特征消除法
3.Embedded
a. 基于惩罚项的特征选择法
b. 基于树模型的特征选择