如何处理类别型特征

类别型特征(categorical feature)主要是指年龄,职业,血型等在有限类别内取值的特征。它的原始输入通常是字符串形式,除了决策树族的算法能直接接受类别型特征作为输入,对于支持向量机,逻辑回归等模型来说,必须对其做一定的处理,转换成可靠的数值特征才能正确运行。

处理类别型特征的方法

  • 序列编码(ordinal encoding)

一般处理类别间具有大小关系的数据,例如期末成绩的 [A, B, C, D] 四挡可以直接转化为 [0, 1, 2, 3]。在转化后,依然保持类别之间的顺序关系。

def ordinal_encoder(in_x):
    cates = np.unique(in_x)
    encoder = {k: v for k, v in zip(cates, np.arange(cates))}
    return encoder
  • 独热编码(one-hot encoding)

序列编码潜在的定义了类别之间的距离具有相同的含义。
以成绩为例,两个人之间,得分A与B的成绩差,和B与C的成绩差,在进行预测时,是完全等价的,由于 [A, B, C, D] 直观上与成绩正相关,使用序列编码不会带来太大的损失。然而在处理像血型这样的类别特征时,如果将 [A, B, AB, O] 直接编码成 [1, 2, 3, 4],显然A与B和B与AB之间的距离,并不具有相同的含义,甚至是完全抽象的无法理解的意义,此时,序列编码就不适用了。

使用独热编码,对每种血型赋予不同的权重:
A - [1, 0, 0, 0]
B - [0, 1, 0, 0]
AB - [0, 0, 1, 0]
O - [0, 0, 0, 1]
即使在对于类别特征敏感的决策树算法中,使用独热编码同样可以带来改变。将特征使用Ohe进行编码,可以增大决策树的深度,在某些情况下,可以提升决策树的性能。
在类别较多时,使用独热编码容易导致特征过于稀疏,此时,可以配合特征选择技巧降低维度。
pandas.get_dummies() 可以用来将类别特征进行独热编码。

  • 二进制编码(binary encoder)

先使用序列编码转化为数值形式,再将数值转义成二进制的方式。

相对于独热编码,二进制编码更加紧凑,节省存储空间。(效果未必更好)

  • 统计编码

统计各类别在训练集中出现的频率,并将频率作为新的特征。
在某些情况下,具有统计意义的统计编码也是一种值得尝试的技巧。

你可能感兴趣的:(如何处理类别型特征)