解码 One-Hot 编码:分类数据的入门指南

原文:towardsdatascience.com/decoding-one-hot-encoding-a-beginners-guide-to-categorical-data-058582240e86

简介

在学习机器学习时,理解最基本算法的内部工作原理是至关重要的。这样做有助于理解算法在流行的库和框架中的操作方式,如何调试它们,更容易选择更好的超参数,并确定哪种算法最适合给定的问题。

虽然算法是机器学习的核心,但没有高质量的数据,它们无法产生有效的结果。由于在某些问题中数据可能是一种稀缺资源,因此学习如何有效地预处理数据以提取最大价值至关重要。此外,预处理不当的数据可能会降低算法的性能。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/65d3b45cfa9181fe3f2162359ec71b60.png

即使是一个非常简单的模型,如果数据准备得当,也可能比一个大型模型表现更好。

在这篇文章中,我们将研究 one-hot 编码,这是数据预处理中最基本的技术之一。为了有效地做到这一点,我们首先将理解数据编码背后的动机,然后探索其在 Pandas 中的原理和实现。

问题

让我们设想,我们想在给定的数据集上使用机器学习模型。该数据集包含几个特征,其中之一是分类特征。像大多数机器学习算法一样,我们的模型需要一个数值向量作为输入。基于这个输入,模型生成预测,计算损失值,并相应地更新模型权重。

当处理分类特征时,我们如何将此信息传递给仅使用数值数据的模型?一种简单的方法是将特征中的每个唯一类别映射到一个整数,并将该整数传递给模型。尽管这种方法很简单,但它在下面的示例中有一个主要的缺点将被讨论。

示例

假设我们有一个数据集,其中每一行描述学生。具体来说,有一个列表示学生在空闲时间练习的体育类型。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c0ddc929f01e681707815a2379582bed.png

数据集示例

上文所述的简单编码方法会导致以下列:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/af17c2ade8dd0cf6a155e56e693e68ea.png

使用简单方法进行运动列转换

在这个例子中,我们看到足球对应于 1,篮球对应于 2,保龄球对应于 4。基于这些值,我们是否可以说,在某种意义上,保龄球“大于”篮球,而篮球“大于”足球?可能不是。在大多数情况下,这并不合理。然而,这正是模型在训练期间解释这些值的方式,因为它无法捕捉到编码数字之间的任何语义意义

此外,基于这些数值,模型可能会将保龄球和篮球之间的差异(4-2=2)解释为篮球和足球之间差异的两倍(2-1=1)。显然,我们不希望模型以这种未预期的逻辑运行。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/092fd6620289dac4e59c77b06893a351.png

因此,我们可以看到直接编码不会对模型的性能产生积极影响。

尽管如此,在某些情况下,这种直接编码仍然是有用的。例如,如果我们想根据流行度或其他因素对体育类型进行排名,那么这样做是合适的。

独热编码

对于分类特征有许多编码技术,但我们将要关注的是称为独热编码的技术。这种技术得名于独热向量的概念,它是一个所有分量都是 0,只有一个分量值为 1 的向量。

要对具有n个唯一值的分类特征进行编码,独热编码使用维度为n的向量,每个唯一值映射到向量中 1 出现的位置。

回到我们的例子,编码的体育特征将由长度为 4 的向量表示(如果有 4 种独特的体育类型)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/55a5e7d420d42a4664b14a65db88ceb9.png

应用到“体育”列的独热编码

一个独热向量的第i个分量可以被视为一个二进制特征,回答了对象是否属于编码类别中的i类的问题(1)或不是(0)。

通过在编码的每一列中只有两个唯一值,现在这些值可以以模型容易理解的方式在语义上进行比较。

独热目标

独热编码不仅用于编码分类特征,还可以应用于转换分类目标。例如,如果你想预测动物类型,你可以将目标列中的每个动物映射到其相应的独热向量。

唯一的细微差别是,现在你的模型需要学会预测n个值,而不仅仅是预测一个值。然而,这并不是问题,因为预测的值可以被归一化,使得它们的总和为 1,并且最终可以解释为对象属于i类的概率。在这种情况下,损失函数也必须进行调整,因为它的输入将包括一对向量:预测向量和真实独热向量。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b2d4e41f067314c04cd875dcf0e492fc.png

一个说明 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)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a63c8e7579ae8259b437cd524db94b1d.png

使用 Pandas 中的**get_dummies()**方法进行数据集转换

即使是 Pandas 方法的名称 get_dummies()也暗示了 one-hot 编码过程是多么简单直接。😄

结论

在本文中,我们探讨了 one-hot 编码——机器学习中用于编码分类数据的简单算法。对于简单问题,它在大多数数据分析库中实现起来既快又简单。

然而,可能存在不同类别值之间有复杂关系的情形。在这种情况下,最好使用考虑额外特征信息的更高级方法。

最后,当特征具有许多唯一值时,不建议使用 one-hot 编码。例如,如果一个特征包含一千个唯一值,所有的 one-hot 向量都将具有 1000 维的维度。这不仅需要大量的内存,而且在处理大型数据集时也会非常慢。为了避免维度灾难,在这些情况下最好考虑其他编码方法。

感谢阅读!如果您喜欢这篇文章,请务必查看我关于经典机器学习的其他文章!✍️

经典机器学习

结论

除非另有说明,所有图像均为作者所有。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值