特征工程

类别特征

特点

  • 需要处理
  • 类别基数大时会产生非常稀疏的数据
  • 缺失值很难补全

处理方法

独热编码

  • 特征F有k种取值,转换为一个长为k的数组,其中某一个为1,其他均为0
  • 常用在线性模型中
  • 稀疏表示利于存储
  • 缺失值处理,大多数处理方法对缺失值处理有待优化

例子

1
2
3
4
5
6
7
8
9
['male']

gender gender=male gender=female
------ ---------- -------------
male => [ 1, 0]
female [ 0, 1]

encode dense: [1,0]
encode sparse: 1:1

Hash编码

  • 将特征映射到一个固定长度上
  • 可能会导致冲突(hash函数的本身特点);冲突通常会恶化预测结果,但也可能会优化预测结果
  • 新取值会产生新的编码

例子

1
2
3
4
5
6
7
8
9
10
11
12
["BR"]

hash("BR") => `2`

country hash1 hash2 hash3
------- ----- ----- -----
NL => [0, 1, 0]
BR
US

encode dense: [0,1,0]
encode sparse: 2:1

label编码

  • 给特征的每个取值赋一个唯一的数字ID
  • 对非线性树模型有用
  • 不会增加数据维度

例子

1
2
3
4
5
6
7
8
["Queenstown"]
city city
----------- -----
Cherbourg 1
Queenstown => 2
Southampton 3

Encoded: [2]

Count编码[计数]

  • 将类别特征用特征出现的次数进行编码
  • 可以用于线性模型或非线性模型中
  • 对异常值、离群点敏感
  • 可以对计数结果做log处理
  • 将没见过的变量用1替代
  • 可能会造成冲突:不同的取值相同的编码结果

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
["A6GHBD78"]

teacher_ID teacher_ID
---------- ----------
DEADB33F 4
A6GHBD78 3
DEADB33F 4
FCKGWRHQ => 1
DEADB33F 4
A6GHBD78 3
A6GHBD78 3
DEADB33F 4

encoded: [3]

LabelCount编码

  • 将特征根据取值出现的次数进行排序,根据排序结果对取值进行编码
  • 可以用在线性模型和非线性模型中
  • 对离群点不敏感
  • 不同的取值不会产生相同的编码结果
  • Best of both worlds

例子

1
2
3
4
5
6
7
8
9
10
tld             tld
--- ---
nl 3
nl 3
nl 3
nl => 3
de 2
de 2
fr 1
fr 1

Target编码

  • 基于目标的编码是通过目标来对分类变量量化。把一个分类变量替换成一个数值变量,然后再计算该分类变量出现的目标概率(如果是分类的)或者平均值(如果是数值的)。这个方法的最大缺点是它比较依赖目标的分布。
  • 容易造成过拟合
  • 需要平滑处理,避免出现0编码

例子

category embedding

  • 使用神经网络将类别变量映射到稠密嵌入向量上
  • 将类别变量通过一个复杂函数映射到欧几里得空间里
  • 比1-hot编码能带来更多的帮助

例子

1
2
3
4
role         role 3-D embedding
---- ------------------
manager | [0.05, 0.10, 0.96]
engineer | [0.72, 0.66, 0.17]

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

您的支持就是我更新的最大动力!谢谢!