特征工程是为了对数据进行处理,特征是原始数据的数值表示。特征工程是在给定数据、模型和任务的情况下设计出最合适的特征的过程。
没有足够的特征,模型将不能完成最终的任务,特征过多,模型会很难训练且训练成本高昂。
特征工程中的方法有
数据清洗
- 特征变换:模型无法处理或不适合处理
a) 定性变量编码:Label Encoder;Onehot Encoder;Distribution coding;
b) 标准化和归一化:z分数标准化(标准正太分布)、min-max 归一化; - 缺失值处理:增加不确定性,可能会导致不可靠输出
a) 不处理:少量样本缺失;
b) 删除:大量样本缺失;
c) 补全:(同类)均值/中位数/众数补全;高维映射(One-hot);模型预测;最邻近补全;
矩阵补全(R-SVD); - 异常值处理:减少脏数据
a) 简单统计:如 describe() 的统计描述;散点图等;
b) 3∂ 法则(正态分布)/箱型图截断;
c) 利用模型进行离群点检测:聚类、K近邻、One Class SVM、Isolation Forest; - 其他:删除无效列/更改dtypes/删除列中的字符串/将时间戳从字符串转换为日期时间格式等
特征构造:
- 构造统计量特征,报告计数、求和、比例、标准差等;
- 时间特征,包括相对时间和绝对时间,节假日,双休日等;
- 地理信息,包括分箱,分布编码等方法;
- 非线性变换,包括 log/ 平方/ 根号等;
- 特征组合,特征交叉;
特征选择方法:
- 过滤式(Filter):先用特征选择方法对初识特征进行过滤然后再训练学习器,特征选择过程与后续学习器无关。
a) Relief/方差选择/相关系数/卡方检验/互信息法 - 包裹式(Wrapper):直接把最终将要使用的学习器的性能作为衡量特征子集的评价准则,其目的在于为给定学习器选择最有利于其性能的特征子集。
a) Las Vegas Wrapper(LVM) - 嵌入式(Embedding):结合过滤式和包裹式方法,将特征选择与学习器训练过程融为一体,两者在同一优化过程中完成,即学习器训练过程中自动进行了特征选择。
a) LR+L1或决策树
以二手车交易交易价格预测的赛题为例,展示特征工程的一些应用
赛题链接,可以在此下载数据
https://tianchi.aliyun.com/competition/entrance/231784/information
读入数据
import pandas as pd
Train_data = pd.read_csv('./data/used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv('./data/used_car_testA_20200313.csv', sep=' ')
特征工程的操作
#特征构造
# 训练集和测试集放在一起,方便构造特征
Train_data['train'] = 1
Test_data['train'] = 0
data = pd.concat([Train_data,Test_data],ignore_index=True)
# 使用时间:data['creatDate'] - data['regDate'],反应汽车使用时间,一般来说价格与使用时间成反比
data['used_time'] = (pd.to_datetime(data['creatDate'], format='%Y%m%d', errors='coerce') -
pd.to_datetime(data['regDate'], format='%Y%m%d', errors='coerce')).dt.days
# 从邮编中提取城市信息,相当于加入了先验知识
data['city'] = data['regionCode'].apply(lambda x : str(x)[:-3])
data = data
#以power做数据分桶
bin = [i*10 for i in range(31)]
data['power_bin'] = pd.cut(data['power'], bin, labels=False)
# 删除不需要的数据
data = data.drop(['creatDate', 'regDate', 'regionCode'], axis=1)
# 目前的数据其实已经可以给树模型使用了,所以保存一下
data.to_csv('data_for_tree.csv', index=0)