天天向上小队-天天
特征工程
特征工程目标
对于特征进行进一步分析,并对数据进行处理;
尝试构造新特征,使用模型预测结果检验其价值;
完成对于特征工程的分析,并对数据进行一些图标或者文字总结并打卡;
内容介绍
常见特征工程包括:
-
异常处理:
- 通过箱型图|3-sigma 识别异常值,并对其进行替换
- BOX-COX转换(处理有偏分布)
- 长尾截断
-
特征归一化|标准化:
- 标准化(当成正态分布,将其标准正态化)
- 归一化(转换到【0,1】区间)
- 针对幂律分布,可以采用公式:log((1+x)/ (1+median))
-
数据分桶:
- 等频分桶
- 等距分桶
- Best-KS分桶(类似利用基尼指数进行二分类)
- 卡方分桶
-
缺失值处理:
- 不处理(针对类似XGBoost等树模型)
- 删除(缺失数据太多)
- 插值补全,包括均值|中位数|众数|建模预测|多重插补|压缩感知补全|矩阵补全等
- 分箱,缺失值一个箱
-
特征构造
- 构造统计量特征,包括计数、求和、比例、标准差等等
- 时间特征,包括相对时间、绝对时间、,节假日,双休日等
- 非线性变换,包括log|平方|根号等
- 特征组合,特征交叉(ps:特征组合又叫特征交叉,两者一个意思):
- 多项式组合
- 基本初等函数组合
- 根据数据实际意义,构造具有先验知识的新特征
-
特征筛选:
- 过滤式(filter):先对数据进行特征选择,然后再训练学习器,常见的方法有Relief|方差选择法|相关系数法|卡方检验法|互信息法
- 包裹式(wrapper):直接把最终将要使用的学习器的性能作为特征自己的评价准则,常见方法有LVM(Las Vegas Wrapper)
- 嵌入式(embedding) :结合过滤式和包裹式,学习器训练过程中自动节能型了特征选择,常见的有lasso回归
-
降维
- PCA|LDA|LCA
- 特征选择也是一种降维
缺失值处理:
data.fillna()
,pandas已有的缺失值填充方法data.fillna(axis=0,method='ffill')
用前面最近的非缺失值填充缺失值data.fillna(axis=0,method='bfill')
有后面最近的非缺失值填充缺失值data.fillna(data.mean())
用平均值填充,其它类比特征构造是一场数据挖掘比赛要投入的时间最多的环节,贯穿整个比赛,挖掘出好的特征或多或少能提高模型最后的效果。
DataWhale给出的特征构造十分全面,非常适合我这种入门数据挖掘的小白,把思路、方法介绍地比较完整。
个人感觉,特征工程含两个模块:基本数据处理,新特征构造。
前者能玩的花样不多,前面已经讲的很清楚了,后者就至关重要了,甚至可以说,可遇不可求。
下面讲一下我的特征工程
基本的数据处理,无论是pandas、sklearn都有丰富全面的接口
类别变量编码
类别变量的编码我花了一些时间,效果不显著,感觉是踩坑了。
python 第三方库:category_encoders 包含了我能搜到的绝大部分类别编码方式
import category_encoders as ce ''' BackwardDifferenceEncoder,BinaryEncoder,HashingEncoder,HelmertEncoder,OneHotEncoder,SumEncoder, CatBoostEncoder(),CountEncoder(),GLMMEncoder(),JamesSteinEncoder(),LeaveOneOutEncoder(),MEstimateEncoder(),OrdinalEncoder()TargetEncoder() ''' # 举一个例子 enc = ce.OneHotEncoder(cols=['model','brand']handle_unknown='value', handle_missing='value') enc.fit(train_pd) model_and_brand = enc.trainsform(train_pd)
数值类别基本处理:
- 标准化|归一化等,用pandas实现起来快速而简单,不赘述
特征构造:
- 日期特征: createDate - regionDate 相当于汽车使用时间
- 连续变量之间:
- 多项式特征构造:ex:v_0 * v_1, v_10*v_12, v_13- v_0,等等
- 基本初等函数构造,及组合
- log(v_0 - min(v_0)+1)
- sqrt(v_12)
- sqrt(v_11) + log(v_1 - min(v_1) + 1)
- 等等