原文:
towardsdatascience.com/decoding-one-hot-encoding-a-beginners-guide-to-categorical-data-058582240e86
简介
在学习机器学习时,理解最基本算法的内部工作原理是至关重要的。这样做有助于理解算法在流行的库和框架中的操作方式,如何调试它们,更容易选择更好的超参数,并确定哪种算法最适合给定的问题。
虽然算法是机器学习的核心,但没有高质量的数据,它们无法产生有效的结果。由于在某些问题中数据可能是一种稀缺资源,因此学习如何有效地预处理数据以提取最大价值至关重要。此外,预处理不当的数据可能会降低算法的性能。
即使是一个非常简单的模型,如果数据准备得当,也可能比一个大型模型表现更好。
在这篇文章中,我们将研究 one-hot 编码,这是数据预处理中最基本的技术之一。为了有效地做到这一点,我们首先将理解数据编码背后的动机,然后探索其在 Pandas 中的原理和实现。
问题
让我们设想,我们想在给定的数据集上使用机器学习模型。该数据集包含几个特征,其中之一是分类特征。像大多数机器学习算法一样,我们的模型需要一个数值向量作为输入。基于这个输入,模型生成预测,计算损失值,并相应地更新模型权重。
当处理分类特征时,我们如何将此信息传递给仅使用数值数据的模型?一种简单的方法是将特征中的每个唯一类别映射到一个整数,并将该整数传递给模型。尽管这种方法很简单,但它在下面的示例中有一个主要的缺点将被讨论。
示例
假设我们有一个数据集,其中每一行描述学生。具体来说,有一个列表示学生在空闲时间练习的体育类型。
数据集示例
上文所述的简单编码方法会导致以下列:
使用简单方法进行运动列转换
在这个例子中,我们看到足球对应于 1,篮球对应于 2,保龄球对应于 4。基于这些值,我们是否可以说,在某种意义上,保龄球“大于”篮球,而篮球“大于”足球?可能不是。在大多数情况下,这并不合理。然而,这正是模型在训练期间解释这些值的方式,因为它无法捕捉到编码数字之间的任何语义意义。
此外,基于这些数值,模型可能会将保龄球和篮球之间的差异(4-2=2)解释为篮球和足球之间差异的两倍(2-1=1)。显然,我们不希望模型以这种未预期的逻辑运行。
因此,我们可以看到直接编码不会对模型的性能产生积极影响。
尽管如此,在某些情况下,这种直接编码仍然是有用的。例如,如果我们想根据流行度或其他因素对体育类型进行排名,那么这样做是合适的。
独热编码
对于分类特征有许多编码技术,但我们将要关注的是称为独热编码的技术。这种技术得名于独热向量的概念,它是一个所有分量都是 0,只有一个分量值为 1 的向量。
要对具有n个唯一值的分类特征进行编码,独热编码使用维度为n的向量,每个唯一值映射到向量中 1 出现的位置。
回到我们的例子,编码的体育特征将由长度为 4 的向量表示(如果有 4 种独特的体育类型)。
应用到“体育”列的独热编码
一个独热向量的第i个分量可以被视为一个二进制特征,回答了对象是否属于编码类别中的i类的问题(1)或不是(0)。
通过在编码的每一列中只有两个唯一值,现在这些值可以以模型容易理解的方式在语义上进行比较。
独热目标
独热编码不仅用于编码分类特征,还可以应用于转换分类目标。例如,如果你想预测动物类型,你可以将目标列中的每个动物映射到其相应的独热向量。
唯一的细微差别是,现在你的模型需要学会预测n个值,而不仅仅是预测一个值。然而,这并不是问题,因为预测的值可以被归一化,使得它们的总和为 1,并且最终可以解释为对象属于i类的概率。在这种情况下,损失函数也必须进行调整,因为它的输入将包括一对向量:预测向量和真实独热向量。
一个说明 one-hot 目标向量预测框架的图表。
实现
One-hot 编码的实现简单直接,涉及将每个类别映射到 one-hot 向量中的一个位置,该位置为 1。
在 Pandas 中编码分类特征,您可以使用 _get*dummies()*方法。
import pandas as pd
columns = ['age', 'grade', 'languages', 'publications', 'sport']
data = [
(22, 86, 3, 17, 'soccer'),
(21, 77, 2, 10, 'basketball'),
(22, 90, 1, 14, 'tennis'),
(19, 82, 2, 8, 'soccer'),
(20, 94, 1, 13, 'bowling'),
(23, 71, 4, 7, 'tennis')
]
df = pd.DataFrame(data, columns=columns)
上面的代码片段生成了本文开头所示的数据框。现在,只需一行代码,我们就可以应用 one-hot 转换并删除原始的运动列:
df_encoded = pd.get_dummies(df, columns=['sport'], dtype=int)
使用 Pandas 中的**get_dummies()**方法进行数据集转换
即使是 Pandas 方法的名称 get_dummies()也暗示了 one-hot 编码过程是多么简单直接。😄
结论
在本文中,我们探讨了 one-hot 编码——机器学习中用于编码分类数据的简单算法。对于简单问题,它在大多数数据分析库中实现起来既快又简单。
然而,可能存在不同类别值之间有复杂关系的情形。在这种情况下,最好使用考虑额外特征信息的更高级方法。
最后,当特征具有许多唯一值时,不建议使用 one-hot 编码。例如,如果一个特征包含一千个唯一值,所有的 one-hot 向量都将具有 1000 维的维度。这不仅需要大量的内存,而且在处理大型数据集时也会非常慢。为了避免维度灾难,在这些情况下最好考虑其他编码方法。
感谢阅读!如果您喜欢这篇文章,请务必查看我关于经典机器学习的其他文章!✍️
结论
除非另有说明,所有图像均为作者所有。
2077

被折叠的 条评论
为什么被折叠?



