Press "Enter" to skip to content

[译] 在机器学习中为什幺要进行 One-Hot 编码

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

入门机器学习应用,尤其是需要对实际数据进行处理时,是很困难的。

 

一般来说,机器学习教程会推荐你或要求你,在开始拟合模型之前,先以特定的方式准备好数据。

 

其中,一个很好的例子就是对类别数据(Categorical data)进行 (又称独热编码)。

为什幺 One-Hot 编码是必要的?
为什幺你不能直接使用数据来拟合模型?

在本文中,你将得到上述重要问题的答案,并能更好地理解机器学习应用中的数据准备工作。

 

什幺是类别数据?

 

类别数据是一种只有标签值而没有数值的变量。

 

它的值通常属于一个大小固定且有限的集合。

 

类别变量也常被称为标称值(nominal)。

 

下面举例说明:

宠物(pet)变量包含以下几种值:狗(dog)、猫(cat)。
颜色(color)变量包含以下几种值:红(red)、绿(green)、蓝(blue)。
位次(place)变量包含以下几种值:第一(first)、第二(second)和第三(third)。

以上例子中的每个值都代表着一个不同的类别。

 

有些类别彼此间存在一定的自然关系,比如自然的排序关系。

 

上述例子中,位次(place)变量的值就有这种自然的排序关系。这种变量被称为序数变量(ordinal variable)。

 

类别数据有什幺问题?

 

有些算法可以直接应用于类别数据。

 

比如,你可以不进行任何数据转换,将决策树算法直接应用于类别数据上(取决于具体实现方式)。

 

但还有许多机器学习算法并不能直接操作标签数据。这些算法要求所有的输入输出变量都是数值(numeric)。

 

通常来说,这种限制主要是因为这些机器学习算法的高效实现造成的,而不是算法本身的限制。

 

但这也意味着我们需要把类别数据转换成数值形式。如果输出变量是类别变量,那你可能还得将模型的预测值转换回类别形式,以便在一些应用中展示或使用它们。

 

如何将类别数据转换成数值数据?

 

这包含两个步骤:

 

 

    1. 整数编码

 

    1. One-Hot 编码

 

 

1. 整数编码

 

第一步,先要给每个类别值都分配一个整数值。

 

比如,用 1 表示红色(red),2 表示绿色(green),3 表示蓝色(blue)。

 

这种方式被称为标签编码或者整数编码,可以很轻松地将它还原回类别值。

 

对于某些变量来说,这种编码就足够了。

 

整数之间存在自然的排序关系,机器学习算法也许可以理解并利用这种关系。

 

比如,前面的位次(place)例子中的序数变量就是一个很好的例子。对于它我们只需要进行标签编码就够了。

 

2. One-Hot 编码

 

但对于不存在次序关系的类别变量,仅使用上述的整数编码是不够的。

 

实际上,使用整数编码会让模型假设类别间存在自然的次序关系,从而导致结果不佳或得到意外的结果(预测值落在两个类别的中间)。

 

这种情况下,就要对整数表示使用 One-Hot 编码了。One-Hot 编码会去除整数编码,并为每个整数值都创建一个二值变量。

 

在颜色(color)的示例中,有 3 种类别,因此需要 3 个二值变量进行编码。对应的颜色位置上将被标为“1”,其它颜色位置上会被标为“0”。

 

比如:

 

red, green, blue
1, 0, 0
0, 1, 0
0, 0, 1

 

在统计学等领域中,这种二值变量通常被称为“虚拟变量”或“哑变量”(dummy variable)。

 

One-Hot 编码教程

 

如果你想了解如何在 Python 对你的数据进行 One-Hot 编码,请参阅:

Data Preparation for Gradient Boosting with XGBoost in Python
— 在 Python 中使用 XGBoost 梯度提升法前的数据准备

How to One Hot Encode Sequence Data in Python
— 如何使用 Python 对序列数据进行 One-Hot 编码

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注