类别特征
特点
- 需要处理
- 类别基数大时会产生非常稀疏的数据
- 缺失值很难补全
处理方法
独热编码
- 特征F有k种取值,转换为一个长为k的数组,其中某一个为1,其他均为0
- 常用在线性模型中
- 稀疏表示利于存储
- 缺失值处理,大多数处理方法对缺失值处理有待优化
例子:
1 | ['male'] |
Hash编码
- 将特征映射到一个固定长度上
- 可能会导致冲突(hash函数的本身特点);冲突通常会恶化预测结果,但也可能会优化预测结果
- 新取值会产生新的编码
例子
1 | ["BR"] |
label编码
- 给特征的每个取值赋一个唯一的数字ID
- 对非线性树模型有用
- 不会增加数据维度
例子
1 | ["Queenstown"] |
Count编码[计数]
- 将类别特征用特征出现的次数进行编码
- 可以用于线性模型或非线性模型中
- 对异常值、离群点敏感
- 可以对计数结果做log处理
- 将没见过的变量用1替代
- 可能会造成冲突:不同的取值相同的编码结果
例子
1 | ["A6GHBD78"] |
LabelCount编码
- 将特征根据取值出现的次数进行排序,根据排序结果对取值进行编码
- 可以用在线性模型和非线性模型中
- 对离群点不敏感
- 不同的取值不会产生相同的编码结果
- Best of both worlds
例子
1 | tld tld |
Target编码
- 基于目标的编码是通过目标来对分类变量量化。把一个分类变量替换成一个数值变量,然后再计算该分类变量出现的目标概率(如果是分类的)或者平均值(如果是数值的)。这个方法的最大缺点是它比较依赖目标的分布。
- 容易造成过拟合
- 需要平滑处理,避免出现0编码
例子
category embedding
- 使用神经网络将类别变量映射到稠密嵌入向量上
- 将类别变量通过一个复杂函数映射到欧几里得空间里
- 比1-hot编码能带来更多的帮助
例子
1 | role role 3-D embedding |
NaN编码
- 给NaN缺失值一个明确的编码,而不是忽略它
- NaN可能也携带信息
- 只有当训练集和测试集中NaN缺失值是由相同原因造成的,或者使用验证集证明NaN携带信息时,使用这种编码方式
多项式编码
- 将不同的类别变量相互交互产生新的变量
- 特征交互可以带来一定的非线性,可以帮助线性算法解决xor问题
- 也可以使用多项式核
Expansion编码(扩展)
- 从单个类别变量中产生多个类别变量
- 比如user-agent变量: is_moble; is_latest_version; operation_system;etc
数值型特征
Rounding 四舍五入
- 当精度过高时,舍弃一定的精度
- 四舍五入后可以当做类别变量处理
- 可以在四舍五入前使用log函数处理
分箱binning
- 将数值特征分成几个箱,然后使用箱子的id进行编码
- 可以使用分位数,或者多次实验选择合适的分箱间隔
- 对于离群点不敏感
Scaling 缩放
- 缩放到某个范围内
- Z-Score处理
- MinMax缩放
- Log缩放
- 开平方缩放
Imputation填充
- 填充缺失值
- 平均值:常用
- 中位数: 对异常值更加鲁邦
- 忽略
- 使用模型预测
特征交互
- 数值特征之间交互产生新的特征
- 加、减、乘、除
- 使用特征选择:模型训练,选择特征重要性高的特征,或者基于统计测试
Reference
https://www.slideshare.net/HJvanVeen/feature-engineering-72376750