在特征工程的工作中,以task02的EDA为基础,对数据特征的缺失值异常值要进行处理,然后再进一步的进行特征交互、特征编码、特征选择。
- 特征工程的步骤主要分为部分:
1.数据预处理:缺失值、异常值、错误值的处理
1.1对部分对象特征需要转换到数值量表示
将‘employmentLength’字段的数据,转化为数值表示
2.特征提取:
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)
data['employmentLength'].value_counts(dropna=False).sort_index()
自此将字段中所有带year的数值转换为了只表示年份长短的数值量。
2.1类别特征
2.1.1对于特征维度较低的类别特征可以采用onehot编码等方式转化。
data = pd.get_dummies(data, columns=['grade', 'subGrade', 'homeOwnership', 'verificationStatus', 'purpose', 'regionCode'], drop_first=True)
2.1.2对于特征维度高的类别特征,通常可以使用一系列降维的方式,比如PCA降维、聚类、提取统计特征值等方法,降到较小的维度再分析。
for f in ['employmentTitle', 'postCode', 'title']:
data[f+'_cnts'] = data.groupby([f])['id'].transform('count')
data[f+'_rank'] = data.groupby([f])['id'].rank(ascending=False).astype(int)
del data[f]
也可以用特征编码的方式来处理高维特征
for col in tqdm(['employmentTitle', 'postCode', 'title','subGrade']):
le = LabelEncoder()
le.fit(list(data_train[col].astype(str).values) +
list(data_test_a[col].astype(str).values))
data_train[col] = le.transform(list(data_train[col].astype(str).values))
data_test_a[col] = le.transform(list(data_test_a[col].astype(str).values))
print('Label Encoding 完成')
3.特征选择
特征选择可以去掉一些无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。
特征选择的方法一般有:
1、Filter:方差选择、相关系数、卡方检验(需要矩阵正定)、互信息法
2、Wrapper(RFE)
3、Embedded:基于惩罚项的、基于树模型的
一般来说使用卡方检验和Embedded类的特征选择方法就能得出比较好的分数了