在应用机器学习方面入门可能很困难,尤其是在处理真实世界数据时。
通常,机器学习教程会建议或要求你在拟合机器学习模型之前以特定的方式准备数据。
一个很好的例子是对分类数据使用独热编码。
- 为什么需要独热编码?
- 为什么不能直接用数据拟合模型?
在本文中,你将找到这些重要问题的答案,并更好地理解应用机器学习中一般的数据准备。
通过我的新书《机器学习数据准备》快速启动你的项目,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

为什么在机器学习中进行独热编码?
图片来自 Karan Jain,部分权利保留。
什么是分类数据?
分类数据是包含标签值而非数值的变量。
可能的值数量通常限于固定集合。
分类变量通常被称为标称变量。
一些例子包括:
- 一个具有“狗”和“猫”值的“宠物”变量。
- 一个具有“红”、“绿”和“蓝”值的“颜色”变量。
- 一个具有“第一”、“第二”和“第三”值的“名次”变量。
每个值代表一个不同的类别。
某些类别之间可能存在自然关系,例如自然排序。
上面的“名次”变量确实有值的自然排序。这种类型的分类变量称为有序变量。
想开始学习数据准备吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
分类数据的问题是什么?
某些算法可以直接处理分类数据。
例如,决策树可以直接从分类数据中学习,无需进行数据转换(这取决于具体的实现)。
许多机器学习算法无法直接处理标签数据。它们要求所有输入变量和输出变量都是数值。
总的来说,这主要是机器学习算法高效实现的一个限制,而不是算法本身的硬性限制。
这意味着分类数据必须转换为数值形式。如果分类变量是输出变量,你可能还希望将模型的预测转换回分类形式,以便呈现它们或在某些应用程序中使用它们。
如何将分类数据转换为数值数据?
这涉及两个步骤
- 整数编码
- 独热编码
1. 整数编码
第一步是为每个唯一的类别值分配一个整数值。
例如,“红”是 1,“绿”是 2,“蓝”是 3。
这称为标签编码或整数编码,并且易于反转。
对于某些变量,这可能就足够了。
整数值之间存在自然的有序关系,机器学习算法可能能够理解并利用这种关系。
例如,上面“名次”示例这样的有序变量将是标签编码足够好的一个例子。
2. 独热编码
对于不存在这种有序关系的分类变量,整数编码是不够的。
事实上,使用这种编码并允许模型假设类别之间存在自然排序可能会导致性能下降或意外结果(预测介于类别之间)。
在这种情况下,可以在整数表示上应用独热编码。这是将整数编码的变量移除,并为每个唯一的整数值添加一个新的二进制变量。
在“颜色”变量示例中,有 3 个类别,因此需要 3 个二进制变量。在表示该颜色的二进制变量中放置“1”,而在其他颜色中放置“0”。
例如
1 2 3 4 |
红色、绿色、蓝色 1, 0, 0 0, 1, 0 0, 0, 1 |
在其他领域,例如统计学,“哑变量”通常被称为“虚拟变量”。
有关如何在 Python 中对分类数据进行独热编码的分步教程,请参阅教程
进一步阅读
总结
在本文中,你了解了在使用机器学习算法时,为什么分类数据通常必须进行编码。
具体来说:
- 分类数据被定义为具有有限标签值集合的变量。
- 大多数机器学习算法需要数值输入和输出变量。
- 整数编码和独热编码用于将分类数据转换为整数数据。
你有什么问题吗?
在下方评论区提问,我会尽力回答。
你没有提到,如果我们有一个具有 3 个类别的分类变量,我们只需要定义 2 个独热变量来避免线性依赖。
嗨,Jason,
非常感谢这个精彩、直观的教程。我正在尝试使用 scikit-learn 的方法来确定如何转换我的分类数据,并且有几个问题。首先,你也可以使用 get_dummies 吗?它是否同样有效,即使最终少了一个二进制列?另外,一旦你转换了分类变量,你就得到了几个新的二进制列,但仍然保留了该分类变量的原始文本形式。我应该删除该文本形式的分类变量还是将其保留在数据集中?
非常感谢你的帮助,
Barbara DiLucchio
是的,删除原始未转换的数据。
嗨,Jason,
很棒的文章——快速提问,我正在查看一个需要将分类数据转换为可处理格式的解决方案。我之前想按照你上面概述的步骤进行标签编码,然后进行独热编码——根据这个例子,如果我有 10 个特征(例如 20x10),每个特征有三个数据类别,结果将是一个 20x30 的数据集,它现在是否已正确格式化以进行缩放和 PCA?
PCA 不适用于独热编码的分类数据。
Jason,我发现独热编码对 PCA 非常有效。有什么反对意见吗?
r
library(ds.anomaly)
#>
#> Attaching package: 'ds.anomaly'
#> The following object is masked from 'package:stats':
#>
#> biplot
library(magrittr)
library(ggplot2)
names(iris)[names(iris) == "Species"] <- "Iris."
# 标准 PCA
eg % do_T2(exclude. = "Iris.", method = "svd")
eg %>% biplot(group. = "Iris.")

r
# 独热编码分类器
eg % do_T2()
eg %>% biplot(group. = "Iris.")

由 [reprex 包](https://reprex.tidyverse.org) (v0.2.1) 创建于 2019-01-16
我预计编码后的向量对于 PCA 来说会过于稀疏,也许我错了。
我有点同意 Jason 的观点,数据对于 PCA 来说会过于稀疏(尽管缩放得很好)。而且,生成的独热编码向量是线性无关的,这使得 PCA 无效(它是一个相当复杂的算法)。如果我说错了,请纠正我。
嗨 Jason,
我喜欢你的文章。
什么时候应该使用独热编码,什么时候应该使用频率/提升率/回归系数来表示分类变量,有什么指导吗?
另外,如果有很多分类变量,在进行独热编码后是否需要检查多重共线性(例如 VIF)?
提前感谢你的回答?
我建议为模型/数据集测试一系列方法,并根据模型性能选择一种表示。
我也推荐尝试嵌入(embedding),它们对分类特征非常有效,尤其是高基数(high cardinality)且具有交互作用的特征。
完全同意……我在阅读文章的同一部分时也有同样的困惑……
非常好的文章。谢谢
你好 Jason。我非常关注你,并非常感谢你的努力和易于理解的教程。只是有一个问题,独热编码如何处理多标签类别?在接下来的教程中,你能否帮助我进行文本数据的特征选择,用于多类别和多标签分类,使用 Keras?我尝试了多类别,使用了 90 个数据点。并使用 Keras 的 MLP、CNN 和 RNN,其中每个数据点都是一个长段落,带有标签,但准确率只有 37.5%。如果你有任何建议,请告诉我。
独热向量的长度将等于标签的数量,但可以指定多个 1 值。
感谢您的建议。
本文介绍了提高深度学习模型技能的方法。
https://machinelearning.org.cn/improve-deep-learning-performance/
非常有帮助。我发现了使用分类数据与树和随机森林的局限性。在我看到你关于独热编码的文章之前,我还不确定正确的解决方案。对于感兴趣的人来说,我还发现了你关于如何在 Python 和其他语言中编程实现的文章。
https://machinelearning.org.cn/how-to-one-hot-encode-sequence-data-in-python/
谢谢。
独热编码的缺点是什么??假设你有一些分类特征,每个特征有 500 个或更多的不同值!所以当你进行独热编码时,数据集中会有很多列,这对机器学习算法来说仍然好吗??
很好的问题!
向量可能会变得非常大,例如,在 NLP 问题中,向量的长度等于你词汇表中所有单词的数量。
大向量会使方法变慢(计算复杂度增加)。
在这些情况下,可以使用密集表示,例如 NLP 中的词嵌入。
Hi Jason,再次感谢你出色的教学。
回到 Espoir 的问题,我遇到了 84 个 user_ID 的问题。我对它们进行 OHE,正如你所说,当我用 SVM 分类器拟合数据时,它看起来像我陷入了无限循环。考虑到我没有遇到 NLP 的情况,我该如何解决这个问题?
谢谢。
你说的陷入无限循环是什么意思?
非常有用的帖子,Jason!
Espoir 提出了我的问题,但我没有理解如何将其应用于我的情况。我有 11,000 多个不同的产品 ID。数据库大约有 130,000 条记录。使用 OHE 时,这很容易导致 MemoryError。我应该寻找什么方法/解决方案?
哎哟。
也许你可以使用高效的稀疏向量表示来减少内存占用?
也许可以尝试探索 NLP 中使用的密集向量方法。也许你可以使用类似词嵌入的方法,让模型(例如神经网络)学习不同输入标签之间的关系(如果存在)。
你好 Jason,如果我们想在视觉上呈现 OHE 后的特征,我们该如何检索它们?
你可以通过 argmax()(例如 numpy.argmax())来反转编码。
感谢你写了这么多精彩的文章!
数据是否也必须进行独热编码才能用于分类树和随机森林,或者它们可以处理没有独热编码的数据?或者只是尝试哪种效果更好?
不,树可以按原样处理分类输入。
在高基数的情况下,模型难道不会开始将整数标签分组到范围内吗?
是的。
你好 Jason,这篇帖子非常有帮助,谢谢!!
问题——一般来说,当我们对有序特征应用独热编码时,模型的性能会如何?你是否建议只在有序特征的情况下使用整数编码?
这 realmente 取决于问题和被编码的特征的含义。
如有疑问,请测试。
明白了,谢谢!
嘿 Jason,
一如既往,这是关于分类变量特征表示的另一篇有用的文章。由于逻辑回归拟合的是 w1X1 + w2X2 +.. 形式的数据点(其中 X 是特征,如分类变量 - 名次、颜色等),而 w 是权重,所以直观上 X 只能取数值才能拟合直线。这是正确的直觉吗?
是的,像逻辑回归这样的回归算法需要数值输入变量。
非常感谢你的解释。我喜欢你的博客和每日邮件摘要。它们帮助我轻松理解关键概念和实用技巧。
谢谢 Raj。
太好了!
谢谢。
解释得很好……谢谢。
谢谢,很高兴对您有帮助。
我喜欢你的博客!
一个问题:如果我们使用决策树等基于树的方法,是否仍然需要独热编码?
非常感谢你!
不,Jie。大多数决策树可以直接处理分类输入。
非常感谢!
没问题。
怎么做?任何资源链接都将不胜感激。
谢谢,
Yash
我不知道有 Python 实现可以直接支持分类数据。我知道算法支持,也许你可以自己实现。
Hi Jason,非常喜欢这个博客……非常喜欢!
我正在使用你的二分类教程作为模板(谢谢!),用于零售销售数据预测器。我基本上是在尝试使用产品特征和小时天气预报来预测未来的小时销售量,并根据高于/低于年平均销售量作为我的二元标签进行训练。
我已经对我的分类数据进行了编码,并且在训练数据时获得了较高的准确率(87%以上),但在尝试使用未见过且规模小得多的数据集进行预测时,准确率会下降(到 26%)。
据我所见,我的问题是由对分类数据进行编码引起的——我的未见数据集中的相同类别具有与我的模型不同的代码。这是否可能是我预测性能不佳的原因:编码后的预测类别与用于训练和测试模型所用的类别不匹配?如果是这样,在实践中如何克服这些挑战?
希望这有意义。
Andrew,做得好!
你的模型可能过拟合了,尝试一个更小的模型,尝试正则化,尝试一个更大的数据集,尝试减少训练。
这里有更多想法:
https://machinelearning.org.cn/improve-deep-learning-performance/
希望这些能作为一个开始有所帮助。
嘿 Jason,我本来以为我没有‘那个’问题,但我可能真的有 🙂
非常感谢。
非常感谢,非常有帮助的文章!!!
问题:如何最好地对分类变量数组进行独热编码?
我也开始了 AI 博文,你也可以在那里找到一些知识:Thebigmoapproach.com/
有很多方法,“最好”取决于工具和问题。
这里有几种方法。
https://machinelearning.org.cn/how-to-one-hot-encode-sequence-data-in-python/
嗨 Jason
一个问题,以“颜色”变量为例,如果颜色是“红”,那么独热编码后,它变成 1,0,0。那么,我们是否可以认为它从一个特征生成了三个特征?
它是否增加了两列,这是正确的吗?
Tom,没错!
Hi Jason,如果我的输入数据是 [1 red 3 4 5],使用独热编码器,red 变成 [1,0,0],这意味着整个输入数据的特征都扩展了吗?
输入数据现在是 [1 1 0 0 3 4 5]
抱歉,我不明白。也许你能重新陈述你的问题?
Hi Jason,谢谢回复。
例如,如果我的输入有 4 个特征,[121 4 red 10; 100 3 green 7; 110 8 blue 6]
对于第一行,与每个特征相关的值——特征 1:121,特征 2:4,特征:red,特征 4:10。
我想现在使用独热编码器,red = [1,0,0],green = [0,1,0],blue = [0,0,1]。
所以我的输入变成 [121 4 1,0,0 10; 100 3 0,1,0] 7; 110 8 0,0,1 6],独热编码后,我们现在有 6 个特征,所以我的训练使用新数据,这样对吗?
谢谢。
你好 Brownlee 博士,
我正在训练一个模型来检测攻击,我需要像你一样的人来帮助我检测代码中的错误,因为我的训练没有产生任何更好的结果。如果你有兴趣帮忙,请通知我。
谢谢你
抱歉,我没有能力审查您的代码。
我正在使用 Tensorflow 开发模型,并且想知道你的书如何帮助我做到这一点,因为它引用了 Keras。谢谢。
我的深度学习书籍展示了如何使用 Keras 库将深度学习应用到你的项目中。它不涵盖 Tensorflow。
Keras 是一个运行在 Tensorflow 之上的库,并且更易于使用。
据我所知,这并不完全正确。正如 Varun 所提到的,你需要少一个列(n-1 列)。所描述的是虚拟编码(dummy encoding),而不是独热编码(one-hot encoding)。虚拟编码有一个主要问题,即与截距值存在完全共线性。因为一个类别所有虚拟值的总和(n 列)总是等于 1。所以它基本上是一个截距。
我认为情况正好相反。哑编码是 n-1 列,独热编码是 n 列。
您好 Jason,我有一个数据集中有 6 个分类值。我有的数据中有很多缺失的分类值,它们被留为空字符串。如果我有缺失的分类值该怎么办?我也需要对它们进行独热编码吗?或者如何处理带有缺失值的分类特征?
我正在使用 scikit-learn,并尝试了我的数据集的许多算法。
我在那里列出了一些处理缺失数据的方法。
https://machinelearning.org.cn/handle-missing-data-python/
嗨,Jason,
首先感谢您的帖子!
您解释的有些地方我没理解:我们以颜色为例(红色是 1,绿色是 2,蓝色是 3)。
我不明白“类别之间的序数关系”:独热编码是否比这些类别为某些学习算法带来更好的准确性?(到目前为止,我的想法是:算法读取 1、2 或 3 而不是红色、绿色或蓝色,并进行必要的关联以进行预测,这对预测准确性没有影响。)
嗯。抱歉没有说清楚。
序数意味着有序。有些类别是自然有序的,在这些情况下,一些算法通过仅使用整数编码可能会获得更好的结果。
对于类别无序的问题,整数编码可能比独热编码性能更差,因为算法可能会基于分配的数字假设一个错误的顺序。
这有帮助吗?
有点困惑。如果我们正确地对整数标签进行了排序,我们还需要独热编码吗?实际上,标签影响准确性有点愚蠢。我认为独热标签是为了简单,但您说的是在整数标签未正确排序的情况下。
如果我们正确地对整数标签进行了排序,那么我们还有使用独热编码的理由吗?
我接受您解释的为什么我们需要使用整数编码而不是字符标签。
谢谢你
我当时说的是,如果你的变量值不是序数的,而你在拟合模型时将它们视为序数(例如,不使用独热编码),你可能会损失技能。
这有帮助吗?
我的数据来自 20,000 家商店。每家商店都有自己的整数 ID。这个 ID 没有意义,只是一个 ID。我应该在数据集中添加 20,000 个二元变量吗?以及 LTSM 输入层中的 20,000 个神经元?这听起来令人望而生畏……
不,除非您认为 ID 具有预测性(例如,编号映射到地理区域,并且区域具有相似的结局),否则请删除 ID。
好的,我有每家商店的纬度和经度。我应该用它们代替 ID 吗?类似的问题。我有 17 种天气状况(阴天、雨天等)。我应该用 17 个二元变量替换它们吗?或者我应该尝试给它们分配整数代码来显示大雨与小雨、晴天与多云和阴天的相似性?
没有规则,我鼓励您尝试许多不同的方法,看看哪种方法最适合您特定的数据。
我有一些可以建议的偏见,但最好(您的结果会更好)通过实验来发现适合您问题的方法。
是的,没错,谢谢。
这是一个很棒的帖子,Jason!很高兴我看到了它。它真的帮助我理解了独热编码的必要性。我是机器学习新手,目前在 R 中为分类问题运行 xgboost。
我有两个问题
(1) 如果我的目标变量(我想预测的变量)是分类的,我是否也应该使用独热编码将其转换为数字形式,还是简单的标签编码就足够了?
(2) 有没有特定的 R 包用于特征的独热编码?
这确实取决于方法。这可能会有帮助。
抱歉,我不记得是否必须为 xgboost 编码 R 中的变量,这已经是很久以前的事了。
大多数 R 机器学习方法都可以处理因子,而无需显式进行独热编码。但 xgboost 是一个例外,因此您需要使用像 sparse.model.matrix() 这样的函数在将数据集传递给 xgboost 之前对其进行编码。(此函数实际上将因子编码为“指示变量”,而不是独热编码,但基本思想是相同的。)
好。
Jason,您还没有回答第一个问题。
我也需要知道同样的事情。
(1) 如果我的目标变量(我想预测的变量)是分类的,我是否也应该使用独热编码将其转换为数字形式,还是简单的标签编码就足够了?
通常,在建模时会编码所有分类变量,因为机器学习算法必须处理数字。
这包括模型的输入和输出。
这是否意味着特别需要独热编码,还是整数编码就足够了?
也许可以两者都试试。
你好,Jason
我的数据集中有数字和标称类型。它还有缺失值。对于标称数据类型,我首先应用 Labelencoder() 将它们转换为数字值,但除了我的两个类别(正常、异常)之外,它还为 NaN 分配了一个代码。在这种情况下,我如何通过其均值进行插补?
在这种情况下,您可以使用众数进行插补。
嗨,Jason,
由于应用 OneHotEncoding 后为分类列创建的列数等于该分类列中的唯一值数量;通常会出现测试模型中的特征数量与对数据集应用 OHE 后要预测的数据集中的特征数量不相等的情况。在这种情况下,模型在预测时会报错,因为它期望训练集和要预测的数据集具有相同数量的特征。您能否就如何处理这种情况提出建议?
用于训练的同一转换对象然后用于测试或任何其他数据。如果需要,可以将其保存到磁盘。
嗨,Jason,
我没明白您说的“同一转换对象”是什么意思?训练数据集的结构(初始特征数量)在训练集和测试/待预测数据集之间是相同的。但每个特征/列下的值的唯一性可能不同,这是很自然的。因此,OneHotEncoding 或 pandas get_dummies 在测试/待预测数据集中创建的编码特征数量与训练数据集不同。如何处理这个问题——这就是我的问题。
请给我建议。
谢谢。
抱歉。为了说得更清楚,您可以对训练数据训练转换对象,并在测试集和其他新数据上使用它们。
转换对象可能是标签编码器和独热编码器。
训练数据应涵盖给定特征的所有可能标签。
这有帮助吗?
嗨,Jason,
对于只有两个级别(是/否)的二分类变量,我应该进行独热编码吗?例如,变量只包含(是/否),将其转换为两个变量(0/1)和(1/0)?
谢谢。
通常不需要。
对于具有 4 个值的分类变量 State 的独热编码 (OHE):NJ, NY, PA, DE
我们可以移除其中一个,例如 DE,以降低复杂性。
所以,如果 NJ=0,NY=0,PA=0,那么它就是 DE。
是否推荐移除一个?
在二元分类变量的情况下,这一点更为明显。
谢谢。
如果您可以简化数据,那么我建议这样做。
但请始终测试更改对模型技能的影响。
pd.get_dummies() 的独热编码在训练数据集时有效,但当使用保存的训练模型预测单个数据行时,同样的方法无效。
例如,如果您的训练集中有“性别”,那么 pd.get_dummies() 将创建两个列,一个用于“男性”,一个用于“女性”。一旦您保存了模型(例如通过 pickle),并且您想基于单行进行预测,那么该行中只能有“男性”或“女性”,因此 pd.get_dummies() 将只创建一个列。发生这种情况时,列的数量不再与您训练模型的列数量匹配,从而导致错误。
您知道解决此问题的方法吗?我的实际需求是使用邮政编码而不是性别,这更复杂。
我建议使用 sklearn 的 LabelEncoder 和 OneHotEncoders,对您数据的合理样本(覆盖所有情况)进行操作,然后将编码器 pickle 化以供以后使用。
谢谢!!!
嗨,Jason,
我正在跟进一些关于 n-1 编码和 n 编码的其他问题。我有一个数据集,我使用 sklearn 的 LinearRegression(也尝试了 Ridge)来根据星期几预测价格。我使用了 sklearn 的 DictVectorizer 来准备我的数据,最终得到了 7 列表示星期几,而不是 6 列。在上面的一些问题中,您指出更简单的更好……尽管您也说过要“测试更改对模型技能的影响”。您能否进一步解释一下——例如,使用其中一种或另一种对我这样的数据集(特征=星期几;目标=价格)有什么实际影响?我的模型似乎吐出了一个合理的 y 截距,尽管我不确定确切的 y 截距是什么,因为我的模型没有 [0, 0, 0, 0, 0, 0, 0] 来表示星期几(即没有“参考”星期几)。
使用 n-1 与 n 编码在数学上有什么原因吗?我希望这有意义。我已经谷歌搜索了大约 50 次,找不到一篇真正深入研究此问题的文章。谢谢。
如果您的目标是最佳的模型技能,那么就使用任何能提高该技能的方法。
不需要理想化的理由。
非常有帮助,谢谢。
我可以问一下,如果字符串中有 4 个可能的字母,我想对它们进行编码(比如 A, B, C, D),这对神经网络来说哪个更好?独热编码还是整数编码?这些组没有顺序,所以我会选择独热编码,但不知道神经网络是否能处理整数编码(这将意味着将四分之一的特征进行独热编码)?
谢谢!
如果类别之间没有序数关系,则使用独热编码。
我是这方面的新手,所以这可能是一个愚蠢的问题,但这只能在类别数量较少且问题是分类问题时使用,对吗?
独热编码可用于任何类型问题的输入特征,也可用于分类问题的输出特征。
你好 Jason,我有一个问题:如果有像“一等舱”、“二等舱”、“三等舱”这样的分类变量用于房屋价格预测,如果我用独热编码进行转换,算法将如何判断房屋的等级部分?是的,它将其转换为二进制,但它是否也考虑了该分类变量的等级?另外一个问题是,为了获得二进制输出,“pd.get_dummy”有用还是 OneHotEncoder 有用?
独热编码用于分类问题,而不是回归问题。
房价是一个回归问题,我们预测一个数量。
您好 Jason,我有一个包含超过 500 个唯一值的字符串数据的集合。我该如何编码它以便可以将其传递给 ML 算法?它适合进行分类编码吗?
这太多了。我建议使用 NLP 表示法,例如词袋模型或词嵌入。
我在这两方面都有帖子,从这里开始。
https://machinelearning.org.cn/start-here/#nlp
嗨,Jason,
这是一个很棒的帖子,感谢您提供如此有价值的信息。我的问题是:
如果颜色列中有许多颜色,比如 25 种颜色,我们是否可以用 RGB 值将颜色编码到 3 列中,而不是 25 个二进制列?您认为这种方法有什么异常吗?
没问题,它将是一个包含 25 个元素的二进制向量。
你好,Jason。
我是一名数据科学实习生,没有数据经验。感谢您的帖子和电子邮件,它们增强了我的信心,让我可以开始我的机器学习和深度学习实习。
目前,我有一个 10GB 的数据集,在进行初步调查后,我发现了以下情况。
特征 ‘x1’ 有 78 个唯一类别
特征 ‘x2’ 有 24 个唯一类别
特征 ‘x3’ 有 24 个唯一类别
特征 ‘x4’ 有 35 个唯一类别
特征 ‘x5’ 有 40 个唯一类别
特征 ‘x6’ 有 106 个唯一类别
特征 ‘x7’ 有 285629 个唯一类别
特征 ‘x8’ 有 523912 个唯一类别
特征 ‘x8’ 有 27 个唯一类别
特征 ‘x9’ 有 224 个唯一类别
特征 ‘x10’ 有 108 个唯一类别
特征 ‘x11’ 有 98 个唯一类别
特征 ‘x12’ 有 10 个唯一类别
特征 ‘x13’ 有 1508604 个唯一类别
特征 ‘x14’ 有 15 个唯一类别
特征 ‘x15’ 有 1323136 个唯一类别
特征 ‘x16’ 有 3446828 个唯一类别;特征 ‘x17’ 有 10 个唯一类别
特征 ‘x18’ 有 200 个唯一类别
特征 ‘x19’ 有 2575092 个唯一类别
特征 ‘x20’ 有 197957 个唯一类别
您如何处理这个数据集……它有分类和整数属性。这是一个分类问题。只需预测结果,例如 0 或 1。您如何处理类别或如何对这些属性进行编码?
我应该只使用标签编码器、独热编码器还是哑变量?最终是否可能对如此大的类别进行编码?
我感到困惑,从哪里开始。
期待您的建议和帮助。
类别太多了。
也许可以删除一些特征?
也许可以合并每个特征的类别?
您可以在这里开始特征选择。
https://machinelearning.org.cn/an-introduction-to-feature-selection/
这篇文章归结为一句话:
“使用这种编码并允许模型假设类别之间存在自然顺序可能会导致性能不佳或意外结果(预测介于类别之间)”。
这就够了。谢谢。
不太对。
这适用于整数编码,而不是独热编码。
事实上,这正是独热编码要解决的问题。
我不同意独热编码的方法。我的意思是,这取决于算法。我的观点基于在许多 Kaggle 竞赛中与真实世界数据一起玩弄分类数据和各种算法。
例如,LightGBM 在使用本机分类特征时可以提供良好的准确性。不像简单的独热编码,LightGBM 可以找到分类特征的最优拆分。这种最优拆分可以提供比独热编码解决方案更好的准确性。(官方文档:https://lightgbm.cn/en/latest/Advanced-Topics.html)
PS:与其他 GBM(本机 gbm、h2o gbm 甚至 xgboost)相比,lightgbm 在速度和准确性方面遥遥领先。
谢谢你的说明,Pranav。
Pranav,您能否提供任何基准测试结果的链接,显示 lightgbm 相对于 xgboost 的速度和准确性更优?
抱歉!
我对哑变量与普通数值变量的 dtype 感到困惑。
以 Python 为例:
如果我在 pandas 中使用 get_dummies 函数将分类变量转换为哑变量,它将返回二进制数,并且这些哑变量的 dtype 是整数。Python 如何确定这些“int”变量是哑变量,为什么 Python 不会将这些“int”与其他普通数值变量混淆?
Python 会将这些哑变量(dtype = int)视为数值变量吗?
(int 类型是数值类型的一种,并且是可计算的,不是吗?)
这个问题可能有点愚蠢,但这确实困扰了我一阵子……
谢谢你的帮助!
这是计划,让算法像对待其他数值变量一样对待它们。
这有帮助吗?
尽管算法像对待其他数值变量一样对待它们,但模型的工作方式就像它们有分类变量和数值变量一样,对吧?
在 R 中,我可以将一个变量设置为“因子”通过“as.factor”,然后直接将其提供给模型,这非常直观,所以当我使用 Python 做同样的事情时,我感到困惑,尽管我最初知道它应该通过 get dummy 进行预处理……
我认为这是哑变量的概念……但我对哑变量在编程语言中的工作方式感到迷茫……
谢谢你的帮助!
使用 sklearn 和 keras,您必须进行整数编码或独热编码。
Python 中的其他库可能不适用于此。
非常感谢!
嗨 @Jason Brownlee。当我们想预测新数据集时,我们如何获得恒定的哑变量?
我有一个案例,我使用转换为哑变量的变量生成了一个模型。在独热编码后有 13 个哑变量。我从神经网络构建了模型。
现在我要预测一些新数据集的行。当然,数据必须进行独热编码。但结果是独热编码后有 9 个哑变量。
我仍然不明白如何理解这个问题。似乎这些哑变量之间存在不平衡。有什么解决方案可以解决这个问题吗?
您必须对新数据使用与训练数据相同的编码过程。
您可能需要保存涉及的对象。
您好,@Jason Brownlee,
您能否指导我关于 .pcap(网络捕获文件)的协议列相关的 Info 列?
我应该如何处理 Info 列,最终我必须进行分类。
此致,
抱歉,我对您的数据集不太熟悉。
您能否列出哪些机器学习算法不能妥善处理分类变量,并且需要进行独热编码或虚拟编码,而决策树则不需要?
这取决于算法的实现(例如,库)。
例如,在 Python 中,几乎所有的 sklearn 实现都要求对输入的分类变量进行编码。
Jason - 感谢您对大家问题的帮助和之前的回复,我真的很感激。但这里还有另一个问题……
我正在尝试预测每月家庭千瓦时 (kWh) 的使用量,其中包含 100 多个与社会经济、人口统计、住房特征、电器数量/质量等相关的变量。由于许多变量是由于之前“否”或“0”的答案而自然出现的 NA,我正在考虑对分类变量进行独热编码以“去除”NA……我也将对有序结果变量进行分箱以尝试分类算法……您有什么看法?
再次感谢您的帮助!
也许可以尝试用最近几天/周/月的数据的平均值来填充缺失值?
这可能也有帮助
https://machinelearning.org.cn/handle-missing-timesteps-sequence-prediction-problems-python/
Jason,这篇文章写得太好了。如果您能就一个稍微相关的问题给我一些建议,那就太好了。
我有一个有序的列,比如熟练度 = 初学者、中级、高级、专家。
在对其进行标签编码后,我得到 (0, 1, 2, 3)。
另一列是数字列,年龄。
最后一列是布尔值,is_certified (1, 0)
我想知道是否需要对熟练度列进行标准化(类似于年龄),因为它是一列新创建的数字列。
尝试加上和不加,看看它对模型技能有什么影响。
我相信您已经厌倦了讨论这个问题,但我认为我的虚拟编码与独热编码的情况与之前讨论的情况足够不同,值得回复。
假设您正在对一个跳棋盘进行编码,您可以使用长度为 5 的独热编码,或者 4 个虚拟变量来表示棋盘上每个格子的占用情况(每种颜色的兵和王,共 4 种可能的棋子)。
直观地说,这 4 个虚拟变量代表了可以占据一个格子的 4 种可能的棋子,并且未被占据的格子由所有未被占据的虚拟变量(零值)表示。但是,同样容易的是,白王子的虚拟变量可以与未被占据的虚拟变量互换,并表示相同的数据。
不太直观的虚拟编码可能和更直观的编码表现一样好吗?(或者更普遍地说,所有的虚拟编码都表现相似吗?)
如果它们不产生相同的性能,并且问题没有直观的解决方案,有没有办法指导在虚拟编码中省略哪个变量(假设模型过于复杂,无法尝试所有可能性)?
另外,在跳棋占用情况这样的示例中,独热编码中的一个变量是否代表了其他变量的缺失(空方格),这是否会影响表示的选择方式?
总之,感谢您的文章!很高兴能学习到用于我工作中内容的正确术语。
问题表示很难,而且大部分是艺术。
您希望暴露足够的信息,以便模型能够解释情况并进行学习,例如,提供改进的梯度。
对于棋盘游戏的表示,也许可以查看全球优化/遗传算法领域几十年的研究成果,这些领域已经在这方面进行了大量工作,如何最好地表示游戏状态?
你好,先生,
我的数据中有一个分类特征。我对其进行了独热编码并训练了一个模型。我想让这个模型预测新的数据(单个观测值)。我该如何将这个带有分类字段的新观测值提供给模型?
新数据必须像训练数据一样进行准备。
嗨,Jason,
假设我有一个数据集中有多个(超过两个)输入变量是分类数据类型,我该如何应用独热编码器,以及如何处理虚拟变量陷阱?
一次编码一个变量。
我正在分析钻石数据集。我有一个具有“Fair”、“good”、“Excellent”级别的变量。在将其转换为因子后,我是否应该使用像这样的代码 - stone$cut<-revalue(stone$cut,c("Fair"=1,"Good"=2,"Ideal"=3,"Premium"=4,"Very Good"=5))?或者我应该使用这段代码 -
stone$cut<-factor(stone$cut,ordered=T,levels=c("Fair","Good","Ideal","Premium","Very good"),labels=c(1,2,3,4,5))?
你好
我如何映射分类
值到数值表示。
a) 一周中的天数
b) 字母表中的字母
c) 邮政编码
可以以任何您想要的方式进行,只要保持一致即可。
嗨 Jason,我想问你关于对年龄进行编码的问题,我正在处理句子,需要从句子中估算年龄,所以我使用了 LSTM 模型,但结果很差。
我已经进行了词性标注(POS tagging),并使用独热表示进行了编码,对年龄也是如此。
我有 78 个可能的年龄,从 15 到 94,所以我用独热编码对它们进行了编码,准确率为 38%,所以我想知道该怎么做。
例如:POS = VERB = 10000000000, POS = NOUN = 01000000000
年龄 = 15-25 = 1000000, 年龄 = 25-35 = 0100000
很有趣。也许可以在 scholar.google.com 上搜索类似的问题?您可能需要发挥创意。
嗨 Jason,感谢您写得如此清晰且有用的帖子。
我有一个小问题。既然可以进行直接的独热编码,为什么还要进行整数编码?
Pandas 在对分类变量调用 get_dummies() 时似乎就是这样做的。
谢谢!
对于具有顺序关系的类别,使用整数表示可能对某些模型更有意义。
嗨 Jason,当我在神经网络中使用分类特征时,我需要进行编码吗?谢谢
是的,尝试使用有序变量的整数编码,尝试使用独热编码或嵌入来处理分类变量。
当属性只有两个分类值时,我们需要独热编码吗?
通常不需要,但可以尝试一下,并评估它对模型性能的影响。
你好,
独热向量的位总是用逗号/空格分隔,还是它们可以像二进制数字一样连接在一起?根据机器学习理论,它们的确切性质是什么?我需要在我的当前项目中使用这些信息。
谢谢。
每个二进制变量通常是一个单独的列。
嗨,Jason,
如果您想将独热编码输入到 LSTM 中,该怎么办?我知道 Keras 需要
[num_samples, num_timesteps, num_features]
现在假设 num_features 中的每个特征都有一个相关的独热编码。那么我将得到这样的形状
[num_samples, num_timesteps, num_features, one_hot_shape]
这样做可以吗?
[num_samples, num_timesteps, num_features*one_hot_shape]
有没有什么情况这样做不好?
不行。独热编码会创建许多特征。如果您有多个独热编码的特征作为输入,那么这些二进制向量将作为输入连接起来。
谢谢您的回复。好的,这是否意味着我应该连接每个长度为 one_hot_shape 的二进制向量,以便我拥有 num_features 个这些 one_hot_shape 向量,然后将它们输入到 LSTM 中?
是的。
嗨,Jason,
我们在逻辑回归模型中使用独热编码。我们如何解释系数,特别是摘要表中的“估计”值?
您所说的“摘要表中的估计值”是什么意思?
嗨 Jason,在我的神经网络中可以使用 Company_Id 的独热编码吗?
有 1200 个 ID,这太多了。
整数编码会考虑公司 ID 的顺序,这可能会使我的模型产生偏差。
您有什么建议?
是的,可以尝试一下,并与整数编码进行结果对比。
我们是否必须对字符串格式的分类值进行独热编码(或使用虚拟值),还是必须对所有分类变量都这样做?即使变量是整数?
不一定需要,但也许可以比较使用和不使用编码的性能,以确认它是否增加了价值。
如果您的数据中有一个像邮政编码这样的列。您会推荐使用整数编码还是独热编码?
尝试两者,也尝试嵌入。我预计嵌入效果会更好。
嗨,Jason,
在客户流失的情况下,我们需要对月度数据(例如 3 个月)进行独热编码并将其转换为列吗?当每个客户有多行时会怎样?像逻辑回归、决策树、随机森林这样的分类器能正确读取这些数据吗?或者是否绝对需要始终每位客户一行才能从这些算法中正确实现二元分类?
通常数据会被反规范化,以便您拥有被建模的每个实体一行,例如每个客户一行。
嗨,Jason,
如果我所有的分类变量都是二维的,那么独热编码是必需的吗?
可能不是必需的,您可以将二元输入(整数输入)与独热编码输入进行比较。
嗨 Jason,感谢您的帖子,非常有帮助。
我有一个问题,我需要向我的模型呈现循环特性:在这种情况下,特性是循环嵌套级别及其大小。循环包含指令,因此每个循环都有一个指令向量,每个指令都有其自身的特性。
我的特性看起来大致如下:
我真的不知道如何呈现它们,特别是我的某些输入是标量,有些是向量,有些是 ID,有些则与其他输入无关!
我将非常乐意接受任何建议。非常感谢!:)
抱歉,我没有能力审查和评论这个。
总的来说,我建议头脑风暴多种解决问题的不同方式,对每种方式进行原型设计,然后看看哪种方式能很好地适用于您的特定数据集。
是的,你说得对。我做了一些类似您建议的事情,并且我设法将我的问题总结为以下输入:
00-我将我的神经网络用作连续函数来预测一种称为循环展开的循环优化因子。
01-我的输入长度是可变的。
02-我必须一次性提供我的输入。
03-由于第二个原因,RNN 对我来说将无法工作。
04-如果我使用 MLP,我必须固定输入数量,在这种情况下,我可能会处理“0”填充,但根据我所读到的关于“0”填充的信息,它不是一个好的解决方案,并且在我们的训练示例中可能会有很多输入设置为“0”时会影响准确性。
05-也许我必须改变特征的结构以获得固定数量的输入。
只是我不确定“0”填充是否真的那么糟糕!这个解决方案是否取决于问题的性质,我的意思是对于某些问题这可能是一个有效的解决方案,而对于其他问题则不是?
感谢您的任何建议。
如果您使用掩码层,则会忽略填充值。
嗨,jason
我有一个数值数据集,其中一些是分类的,如城市代码、银行代码……,我应该使用编码还是仅将它们转换为类别类型?
我建议为每种方法尝试几种不同的编码方式,看看哪种能带来最佳的模型性能。
Jason您好!好文章!我有一个多类别分类问题,我的类别是相关的,就像您提供的“地点”示例一样。问题是它们是在二维环境中相关的。我的类别是笛卡尔平面上的(x,y)对。我可以为每个位置分配整数,甚至可以使用独热编码,但我担心坐标/位置之间的关系不会被保留。这个问题有解决方案吗?或者除了多类别分类之外,还有其他方法可以建模这个问题吗?谢谢!
也许可以探索一种嵌入方式,也许为输入使用不同的分辨率?
嘿 Jason,
当一个列中有大约300个唯一值时,我该怎么办,例如:我有一个城市列,其中大约有300个唯一的城市,我该怎么办。
我应该使用OneHotEncoder吗?这样在数据集中有这么多列是可以的吗?
在这种情况下我该怎么办?请解释一下!!
如果它们对每一行都是唯一的,也许可以删除它们?
如果它们在多于一行中使用,尝试整数编码,独热编码,如果您使用神经网络,也许可以尝试嵌入?
独热编码如何解决问题?你能给我一个确切的答案吗?
具体是什么问题?
Jason您好,内容一如既往地精彩。
如果我可以问一下,如果我们看到标签与因变量之间存在线性关系,为什么我们不使用标签而不是独热编码呢?
例如:如果我们获得汽车经销数据并考虑汽车类型数据,我们会发现掀背车是最经济实惠的,然后是轿车,然后可能是卡车等。所以,如果我们能按价格区间对这些类别进行编码,这是否可行?
机器学习算法使用数字进行工作。
标签是字符串。
我们可以将字符串建模为整数,称为整数编码,如果标签具有顺序关系,例如一周中的几天,这样是有意义的。
我们可以使用独热编码来建模字符串标签,这对于名义关系更有意义,例如汽车类型。
早上好,Jason,
我有一个快速问题。我正在尝试对包含分类和数值变量的数据集使用KNN算法。我已经缩放了数值变量,并为分类变量使用了独热编码。当我在计算距离度量时,我计算如下:当我比较两个样本,一个为男性,一个为女性
男性 (1,0)
女性 (0,1)
距离计算是 abs((1-0) + (0-1)) = 2。
在某些情况下,这不会正确分类。我猜是因为距离2与数值特征贡献的其他距离相比是一个非常大的数字,因为它们被缩放为0到1之间。
我是否需要缩放这些独热编码变量以避免此问题,以及如何缩放它们?请提供建议。
谢谢
Satya
通常我们不需要缩放独热编码的特征。
谢谢Jason的快速回复。再问一个快速问题。
sex_male sex_female
例1 1 0
例2 0 1
例1和例2之间的距离,是否因为它们在两个位上不同而为2?还是需要做其他事情?请提供建议。
谢谢
Satya
这取决于您想使用的距离计算方法。
应该是根号2,因为它在向量空间中是斜向的?
您是指欧几里得距离吗?
https://en.wikipedia.org/wiki/Euclidean_distance
早上好,Jason,
我的数据集同时包含分类和数值变量,如下所示 – 我对性别变量使用了独热编码。- 尝试计算 instance_1 和 instance_2 之间的距离。
实例_1
—————-
sex_male 1
sex_female 0
salary 0.4
service 0.6
实例_2
—————
sex_male 0
sex_female 1
salary 0.6
service 0.7
如何计算这两个之间的距离?我的计算如下:
abs(0-1) + abs(1-0) + sqrt((06 -04)^2 + (0.7 – 0.6)^2)
1 + 1 + 一个很小的数字
所以距离似乎受到分类变量的影响更大?请提供建议。
谢谢,
Satya
可以尝试欧几里得距离
https://en.wikipedia.org/wiki/Euclidean_distance
或者曼哈顿距离
https://en.wikipedia.org/wiki/Taxicab_geometry
嗨,Jason,
如果我在训练数据上使用 get dummies,我会得到新的列,如“columnName_cellValues”,基于不同的类别,然后我构建模型并保存它,
之后我们加载模型和一个新的测试数据(只有一个记录),此时如何根据其值在新测试数据中获取新的列名以匹配模型中的列名。
谢谢
数据必须以相同的方式编码。实现这一目标的一种方法是在训练数据集上拟合编码,并保存编码对象以备后用。
感谢您的回复,
我使用LabelEncoder对二元列进行编码,然后对具有2个以上唯一值的列使用get_dummies,请问如何保存以备将来使用?
cat_columns = df.dtypes[df.dtypes == “object”].index
binary_cols = [col for col in cat_columns if len(df[col].unique())==2]
df[binary_cols] = df[binary_cols].apply(lambda col: LabelEncoder().fit_transform(col))
more_than_3_columns = [col for col in cat_columns if len(df[col].unique())>2]
df = pd.get_dummies(df, columns=more_than_3_columns, drop_first=True)
谢谢
干得好!
您可以使用 pickle 来保存对象。
https://machinelearning.org.cn/save-load-machine-learning-models-python-scikit-learn/
James您好,我有一个关于独热编码的问题。
我有一个名为country的分类变量。它有149个国家。为大量国家创建独热编码会影响性能,因为大多数值都是0。
当分类特征值数量巨大时,如何处理这种情况?
我应该选择简单的标签编码吗?
谢谢
一个150个元素的向量不是什么大问题。我不担心它。
我曾处理过50K个独热编码向量而没有出现问题。
嗨,Jason,
好文章。我有5个因变量,每个因变量都有5个以上的类别,我应用了独热编码技术,但不知道在独热编码后应该删除哪个列。
原始分类特征(编码前)将被删除。
Jadon您好,
感谢您的有用教程。
我应用SVM、KNN、决策树、朴素贝叶斯和随机森林来分类Statlog(Heart)数据集,该数据集包含性别特征,为男性和女性。
我使用了整数编码,即男性=1,女性=1。
有必要使用独热编码吗?如果需要,它对性能的影响是什么原因?
我非常热衷于知道答案。
祝好
玛丽
测试不同的方法是个好主意,因为我们的直觉往往会出错。
你好,
假设我有一个包含3个唯一值的分类数据列,例如法国、德国、西班牙。那么在标签编码和独热编码之后,我得到三个附加的列,它们是1和0的组合。我在网上读到,仅仅标签编码会给算法一种印象,即列中的值是相关的。所以我们进行独热编码。独热编码后,它会给出3个附加的1和0列。机器学习算法如何知道这些值是不相关的?
它们只是模型的输入,而某个模型会弄清楚如何最好地使用它们。
更好的方法是使用一种学习到的嵌入,它可以明确地将它们关联起来。
Jason,
我的数据集中有4个分类列,其中3个是名义性的,1个是顺序性的。我的想法是使用pd.factorize或preprocessing.LabelEncoder进行编码,但对于3个名义性变量不带顺序,对于1个顺序性变量带顺序(因为输出结果是每个列的一个维度)。我宁愿不对名义性变量进行独热编码,因为它会显著增加维度。
在使用pd.factorize()或preprocessing.LabelEncoder()时,如何控制排序或权重部分?
好问题。
自己编写一些自定义代码来执行映射可能会更容易。
但是如何确保模型不会为名义变量假定顺序呢?
如果使用了OHE,就不会假定顺序。
维度增加不是我想要的,同时模型不应该假定名义变量有任何顺序。
pd.factorize和labelencoder的问题是模型可能会假定某种顺序,而OHE的问题是维度增加……如何同时解决这两个问题?
您可以使用嵌入,它对每个类别更具代表性,并且维度更低(您可以选择它)。
亲爱的 Brownlee,
我是您优秀博客的读者,但我在这里引用了这篇文章
https://www.kaggle.com/niyamatalmass/logistic-regression-in-tensorflow-for-beginner
该教程将读者引导至此,以解释为什么在将数值特征馈送到LR之前将其转换为独热编码。
这里的问题是,您的帖子只谈论将分类数据转换为独热编码,而不是谈论为什么需要将整数值转换为独热编码。
如果整数编码的变量实际上不是顺序的,那么独热编码是一个好主意。
如果是顺序的,独热编码仍然可能有用,值得一试。
至于页面链接到此帖的原因,也许可以联系该页面作者?
嗨,Jason,
好帖子!
我有两个问题想问您。
我已将独热编码应用于我的二元分类问题(例如,正例标签为[0, 1],负例为[1, 0]),那么AUC分数远优于使用[1]作为正例和[0]作为负例。您知道原因吗?
其次,我注意到如果我使用独热编码以及“roc_curve(y_test.ravel(), y_prob.ravel())”,AUC可以达到0.75。但是,如果我只使用“roc_curve(y_test[:, 0], y_prob[:, 0])”,AUC只有0.55。这是否意味着我的模型真的很差?
非常感谢!
最小值
这很有趣。我不知道,它应该是等效的。
我不确定您正在比较的两种情况之间的区别,抱歉。
谢谢,您能否更详细地说明变量的二进制格式编码如何确保它不会异常地影响ML决策。
例如,3种颜色被编码为0,1,2,这仍然是一个数学差异,而二进制编码则使它们相等,我很初学者,不明白二进制版本如何使3种颜色相等,使它们变得无关紧要。
编码不是关于建模问题,而是提供数据给给定模型的一种一致的方式(数字而不是字符串)。
这有帮助吗?
亲爱的 Jason,
我真的很欣赏您的帖子。
读取/解析独热编码数据时内存会增加。能否告诉我原因以及如何避免?这是示例代码
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown=’ignore’)
df = pd.DataFrame(dataframe.iloc[:88000, 1:].values)
temp_df1 = df
enc.fit(temp_df1)
enc_t1=enc.transform(temp_df1).toarray()
temp_df = enc_t1
for data in temp_df
temp_in=[]
for dt in data
temp_in.append(dt)
这会增加内存大小。
在这里,如果我们注释掉以下两行
for dt in data
temp_in.append(dt)
内存不会增加。
提前感谢。请澄清。
一些想法
您可以使用数据的较小样本。
您可以使用更多RAM的机器。
您可以尝试分层独热编码。
您好,您的帖子很有信息量,但我在这里遇到了一个问题,即我的数据集的因变量(目标类别)有38个特征,现在我想通过get_dummies方法将其数字化,但它给了我38个其他列,现在当我训练模型时,我得到这个错误,您不能使用38列作为目标,而是需要使用这38列中的一列。所以请帮助我。
也许您可以使用本教程作为起点,并为您的数据集进行调整。
https://machinelearning.org.cn/machine-learning-in-python-step-by-step/
我的数据帧是分类的,所以我需要使用独热编码,但不是对所有数据,而是对预测的目标我想要使用标签编码,可以吗……。
听起来很棒。
我使用这段代码来预测攻击类型,所以我对7个属性使用了独热编码,并且对目标使用了标签编码。
但是数据集包含超过180000行和8个属性,所以这就是我所做的,我想确保它是正确的。
l = LabelEncoder()
df1_onehot = df1.copy()
df1_onehot = pd.get_dummies(df1_onehot, columns=[‘gname’], prefix = [‘gname’])
df1_onehot = pd.get_dummies(df1_onehot, columns=[‘city’], prefix = [‘city’])
df1_onehot = pd.get_dummies(df1_onehot, columns=[‘region_txt’], prefix = [‘region_txt’])
df1_onehot = pd.get_dummies(df1_onehot, columns=[‘weaptype1_txt’], prefix = [‘weaptype1_txt’])
df1_onehot = pd.get_dummies(df1_onehot, columns=[‘country_txt’], prefix = [‘country_txt’])
#df1_onehot[‘attacktype1_txt’] = l.fit_transform(df1[‘attacktype1_txt’])
print(df1_onehot.head())
# 分离出验证数据集
from sklearn import model_selection
array = df1_onehot.values
X = array[:,0:11372]
Y = array[:,2]
validation_size = 0.20
seed = 4
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
seed = 7
scoring = ‘accuracy’
models = []
models.append((‘LR’, LogisticRegression(solver=’liblinear’, multi_class=’ovr’)))
#models.append((‘LDA’, LinearDiscriminantAnalysis()))
#models.append((‘KNN’, KNeighborsClassifier()))
#models.append((‘CART’, DecisionTreeClassifier()))
#models.append((‘NB’, GaussianNB()))
#models.append((‘SVM’, SVC(gamma=’auto’)))
# 依次评估每个模型
results = []
names = []
for name, model in models
kfold = model_selection.KFold(n_splits=10, random_state=seed)
cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
results.append(cv_results)
names.append(name)
msg = “%s: %f (%f)” % (name, cv_results.mean(), cv_results.std())
print(msg)
抱歉,我没有能力审查/调试代码。
也许可以发布到stackOverflow?
嗨,Jason,
非常感谢这篇文章。
如果我有几百个类别(产品类型)该怎么办?我不能使用独热编码,类别太多了。
谢谢
马丁
您可以使用嵌入,请参阅本教程。
https://machinelearning.org.cn/how-to-prepare-categorical-data-for-deep-learning-in-python/
在所有回归和分类方法中,我们是否总是需要排除一列进行独热编码以避免虚拟变量陷阱?
依我经验不是。您对变量进行独热编码,然后删除原始变量。
亲爱的 Jason,
感谢您的教程。
我有2个问题
1、如果一个属性有许多类别,并且对象同时满足多个类别,我该如何编码?例如,一个故事可以同时被分类为“恐怖”和“圆满结局”。
2、如果一个属性有3个类别,如您的示例(红、绿、蓝),我们是否应该表示2个类别(例如,红和绿),而将01类别(蓝)作为基础组以避免多重共线性(虚拟陷阱)?
非常感谢您的帮助!
模型可以预测每个类别的概率。
还有所谓的“多标签分类任务”,其中一个观测值可能同时具有多个类别。
嗨,Jason,
我喜欢您的内容。我有一个案例,我几乎有200个分类特征列,而且它们都不是字符串/文本形式。这些列的值是0或1,或者浮点数。应该使用哪种技术来处理这种分类数据?提前感谢。
尝试几种方法并比较结果。使用能带来最佳模型性能的方法。
你好 Jason,
我有一个关于回归和独热编码的疑问,您能帮我解决吗?
在回归中,有X列我用作预测变量,但它包含混合数值和分类数据,那么我该如何编写Python代码逻辑来忽略数值列,而只对分类列进行独热编码?
如何为包含超过15000个唯一值的“Pincode”列找到编码?
好问题,您可以使用 ColumnTransformer。
https://machinelearning.org.cn/columntransformer-for-numerical-and-categorical-data/
Jason您好,好文章。您是否写过关于其他类型编码技术的博客,如响应编码(目标编码)?如果是,请分享链接。
目前还没有。
何时进行独热编码?是应该在训练集和测试集拆分之前还是之后进行?
根据我的一篇文章的发现,它说:
“在应用任何编码方案之前,将数据集拆分为训练集、测试集和交叉验证集。否则,我们会遇到数据泄露问题。即至少将一部分测试数据暴露给训练数据”。
然而,其他一些文章建议在训练集和测试集拆分之前执行独热编码。
谢谢
San
这取决于您想执行的其他操作,例如特征选择。
在简单的情况下,它首先被执行。
独热向量是否应该与数值属性一起缩放?
不,独热向量不需要缩放。
嗨 Jason,在拆分训练集和测试集之前,我们是否需要将分类数据转换为数字?
我忘了提,我正在为逻辑回归模型这样做。
在之前或之后都可以,只要保持一致性。
您好,非常棒的教程。谢谢。我有一个关于使用独热编码与只有两个标签的分类数据的问题。在这种情况下,是否可以使用数据中的一个特征,将其设置为0或1?或者我必须使用 [1,0] 和 [0,1]?
不客气。
同意。也许可以将独热编码与顺序编码进行比较,并与模型一起使用?
您的文章对我每天都有很大帮助!我有一个关于独热编码和 pd.get_dummies 的问题。您在数据集中是否得到了相同的结果?
我现在面临的情况是为一大群客户提供 5 种不同的服务。我正试图根据过去的客户来构建一个模型,预测哪种服务最适合现有客户。
在我进行 pd_dummies 后,我得到包含 5 种服务的列被分成了 4 列。
所以,我定义了我的 X_train 数据集,但是如果我现在有 4 列,我该如何决定我的 y 在我的数据集中是什么?
抱歉,说了这么久,感谢您所做的一切。
不客气。
不,dummy 有 c-1 个二元变量,one-hot 有 c 个二元变量,其中 c 是类别的数量。
在线性模型中使用 dummy,在其他所有情况中使用 one-hot。
我为我的数据集 { 47000 * 57 } 使用了热编码,其中 57 列是分类数据……然后应用了 CNN 进行预测,但无论如何,MAE 都无法低于 8.5。我该如何改进它?
以下是一些改进神经网络模型的建议
https://machinelearning.org.cn/improve-deep-learning-performance/
你好,Jason
如果我有一个分类数值特征怎么办?例如,如果我有一个像“车门数量”这样的特征,并且它只包含值(3、4、5),但每个值都会重复出现。在这种情况下,应该进行独热编码吗?
您可以比较保留字段原样与独热编码,看看哪种表示形式能带来更好的模型性能。
我认为保留字段原样就足够了。
使用独热编码最重要的优点是避免机器学习中的混淆。将分类值转换为数值,例如 A=1, B=2, C=3, D=4。
这个解决方案的问题在于,机器学习算法可能会认为 4 大于 1,这可能会导致问题。
这时,“独热编码”就派上用场了。
同意!
布朗利先生您好
感谢这篇文章。
我想知道您是否可以帮助我解决使用 OneHotEncoding 时遇到的问题。我正在尝试转换我数据集中包含公司名称的单个列。这是我使用的代码
# 热编码公司名称列
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[(‘encoder’, OneHotEncoder(), [1])], remainder=’passthrough’)
X = np.array(ct.fit_transform(X))
但我收到了这个错误
ValueError: cannot convert string to float: ‘FLANG Group’
“FLANG GROUP”只是一家公司名称。所有公司都格式相同。在我的 CSV 文件中,它们被标记为文本。
我该如何解决这个问题?
您的帮助将非常感激。
您确定您指定了正确的列索引吗?
是的,因为错误提到了我试图进行 OneHotEncode 的公司名称之一。
检查加载的数据以进行确认也可能很有帮助。
另外,也许可以运行一个小测试,在内存中使用人工构造的字符串(如“company one”、“company “two””)来使用 OneHotEncoder,并确认您的代码对它们有效。
感谢您分享这份文件,但直到现在我仍然不明白独热编码如何用于新闻文本分类,我有 10 个类别或标签类型。
请帮助我如何将分类数据转换为数值数据,我想要您的评论。
这里有一个例子
https://machinelearning.org.cn/one-hot-encoding-for-categorical-data/
感谢您分享这份文件,我有一个场景,其中我有许多重复的数值列,例如:多行具有相同的数值。大约有 50 个唯一的数值,因此直接进行独热编码会增加很多列。如果按原样保留,如上所述,模型可能会解释为 25 大于 10。
有什么处理方法吗?我很想听听您的建议。
提前感谢!
也许可以尝试直接对整数进行建模?
嗨,Jason,
感谢您一直以来精彩的讲解,我有一个问题,我正在做一个工业数据的回归任务(它看起来很糟糕),所以在预处理和清理之后,我使用了多种模型,但我的性能很低……您有没有处理糟糕数据集的经验以及如何解决这个问题?
提前感谢。
不客气。
这可能会给您一些启发
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
嗨,Jason!
我仍然很困惑应该使用哪种编码器。例如,如果我的数据没有顺序关系,为什么我应该使用 onehotencoder 而不是 labelencoder,而且 onehotencoder 不会生成大量特征吗?
如果我有一些具有顺序关系的数据,我不能直接使用 ordinalencoder(来自 sklearn)吗? ordinalencoder 在编码具有顺序关系特征方面不是最好的吗?
onehotencoder 可以编码顺序关系吗?如果存在顺序关系,为什么我应该使用它?
我不理解 onehotencoder 相对于 labelenocder 和 ordinalencoder 的优势,所以请告诉我,谢谢!
即使您的数据中存在顺序关系,您选择的模型也可能更适合嵌入或独热编码(或反之)。我建议进行实验以找出最适合您数据和模型的方法。
好的,谢谢!
但是,我该如何为我的数据找到最佳编码算法?或者一个更普遍的问题是,是否有方法可以搜索不是模型超参数的超参数,而是特定算法,例如使用 onehotencoder 在数据上进行 gridsearch 是否比使用 ordinalencoder 在数据上进行 gridsearch 性能更好?我不太确定这些将有助于模型性能的算法是否会被视为超参数,但我们可以使用 GridSearchCV 来搜索模型性能,例如 onehotencoder 与 ordinalencoder?这个想法是,我们可以使用超参数搜索来选择例如哪种类型的编码器,或者哪种类型的缩放器,或者哪种类型的降维技术?通过在数据上使用这些不同类型的算法来衡量模型性能。是否存在搜索这些“超参数”的可能性?
也许可以尝试几种方法,并使用最适合您数据和模型的方法。
哇,好帖子!
我有一个问题。
我有 11 列:10 列用于预测,1 列是目标。
目标列表示患者是否会缺席预约。
1=出席 0=缺席。
我是否应该对这个目标应用独热编码?我的意思是……它是二元的。在这种情况下这样做有意义吗?
谢谢!!
不行。
如何在 LSTM 中实现独热编码。我有数据,并且我想对星期几进行 OHE。将其转换为 8 列。我该如何将所有这些整合起来进行预测?
Raphael 你好……你可能会发现以下内容很有趣
https://datascience.stackexchange.com/questions/45803/should-we-use-only-one-hot-vector-for-lstm-input-outputs
感谢您的回复。但经过大量阅读后,我想重新表述我的问题。
对于 LSTM 时间序列预测。如何将数值和分类值(将进行独热编码)组合到一个向量中作为 LSTM 的输入?
Raphael 你好……您需要像以下教程中所示的那样重塑数据
https://machinelearning.org.cn/how-to-load-visualize-and-explore-a-complex-multivariate-multistep-time-series-forecasting-dataset/
https://machinelearning.org.cn/how-to-develop-rnn-models-for-human-activity-recognition-time-series-classification/
谢谢。但在我们进行独热编码之后,我们如何将数据组合起来训练模型?
我正在使用时间序列 LSTM 进行电力预测。我已经实现了模型,我的预测还可以。现在我想考虑添加每个时间序列的星期几,以便获得更好的电力预测,因为每天(周一至周五)在不同时间都对电力有自己的影响。我对星期几进行了独热编码,现在我有 8 列(电力和 7 天)。我生成了一个序列,但得到了很多错误。
我还没有找到解决这类问题的最佳实践。
Bobby 你好……您有什么具体问题我可以解答吗?
您好,您有什么可以添加到我的论文中的参考文献吗?关于独热编码和未编码数据的比较文章?
提前感谢。
Pau 你好……你可能会发现以下内容很有趣
https://www.researchgate.net/publication/320465713_A_Comparative_Study_of_Categorical_Variable_Encoding_Techniques_for_Neural_Network_Classifiers
https://ieeexplore.ieee.org/document/9512057
您知道有哪篇文章更深入地讨论了缺失值处理吗?
感谢您的关注和奉献。
我必须承认,当我读这篇文章时,我对我们为什么要使用独热编码的真正原因感到有些不满意。它让我思考了好几天,我真的没见过有人像我要解释的那样来解释它。
独热编码可能是表示分类数据的最佳方式的原因可以直接从创建的向量中理解。因为我们最终为我们希望表示的每个类别添加了一个完整的维度,并且在一个向量中只有其中一个维度可以为 1,所以通过向量数学,每个类别在多维空间中在数学上与其他所有表示都完全等距。它们不仅彼此等距,而且它们彼此正交。例如,在一个有 5 个类别的空间中,比较独热编码和整数数值。
[1, 0, 0, 0, 0] – 类别 1
[0, 1, 0, 0, 0] – 类别 2
[0, 0, 1, 0, 0] – 类别 3
[0, 0, 0, 1, 0] – 类别 4
[0, 0, 0, 0, 1] – 类别 5
任何类别组合的点积都结果为 0。在数学上,这意味着类别之间没有起始值(或相关性)。
如果我们只看值,并看类别之间的差异,例如类别 1 和 2 之间的差异为 1,而类别 1 和 5 之间的差异为 4。这种差异的差异可能(轻易地)足以让 AI(其本质上只是一个统计引擎)得出结论,允许类别值之间的差异比传入数据具有更大的权重。
总而言之,它是独热编码的正交性,并且它们都是单位向量,这确保了引擎不会偏向于将类别本身关联起来。
Ryan 你好……感谢您为我们的讨论做出的贡献!