0%

机器学习为什么使用独热(One-hot Encoding)编码

最近在看一些机器学习资料,发现使用起来真的蛮难。特征工程,如何有效地对数据进行预处理使得学习过程可以有效进行,是其中一个重要的难点。因为任何一个数据模型,都需要你准备相应的数据,错误的数据往往造成训练无法拟合(Fitting)。

在处理特征数据时,独热编码是一种常用的对离散特征进行处理的编码方式。本文根据个人理解,讨论为什么需要独热编码,它的好处是什么

分类数据

要了解独热编码啊,先理解什么是分类数据。顾名思义,这类数据往往不是直接以数值或向量化形式呈现的数据,其一般为具有实际含义的名称标签。例如,

  • 某一列数据表示为‘宠物’。相应的值有“狗”、“猫”、“兔子”等
  • 表示“城市”的数据值有“北京”、“上海”、“成都”等

这些数据值在特定机器学习训练中往往具有有限的类别。

分类数据的问题

一些诸如“决策树”算法的学习方法,可以直接利用这些分类数据而无需进行数据转化。但更多的机器学习算法,需要进行的是数字或向量运算,没有办法直接处理这些文字型标签。这意味着,这些文字型的分类数据需要一定的转化,编程机器学习算法可以处理的数字型。

如何进行转化?

从程序员直觉上讲,很简单嘛,类似C语言的枚举类型,每种类型赋一个数字的值。例如,狗=1,猫=2,兔子=3,……

对一些学习场景,这种编码或许足够了。但是这种简单粗暴的编码方式,忽视掉了数据类别之间的距离。例如,狗和兔子之间的差异,并不会比狗和猫之间的差异大。但枚举方式进行编码,往往把这些特征值做了排序,与实际状况并不相符,最后导致学习的结果受到影响。

而解决这种问题的方式就是独热编码。某种特征有N种值,那么值就可以编码为1*N的向量,向量取值有N中,每种取值向量有且仅有一位为1。例如,狗=[1,0,0],猫=[0,1,0],兔子=[0,0,1]。可以看出,这三个值的距离是相等的。这就解决了枚举方式编码带来的问题。

如何使用?

有许多现成的Python库可以进行独热编码:

我们所需要做的就是根据相应的文档使用对应的API即可?

总结

本文大概介绍了独热编码的原理和使用场景。一般来说:

  • 为什么使用独热编码:大部分机器学习算法需要数字输入输出,而文字型标签无法被处理,枚举方式的编码可能错误地体现特征值间关系
  • 如何使用:SKlearn或Numpy有现成的API可以使用