为什么在机器学习中进行独热编码?

在应用机器学习方面入门可能很困难,尤其是在处理真实世界数据时。

通常,机器学习教程会建议或要求你在拟合机器学习模型之前以特定的方式准备数据。

一个很好的例子是对分类数据使用独热编码。

  • 为什么需要独热编码?
  • 为什么不能直接用数据拟合模型?

在本文中,你将找到这些重要问题的答案,并更好地理解应用机器学习中一般的数据准备。

通过我的新书《机器学习数据准备》快速启动你的项目,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

Why One-Hot Encode Data in Machine Learning?

为什么在机器学习中进行独热编码?
图片来自 Karan Jain,部分权利保留。

什么是分类数据?

分类数据是包含标签值而非数值的变量。

可能的值数量通常限于固定集合。

分类变量通常被称为标称变量。

一些例子包括:

  • 一个具有“”和“”值的“宠物”变量。
  • 一个具有“”、“绿”和“”值的“颜色”变量。
  • 一个具有“第一”、“第二第三”值的“名次”变量。

每个值代表一个不同的类别。

某些类别之间可能存在自然关系,例如自然排序。

上面的“名次”变量确实有值的自然排序。这种类型的分类变量称为有序变量。

想开始学习数据准备吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

分类数据的问题是什么?

某些算法可以直接处理分类数据。

例如,决策树可以直接从分类数据中学习,无需进行数据转换(这取决于具体的实现)。

许多机器学习算法无法直接处理标签数据。它们要求所有输入变量和输出变量都是数值。

总的来说,这主要是机器学习算法高效实现的一个限制,而不是算法本身的硬性限制。

这意味着分类数据必须转换为数值形式。如果分类变量是输出变量,你可能还希望将模型的预测转换回分类形式,以便呈现它们或在某些应用程序中使用它们。

如何将分类数据转换为数值数据?

这涉及两个步骤

  1. 整数编码
  2. 独热编码

1. 整数编码

第一步是为每个唯一的类别值分配一个整数值。

例如,“”是 1,“绿”是 2,“”是 3。

这称为标签编码或整数编码,并且易于反转。

对于某些变量,这可能就足够了。

整数值之间存在自然的有序关系,机器学习算法可能能够理解并利用这种关系。

例如,上面“名次”示例这样的有序变量将是标签编码足够好的一个例子。

2. 独热编码

对于不存在这种有序关系的分类变量,整数编码是不够的。

事实上,使用这种编码并允许模型假设类别之间存在自然排序可能会导致性能下降或意外结果(预测介于类别之间)。

在这种情况下,可以在整数表示上应用独热编码。这是将整数编码的变量移除,并为每个唯一的整数值添加一个新的二进制变量。

在“颜色”变量示例中,有 3 个类别,因此需要 3 个二进制变量。在表示该颜色的二进制变量中放置“1”,而在其他颜色中放置“0”。

例如

在其他领域,例如统计学,“哑变量”通常被称为“虚拟变量”。

有关如何在 Python 中对分类数据进行独热编码的分步教程,请参阅教程

进一步阅读

总结

在本文中,你了解了在使用机器学习算法时,为什么分类数据通常必须进行编码。

具体来说:

  • 分类数据被定义为具有有限标签值集合的变量。
  • 大多数机器学习算法需要数值输入和输出变量。
  • 整数编码和独热编码用于将分类数据转换为整数数据。

你有什么问题吗?
在下方评论区提问,我会尽力回答。

掌握现代数据准备!

Data Preparation for Machine Learning

在几分钟内准备好您的机器学习数据

...只需几行python代码

在我的新电子书中探索如何实现
机器学习数据准备

它提供**自学教程**,并附有关于以下内容的**完整工作代码**:
*特征选择*、*RFE*、*数据清洗*、*数据转换*、*缩放*、*降维*,以及更多...

将现代数据准备技术引入
您的机器学习项目


查看内容

272 条关于为什么在机器学习中对数据进行独热编码?的回复

  1. Varun 2017年7月28日 上午6:27 #

    你没有提到,如果我们有一个具有 3 个类别的分类变量,我们只需要定义 2 个独热变量来避免线性依赖。

    • Barbara DiLucchio 2018年11月8日 下午4:30 #

      嗨,Jason,

      非常感谢这个精彩、直观的教程。我正在尝试使用 scikit-learn 的方法来确定如何转换我的分类数据,并且有几个问题。首先,你也可以使用 get_dummies 吗?它是否同样有效,即使最终少了一个二进制列?另外,一旦你转换了分类变量,你就得到了几个新的二进制列,但仍然保留了该分类变量的原始文本形式。我应该删除该文本形式的分类变量还是将其保留在数据集中?

      非常感谢你的帮助,
      Barbara DiLucchio

      • Jason Brownlee 2018年11月9日 上午5:18 #

        是的,删除原始未转换的数据。

        • NN Design 2018年11月22日 下午8:36 #

          嗨,Jason,
          很棒的文章——快速提问,我正在查看一个需要将分类数据转换为可处理格式的解决方案。我之前想按照你上面概述的步骤进行标签编码,然后进行独热编码——根据这个例子,如果我有 10 个特征(例如 20x10),每个特征有三个数据类别,结果将是一个 20x30 的数据集,它现在是否已正确格式化以进行缩放和 PCA?

          • Jason Brownlee 2018年11月23日 上午7:48 #

            PCA 不适用于独热编码的分类数据。

          • Neil Caithness 2019年1月16日 下午8:40 #

            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.")

            ![](https://i.imgur.com/iTv7M2E.png)

            r

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

            ![](https://i.imgur.com/DlpXbHX.png)

            由 [reprex 包](https://reprex.tidyverse.org) (v0.2.1) 创建于 2019-01-16

          • Jason Brownlee 2019年1月17日 上午5:25 #

            我预计编码后的向量对于 PCA 来说会过于稀疏,也许我错了。

          • Srikar Reddy 2019年2月27日 下午1:07 #

            我有点同意 Jason 的观点,数据对于 PCA 来说会过于稀疏(尽管缩放得很好)。而且,生成的独热编码向量是线性无关的,这使得 PCA 无效(它是一个相当复杂的算法)。如果我说错了,请纠正我。

    • Amar Kumar 2019年5月18日 上午4:02 #

      嗨 Jason,
      我喜欢你的文章。
      什么时候应该使用独热编码,什么时候应该使用频率/提升率/回归系数来表示分类变量,有什么指导吗?
      另外,如果有很多分类变量,在进行独热编码后是否需要检查多重共线性(例如 VIF)?

      提前感谢你的回答?

      • Jason Brownlee 2019年5月18日 上午7:41 #

        我建议为模型/数据集测试一系列方法,并根据模型性能选择一种表示。

        我也推荐尝试嵌入(embedding),它们对分类特征非常有效,尤其是高基数(high cardinality)且具有交互作用的特征。

    • Isay 2020年4月14日 下午12:48 #

      完全同意……我在阅读文章的同一部分时也有同样的困惑……
      非常好的文章。谢谢

  2. Navdeep 2017年7月28日 上午6:49 #

    你好 Jason。我非常关注你,并非常感谢你的努力和易于理解的教程。只是有一个问题,独热编码如何处理多标签类别?在接下来的教程中,你能否帮助我进行文本数据的特征选择,用于多类别和多标签分类,使用 Keras?我尝试了多类别,使用了 90 个数据点。并使用 Keras 的 MLP、CNN 和 RNN,其中每个数据点都是一个长段落,带有标签,但准确率只有 37.5%。如果你有任何建议,请告诉我。

  3. Espoir 2017年7月28日 上午7:18 #

    独热编码的缺点是什么??假设你有一些分类特征,每个特征有 500 个或更多的不同值!所以当你进行独热编码时,数据集中会有很多列,这对机器学习算法来说仍然好吗??

    • Jason Brownlee 2017年7月28日 上午8:40 #

      很好的问题!

      向量可能会变得非常大,例如,在 NLP 问题中,向量的长度等于你词汇表中所有单词的数量。

      大向量会使方法变慢(计算复杂度增加)。

      在这些情况下,可以使用密集表示,例如 NLP 中的词嵌入。

      • faadal 2017年7月30日 上午1:11 #

        Hi Jason,再次感谢你出色的教学。

        回到 Espoir 的问题,我遇到了 84 个 user_ID 的问题。我对它们进行 OHE,正如你所说,当我用 SVM 分类器拟合数据时,它看起来像我陷入了无限循环。考虑到我没有遇到 NLP 的情况,我该如何解决这个问题?

        谢谢。

    • Vitor 2017年7月31日 上午3:11 #

      非常有用的帖子,Jason!
      Espoir 提出了我的问题,但我没有理解如何将其应用于我的情况。我有 11,000 多个不同的产品 ID。数据库大约有 130,000 条记录。使用 OHE 时,这很容易导致 MemoryError。我应该寻找什么方法/解决方案?

      • Jason Brownlee 2017年7月31日 上午8:18 #

        哎哟。

        也许你可以使用高效的稀疏向量表示来减少内存占用?

        也许可以尝试探索 NLP 中使用的密集向量方法。也许你可以使用类似词嵌入的方法,让模型(例如神经网络)学习不同输入标签之间的关系(如果存在)。

  4. Sasikanth 2017年7月28日 上午11:54 #

    你好 Jason,如果我们想在视觉上呈现 OHE 后的特征,我们该如何检索它们?

    • Jason Brownlee 2017年7月29日 上午8:01 #

      你可以通过 argmax()(例如 numpy.argmax())来反转编码。

  5. gezmi 2017年7月28日 下午5:20 #

    感谢你写了这么多精彩的文章!
    数据是否也必须进行独热编码才能用于分类树和随机森林,或者它们可以处理没有独热编码的数据?或者只是尝试哪种效果更好?

    • Jason Brownlee 2017年7月29日 上午8:07 #

      不,树可以按原样处理分类输入。

      • Sandeep 2020年4月4日 上午2:30 #

        在高基数的情况下,模型难道不会开始将整数标签分组到范围内吗?

  6. Ravindra 2017年7月28日 下午5:31 #

    你好 Jason,这篇帖子非常有帮助,谢谢!!
    问题——一般来说,当我们对有序特征应用独热编码时,模型的性能会如何?你是否建议只在有序特征的情况下使用整数编码?

    • Jason Brownlee 2017年7月29日 上午8:07 #

      这 realmente 取决于问题和被编码的特征的含义。

      如有疑问,请测试。

      • Ravindra 2017年7月29日 下午4:16 #

        明白了,谢谢!

  7. Rajkumar Kaliyaperumal 2017年7月28日 下午6:47 #

    嘿 Jason,
    一如既往,这是关于分类变量特征表示的另一篇有用的文章。由于逻辑回归拟合的是 w1X1 + w2X2 +.. 形式的数据点(其中 X 是特征,如分类变量 - 名次、颜色等),而 w 是权重,所以直观上 X 只能取数值才能拟合直线。这是正确的直觉吗?

    • Jason Brownlee 2017年7月29日 上午8:11 #

      是的,像逻辑回归这样的回归算法需要数值输入变量。

      • Raj 2017年7月31日 下午2:16 #

        非常感谢你的解释。我喜欢你的博客和每日邮件摘要。它们帮助我轻松理解关键概念和实用技巧。

  8. PabloRQ 2017年7月28日 下午7:15 #

    太好了!

  9. ritika 2017年7月29日 下午8:19 #

    解释得很好……谢谢。

  10. Jie 2017年7月31日 上午11:41 #

    我喜欢你的博客!
    一个问题:如果我们使用决策树等基于树的方法,是否仍然需要独热编码?
    非常感谢你!

    • Jason Brownlee 2017年7月31日 下午3:49 #

      不,Jie。大多数决策树可以直接处理分类输入。

      • Jie 2017年8月1日 上午1:01 #

        非常感谢!

      • yash karan gupta 2021年5月27日 上午7:32 #

        怎么做?任何资源链接都将不胜感激。
        谢谢,
        Yash

        • Jason Brownlee 2021年5月28日 上午6:42 #

          我不知道有 Python 实现可以直接支持分类数据。我知道算法支持,也许你可以自己实现。

  11. Andrew Jabbitt 2017年8月3日 上午12:27 #

    Hi Jason,非常喜欢这个博客……非常喜欢!

    我正在使用你的二分类教程作为模板(谢谢!),用于零售销售数据预测器。我基本上是在尝试使用产品特征和小时天气预报来预测未来的小时销售量,并根据高于/低于年平均销售量作为我的二元标签进行训练。

    我已经对我的分类数据进行了编码,并且在训练数据时获得了较高的准确率(87%以上),但在尝试使用未见过且规模小得多的数据集进行预测时,准确率会下降(到 26%)。

    据我所见,我的问题是由对分类数据进行编码引起的——我的未见数据集中的相同类别具有与我的模型不同的代码。这是否可能是我预测性能不佳的原因:编码后的预测类别与用于训练和测试模型所用的类别不匹配?如果是这样,在实践中如何克服这些挑战?

    希望这有意义。

    • Jason Brownlee 2017年8月3日 上午6:53 #

      Andrew,做得好!

      你的模型可能过拟合了,尝试一个更小的模型,尝试正则化,尝试一个更大的数据集,尝试减少训练。

      这里有更多想法:
      https://machinelearning.org.cn/improve-deep-learning-performance/

      希望这些能作为一个开始有所帮助。

      • Andrew Jabbitt 2017年8月3日 下午4:25 #

        嘿 Jason,我本来以为我没有‘那个’问题,但我可能真的有 🙂

        非常感谢。

  12. Maurice BigMo Flynn 2017年8月9日 下午3:05 #

    非常感谢,非常有帮助的文章!!!

    问题:如何最好地对分类变量数组进行独热编码?

    我也开始了 AI 博文,你也可以在那里找到一些知识:Thebigmoapproach.com/

  13. tom 2017年8月28日 下午4:33 #

    嗨 Jason

    一个问题,以“颜色”变量为例,如果颜色是“红”,那么独热编码后,它变成 1,0,0。那么,我们是否可以认为它从一个特征生成了三个特征?
    它是否增加了两列,这是正确的吗?

  14. Zhida Li 2017年9月4日 下午8:32 #

    Hi Jason,如果我的输入数据是 [1 red 3 4 5],使用独热编码器,red 变成 [1,0,0],这意味着整个输入数据的特征都扩展了吗?
    输入数据现在是 [1 1 0 0 3 4 5]

    • Jason Brownlee 2017年9月7日 下午12:35 #

      抱歉,我不明白。也许你能重新陈述你的问题?

      • Zhida Li 2017年12月1日 下午8:10 #

        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 个特征,所以我的训练使用新数据,这样对吗?
        谢谢。

  15. Peter Ken Bediako 2017年10月13日 下午6:28 #

    你好 Brownlee 博士,

    我正在训练一个模型来检测攻击,我需要像你一样的人来帮助我检测代码中的错误,因为我的训练没有产生任何更好的结果。如果你有兴趣帮忙,请通知我。
    谢谢你

  16. Peter Ken Bediako 2017年10月13日 下午8:20 #

    我正在使用 Tensorflow 开发模型,并且想知道你的书如何帮助我做到这一点,因为它引用了 Keras。谢谢。

    • Jason Brownlee 2017年10月14日 上午5:44 #

      我的深度学习书籍展示了如何使用 Keras 库将深度学习应用到你的项目中。它不涵盖 Tensorflow。

      Keras 是一个运行在 Tensorflow 之上的库,并且更易于使用。

  17. Yahia Elgamal 2017年10月20日 上午12:26 #

    据我所知,这并不完全正确。正如 Varun 所提到的,你需要少一个列(n-1 列)。所描述的是虚拟编码(dummy encoding),而不是独热编码(one-hot encoding)。虚拟编码有一个主要问题,即与截距值存在完全共线性。因为一个类别所有虚拟值的总和(n 列)总是等于 1。所以它基本上是一个截距。

    • Jason Brownlee 2017年10月20日 上午5:38 #

      我认为情况正好相反。哑编码是 n-1 列,独热编码是 n 列。

  18. Sakthi 2017年10月20日晚上11:13 #

    您好 Jason,我有一个数据集中有 6 个分类值。我有的数据中有很多缺失的分类值,它们被留为空字符串。如果我有缺失的分类值该怎么办?我也需要对它们进行独热编码吗?或者如何处理带有缺失值的分类特征?
    我正在使用 scikit-learn,并尝试了我的数据集的许多算法。

  19. Thomas 2017年10月26日早上7:23 #

    嗨,Jason,
    首先感谢您的帖子!

    您解释的有些地方我没理解:我们以颜色为例(红色是 1,绿色是 2,蓝色是 3)。

    我不明白“类别之间的序数关系”:独热编码是否比这些类别为某些学习算法带来更好的准确性?(到目前为止,我的想法是:算法读取 1、2 或 3 而不是红色、绿色或蓝色,并进行必要的关联以进行预测,这对预测准确性没有影响。)

    • Jason Brownlee 2017年10月26日下午4:14 #

      嗯。抱歉没有说清楚。

      序数意味着有序。有些类别是自然有序的,在这些情况下,一些算法通过仅使用整数编码可能会获得更好的结果。

      对于类别无序的问题,整数编码可能比独热编码性能更差,因为算法可能会基于分配的数字假设一个错误的顺序。

      这有帮助吗?

      • Gana 2018年2月26日晚上10:29 #

        有点困惑。如果我们正确地对整数标签进行了排序,我们还需要独热编码吗?实际上,标签影响准确性有点愚蠢。我认为独热标签是为了简单,但您说的是在整数标签未正确排序的情况下。

        如果我们正确地对整数标签进行了排序,那么我们还有使用独热编码的理由吗?

        我接受您解释的为什么我们需要使用整数编码而不是字符标签。

        谢谢你

        • Jason Brownlee 2018年2月27日早上6:28 #

          我当时说的是,如果你的变量值不是序数的,而你在拟合模型时将它们视为序数(例如,不使用独热编码),你可能会损失技能。

          这有帮助吗?

  20. Vlad 2017年11月12日晚上9:34 #

    我的数据来自 20,000 家商店。每家商店都有自己的整数 ID。这个 ID 没有意义,只是一个 ID。我应该在数据集中添加 20,000 个二元变量吗?以及 LTSM 输入层中的 20,000 个神经元?这听起来令人望而生畏……

    • Jason Brownlee 2017年11月13日早上10:15 #

      不,除非您认为 ID 具有预测性(例如,编号映射到地理区域,并且区域具有相似的结局),否则请删除 ID。

      • Vlad 2017年11月14日早上4:03 #

        好的,我有每家商店的纬度和经度。我应该用它们代替 ID 吗?类似的问题。我有 17 种天气状况(阴天、雨天等)。我应该用 17 个二元变量替换它们吗?或者我应该尝试给它们分配整数代码来显示大雨与小雨、晴天与多云和阴天的相似性?

        • Jason Brownlee 2017年11月14日早上10:20 #

          没有规则,我鼓励您尝试许多不同的方法,看看哪种方法最适合您特定的数据。

          我有一些可以建议的偏见,但最好(您的结果会更好)通过实验来发现适合您问题的方法。

          • Vlad 2017年11月15日早上6:53 #

            是的,没错,谢谢。

  21. Ali 2017年11月15日早上7:49 #

    这是一个很棒的帖子,Jason!很高兴我看到了它。它真的帮助我理解了独热编码的必要性。我是机器学习新手,目前在 R 中为分类问题运行 xgboost。
    我有两个问题
    (1) 如果我的目标变量(我想预测的变量)是分类的,我是否也应该使用独热编码将其转换为数字形式,还是简单的标签编码就足够了?
    (2) 有没有特定的 R 包用于特征的独热编码?

    • Jason Brownlee 2017年11月15日早上9:59 #

      这确实取决于方法。这可能会有帮助。

      抱歉,我不记得是否必须为 xgboost 编码 R 中的变量,这已经是很久以前的事了。

      • DH 2018年6月6日早上10:36 #

        大多数 R 机器学习方法都可以处理因子,而无需显式进行独热编码。但 xgboost 是一个例外,因此您需要使用像 sparse.model.matrix() 这样的函数在将数据集传递给 xgboost 之前对其进行编码。(此函数实际上将因子编码为“指示变量”,而不是独热编码,但基本思想是相同的。)

      • sahil singh 2019年9月19日晚上11:30 #

        Jason,您还没有回答第一个问题。

        我也需要知道同样的事情。
        (1) 如果我的目标变量(我想预测的变量)是分类的,我是否也应该使用独热编码将其转换为数字形式,还是简单的标签编码就足够了?

        • Jason Brownlee 2019年9月20日早上5:44 #

          通常,在建模时会编码所有分类变量,因为机器学习算法必须处理数字。

          这包括模型的输入和输出。

          • András Novoszáth 2020年4月5日早上2:28 #

            这是否意味着特别需要独热编码,还是整数编码就足够了?

          • Jason Brownlee 2020年4月5日早上5:46 #

            也许可以两者都试试。

  22. Anu 2017年11月16日早上1:22 #

    你好,Jason

    我的数据集中有数字和标称类型。它还有缺失值。对于标称数据类型,我首先应用 Labelencoder() 将它们转换为数字值,但除了我的两个类别(正常、异常)之外,它还为 NaN 分配了一个代码。在这种情况下,我如何通过其均值进行插补?

    • Jason Brownlee 2017年11月16日早上10:31 #

      在这种情况下,您可以使用众数进行插补。

  23. DEB 2017年11月21日早上12:52 #

    嗨,Jason,

    由于应用 OneHotEncoding 后为分类列创建的列数等于该分类列中的唯一值数量;通常会出现测试模型中的特征数量与对数据集应用 OHE 后要预测的数据集中的特征数量不相等的情况。在这种情况下,模型在预测时会报错,因为它期望训练集和要预测的数据集具有相同数量的特征。您能否就如何处理这种情况提出建议?

    • Jason Brownlee 2017年11月22日早上10:42 #

      用于训练的同一转换对象然后用于测试或任何其他数据。如果需要,可以将其保存到磁盘。

  24. DEB 2017年11月22日下午4:28 #

    嗨,Jason,

    我没明白您说的“同一转换对象”是什么意思?训练数据集的结构(初始特征数量)在训练集和测试/待预测数据集之间是相同的。但每个特征/列下的值的唯一性可能不同,这是很自然的。因此,OneHotEncoding 或 pandas get_dummies 在测试/待预测数据集中创建的编码特征数量与训练数据集不同。如何处理这个问题——这就是我的问题。

    请给我建议。

    谢谢。

    • Jason Brownlee 2017年11月23日早上10:27 #

      抱歉。为了说得更清楚,您可以对训练数据训练转换对象,并在测试集和其他新数据上使用它们。

      转换对象可能是标签编码器和独热编码器。

      训练数据应涵盖给定特征的所有可能标签。

      这有帮助吗?

  25. Emily 2017年12月2日下午5:16 #

    嗨,Jason,

    对于只有两个级别(是/否)的二分类变量,我应该进行独热编码吗?例如,变量只包含(是/否),将其转换为两个变量(0/1)和(1/0)?

    谢谢。

  26. Edward Bujak 2017年12月6日早上8:58 #

    对于具有 4 个值的分类变量 State 的独热编码 (OHE):NJ, NY, PA, DE

    我们可以移除其中一个,例如 DE,以降低复杂性。
    所以,如果 NJ=0,NY=0,PA=0,那么它就是 DE。

    是否推荐移除一个?

    在二元分类变量的情况下,这一点更为明显。

    谢谢。

    • Jason Brownlee 2017年12月6日早上9:09 #

      如果您可以简化数据,那么我建议这样做。

      但请始终测试更改对模型技能的影响。

  27. Mike Dilger 2017年12月13日早上8:16 #

    pd.get_dummies() 的独热编码在训练数据集时有效,但当使用保存的训练模型预测单个数据行时,同样的方法无效。

    例如,如果您的训练集中有“性别”,那么 pd.get_dummies() 将创建两个列,一个用于“男性”,一个用于“女性”。一旦您保存了模型(例如通过 pickle),并且您想基于单行进行预测,那么该行中只能有“男性”或“女性”,因此 pd.get_dummies() 将只创建一个列。发生这种情况时,列的数量不再与您训练模型的列数量匹配,从而导致错误。

    您知道解决此问题的方法吗?我的实际需求是使用邮政编码而不是性别,这更复杂。

    • Jason Brownlee 2017年12月13日下午4:12 #

      我建议使用 sklearn 的 LabelEncoder 和 OneHotEncoders,对您数据的合理样本(覆盖所有情况)进行操作,然后将编码器 pickle 化以供以后使用。

      • Mike Dilger 2017年12月14日早上2:07 #

        谢谢!!!

  28. FriendofFriend 2018年1月11日下午2:40 #

    嗨,Jason,

    我正在跟进一些关于 n-1 编码和 n 编码的其他问题。我有一个数据集,我使用 sklearn 的 LinearRegression(也尝试了 Ridge)来根据星期几预测价格。我使用了 sklearn 的 DictVectorizer 来准备我的数据,最终得到了 7 列表示星期几,而不是 6 列。在上面的一些问题中,您指出更简单的更好……尽管您也说过要“测试更改对模型技能的影响”。您能否进一步解释一下——例如,使用其中一种或另一种对我这样的数据集(特征=星期几;目标=价格)有什么实际影响?我的模型似乎吐出了一个合理的 y 截距,尽管我不确定确切的 y 截距是什么,因为我的模型没有 [0, 0, 0, 0, 0, 0, 0] 来表示星期几(即没有“参考”星期几)。

    使用 n-1 与 n 编码在数学上有什么原因吗?我希望这有意义。我已经谷歌搜索了大约 50 次,找不到一篇真正深入研究此问题的文章。谢谢。

    • Jason Brownlee 2018年1月12日早上5:50 #

      如果您的目标是最佳的模型技能,那么就使用任何能提高该技能的方法。

      不需要理想化的理由。

  29. gezmi 2018年1月12日晚上7:59 #

    非常有帮助,谢谢。

    我可以问一下,如果字符串中有 4 个可能的字母,我想对它们进行编码(比如 A, B, C, D),这对神经网络来说哪个更好?独热编码还是整数编码?这些组没有顺序,所以我会选择独热编码,但不知道神经网络是否能处理整数编码(这将意味着将四分之一的特征进行独热编码)?

    谢谢!

    • Jason Brownlee 2018年1月13日早上5:32 #

      如果类别之间没有序数关系,则使用独热编码。

  30. Dhrumil 2018年1月23日下午4:09 #

    我是这方面的新手,所以这可能是一个愚蠢的问题,但这只能在类别数量较少且问题是分类问题时使用,对吗?

    • Jason Brownlee 2018年1月24日早上9:51 #

      独热编码可用于任何类型问题的输入特征,也可用于分类问题的输出特征。

  31. sujal padhiyar 2018年2月28日早上11:28 #

    你好 Jason,我有一个问题:如果有像“一等舱”、“二等舱”、“三等舱”这样的分类变量用于房屋价格预测,如果我用独热编码进行转换,算法将如何判断房屋的等级部分?是的,它将其转换为二进制,但它是否也考虑了该分类变量的等级?另外一个问题是,为了获得二进制输出,“pd.get_dummy”有用还是 OneHotEncoder 有用?

    • Jason Brownlee 2018年3月1日早上6:05 #

      独热编码用于分类问题,而不是回归问题。

      房价是一个回归问题,我们预测一个数量。

  32. Sweta Rani 2018年3月1日早上6:29 #

    您好 Jason,我有一个包含超过 500 个唯一值的字符串数据的集合。我该如何编码它以便可以将其传递给 ML 算法?它适合进行分类编码吗?

  33. Ammar Hasan 2018年3月31日早上11:36 #

    嗨,Jason,

    这是一个很棒的帖子,感谢您提供如此有价值的信息。我的问题是:

    如果颜色列中有许多颜色,比如 25 种颜色,我们是否可以用 RGB 值将颜色编码到 3 列中,而不是 25 个二进制列?您认为这种方法有什么异常吗?

    • Jason Brownlee 2018年4月1日早上5:43 #

      没问题,它将是一个包含 25 个元素的二进制向量。

  34. abraham 2018年4月15日晚上8:03 #

    你好,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。您如何处理类别或如何对这些属性进行编码?
    我应该只使用标签编码器、独热编码器还是哑变量?最终是否可能对如此大的类别进行编码?
    我感到困惑,从哪里开始。

    期待您的建议和帮助。

  35. Yi Deng 2018年4月17日早上6:06 #

    这篇文章归结为一句话:

    “使用这种编码并允许模型假设类别之间存在自然顺序可能会导致性能不佳或意外结果(预测介于类别之间)”。

    这就够了。谢谢。

    • Jason Brownlee 2018年4月17日早上6:13 #

      不太对。

      这适用于整数编码,而不是独热编码。

      事实上,这正是独热编码要解决的问题。

  36. Pranav Pandya 2018年5月20日早上7:15 #

    我不同意独热编码的方法。我的意思是,这取决于算法。我的观点基于在许多 Kaggle 竞赛中与真实世界数据一起玩弄分类数据和各种算法。

    例如,LightGBM 在使用本机分类特征时可以提供良好的准确性。不像简单的独热编码,LightGBM 可以找到分类特征的最优拆分。这种最优拆分可以提供比独热编码解决方案更好的准确性。(官方文档:https://lightgbm.cn/en/latest/Advanced-Topics.html

    PS:与其他 GBM(本机 gbm、h2o gbm 甚至 xgboost)相比,lightgbm 在速度和准确性方面遥遥领先。

    • Jason Brownlee 2018年5月21日早上6:21 #

      谢谢你的说明,Pranav。

    • DH 2018年6月6日早上10:44 #

      Pranav,您能否提供任何基准测试结果的链接,显示 lightgbm 相对于 xgboost 的速度和准确性更优?

  37. Chen Chien 2018年5月22日晚上10:14 #

    抱歉!

    我对哑变量与普通数值变量的 dtype 感到困惑。

    以 Python 为例:
    如果我在 pandas 中使用 get_dummies 函数将分类变量转换为哑变量,它将返回二进制数,并且这些哑变量的 dtype 是整数。Python 如何确定这些“int”变量是哑变量,为什么 Python 不会将这些“int”与其他普通数值变量混淆?
    Python 会将这些哑变量(dtype = int)视为数值变量吗?
    (int 类型是数值类型的一种,并且是可计算的,不是吗?)

    这个问题可能有点愚蠢,但这确实困扰了我一阵子……

    谢谢你的帮助!

    • Jason Brownlee 2018年5月23日早上6:26 #

      这是计划,让算法像对待其他数值变量一样对待它们。

      这有帮助吗?

      • Chen Chien 2018年5月23日下午3:13 #

        尽管算法像对待其他数值变量一样对待它们,但模型的工作方式就像它们有分类变量和数值变量一样,对吧?

        在 R 中,我可以将一个变量设置为“因子”通过“as.factor”,然后直接将其提供给模型,这非常直观,所以当我使用 Python 做同样的事情时,我感到困惑,尽管我最初知道它应该通过 get dummy 进行预处理……

        我认为这是哑变量的概念……但我对哑变量在编程语言中的工作方式感到迷茫……

        谢谢你的帮助!

        • Jason Brownlee 2018年5月24日早上8:07 #

          使用 sklearn 和 keras,您必须进行整数编码或独热编码。

          Python 中的其他库可能不适用于此。

          • Chen Chien 2018年5月24日下午1:11 #

            非常感谢!

  38. Winda Serikandi 2018年6月2日早上1:21 #

    嗨 @Jason Brownlee。当我们想预测新数据集时,我们如何获得恒定的哑变量?

    我有一个案例,我使用转换为哑变量的变量生成了一个模型。在独热编码后有 13 个哑变量。我从神经网络构建了模型。
    现在我要预测一些新数据集的行。当然,数据必须进行独热编码。但结果是独热编码后有 9 个哑变量。

    我仍然不明白如何理解这个问题。似乎这些哑变量之间存在不平衡。有什么解决方案可以解决这个问题吗?

    • Jason Brownlee 2018年6月2日早上6:36 #

      您必须对新数据使用与训练数据相同的编码过程。

      您可能需要保存涉及的对象。

  39. Awais Ahmed 2018年6月4日早上2:13 #

    您好,@Jason Brownlee,

    您能否指导我关于 .pcap(网络捕获文件)的协议列相关的 Info 列?

    我应该如何处理 Info 列,最终我必须进行分类。

    此致,

  40. Rishi 2018年6月22日 晚上6:50 #

    您能否列出哪些机器学习算法不能妥善处理分类变量,并且需要进行独热编码或虚拟编码,而决策树则不需要?

    • Jason Brownlee 2018年6月23日 上午6:14 #

      这取决于算法的实现(例如,库)。

      例如,在 Python 中,几乎所有的 sklearn 实现都要求对输入的分类变量进行编码。

  41. will 2018年7月21日 上午1:04 #

    Jason - 感谢您对大家问题的帮助和之前的回复,我真的很感激。但这里还有另一个问题……

    我正在尝试预测每月家庭千瓦时 (kWh) 的使用量,其中包含 100 多个与社会经济、人口统计、住房特征、电器数量/质量等相关的变量。由于许多变量是由于之前“否”或“0”的答案而自然出现的 NA,我正在考虑对分类变量进行独热编码以“去除”NA……我也将对有序结果变量进行分箱以尝试分类算法……您有什么看法?

    再次感谢您的帮助!

  42. Siddharth Kanojiya 2018年7月23日 上午10:21 #

    Jason,这篇文章写得太好了。如果您能就一个稍微相关的问题给我一些建议,那就太好了。

    我有一个有序的列,比如熟练度 = 初学者、中级、高级、专家。

    在对其进行标签编码后,我得到 (0, 1, 2, 3)。

    另一列是数字列,年龄。

    最后一列是布尔值,is_certified (1, 0)

    我想知道是否需要对熟练度列进行标准化(类似于年龄),因为它是一列新创建的数字列。

    • Jason Brownlee 2018年7月23日 下午2:24 #

      尝试加上和不加,看看它对模型技能有什么影响。

  43. Sam Ragusa 2018年7月23日 下午5:47 #

    我相信您已经厌倦了讨论这个问题,但我认为我的虚拟编码与独热编码的情况与之前讨论的情况足够不同,值得回复。

    假设您正在对一个跳棋盘进行编码,您可以使用长度为 5 的独热编码,或者 4 个虚拟变量来表示棋盘上每个格子的占用情况(每种颜色的兵和王,共 4 种可能的棋子)。

    直观地说,这 4 个虚拟变量代表了可以占据一个格子的 4 种可能的棋子,并且未被占据的格子由所有未被占据的虚拟变量(零值)表示。但是,同样容易的是,白王子的虚拟变量可以与未被占据的虚拟变量互换,并表示相同的数据。

    不太直观的虚拟编码可能和更直观的编码表现一样好吗?(或者更普遍地说,所有的虚拟编码都表现相似吗?)

    如果它们不产生相同的性能,并且问题没有直观的解决方案,有没有办法指导在虚拟编码中省略哪个变量(假设模型过于复杂,无法尝试所有可能性)?

    另外,在跳棋占用情况这样的示例中,独热编码中的一个变量是否代表了其他变量的缺失(空方格),这是否会影响表示的选择方式?

    总之,感谢您的文章!很高兴能学习到用于我工作中内容的正确术语。

    • Jason Brownlee 2018年7月24日 上午6:12 #

      问题表示很难,而且大部分是艺术。

      您希望暴露足够的信息,以便模型能够解释情况并进行学习,例如,提供改进的梯度。

      对于棋盘游戏的表示,也许可以查看全球优化/遗传算法领域几十年的研究成果,这些领域已经在这方面进行了大量工作,如何最好地表示游戏状态?

  44. Varun s 2018年7月24日 晚上10:25 #

    你好,先生,
    我的数据中有一个分类特征。我对其进行了独热编码并训练了一个模型。我想让这个模型预测新的数据(单个观测值)。我该如何将这个带有分类字段的新观测值提供给模型?

    • Jason Brownlee 2018年7月25日 上午6:18 #

      新数据必须像训练数据一样进行准备。

  45. Gaurav Singh 2018年8月22日 下午4:41 #

    嗨,Jason,

    假设我有一个数据集中有多个(超过两个)输入变量是分类数据类型,我该如何应用独热编码器,以及如何处理虚拟变量陷阱?

  46. Anurag Verma 2018年8月23日 下午4:57 #

    我正在分析钻石数据集。我有一个具有“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))?

  47. yassmein 2018年9月22日 上午11:29 #

    你好
    我如何映射分类
    值到数值表示。
    a) 一周中的天数
    b) 字母表中的字母
    c) 邮政编码

    • Jason Brownlee 2018年9月23日 上午6:36 #

      可以以任何您想要的方式进行,只要保持一致即可。

  48. Yazid 2018年9月25日 上午6:35 #

    嗨 Jason,我想问你关于对年龄进行编码的问题,我正在处理句子,需要从句子中估算年龄,所以我使用了 LSTM 模型,但结果很差。
    我已经进行了词性标注(POS tagging),并使用独热表示进行了编码,对年龄也是如此。
    我有 78 个可能的年龄,从 15 到 94,所以我用独热编码对它们进行了编码,准确率为 38%,所以我想知道该怎么做。

    例如:POS = VERB = 10000000000, POS = NOUN = 01000000000
    年龄 = 15-25 = 1000000, 年龄 = 25-35 = 0100000

    • Jason Brownlee 2018年9月25日 下午2:42 #

      很有趣。也许可以在 scholar.google.com 上搜索类似的问题?您可能需要发挥创意。

  49. Yogurtu 2018年9月29日 上午2:54 #

    嗨 Jason,感谢您写得如此清晰且有用的帖子。
    我有一个小问题。既然可以进行直接的独热编码,为什么还要进行整数编码?
    Pandas 在对分类变量调用 get_dummies() 时似乎就是这样做的。

    谢谢!

    • Jason Brownlee 2018年9月29日 上午6:37 #

      对于具有顺序关系的类别,使用整数表示可能对某些模型更有意义。

  50. Veena S. 2018年10月1日 下午5:24 #

    嗨 Jason,当我在神经网络中使用分类特征时,我需要进行编码吗?谢谢

    • Jason Brownlee 2018年10月2日 上午6:22 #

      是的,尝试使用有序变量的整数编码,尝试使用独热编码或嵌入来处理分类变量。

  51. Sanket 2018年10月4日 上午3:17 #

    当属性只有两个分类值时,我们需要独热编码吗?

    • Jason Brownlee 2018年10月4日 上午6:20 #

      通常不需要,但可以尝试一下,并评估它对模型性能的影响。

  52. Yamini 2018年10月19日 下午5:43 #

    你好,
    独热向量的位总是用逗号/空格分隔,还是它们可以像二进制数字一样连接在一起?根据机器学习理论,它们的确切性质是什么?我需要在我的当前项目中使用这些信息。

    谢谢。

    • Jason Brownlee 2018年10月20日 上午5:51 #

      每个二进制变量通常是一个单独的列。

  53. Carolyn 2018年11月11日 上午4:55 #

    嗨,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]

    有没有什么情况这样做不好?

    • Jason Brownlee 2018年11月11日 上午6:11 #

      不行。独热编码会创建许多特征。如果您有多个独热编码的特征作为输入,那么这些二进制向量将作为输入连接起来。

      • Carolyn 2018年11月13日 上午4:52 #

        谢谢您的回复。好的,这是否意味着我应该连接每个长度为 one_hot_shape 的二进制向量,以便我拥有 num_features 个这些 one_hot_shape 向量,然后将它们输入到 LSTM 中?

  54. Radhika Garg 2018年12月1日 上午11:13 #

    嗨,Jason,

    我们在逻辑回归模型中使用独热编码。我们如何解释系数,特别是摘要表中的“估计”值?

    • Jason Brownlee 2018年12月2日 上午6:14 #

      您所说的“摘要表中的估计值”是什么意思?

  55. Santiago 2018年12月21日 上午6:55 #

    嗨 Jason,在我的神经网络中可以使用 Company_Id 的独热编码吗?
    有 1200 个 ID,这太多了。
    整数编码会考虑公司 ID 的顺序,这可能会使我的模型产生偏差。
    您有什么建议?

    • Jason Brownlee 2018年12月21日 下午3:14 #

      是的,可以尝试一下,并与整数编码进行结果对比。

  56. Jacob Weir 2018年12月23日 上午8:03 #

    我们是否必须对字符串格式的分类值进行独热编码(或使用虚拟值),还是必须对所有分类变量都这样做?即使变量是整数?

    • Jason Brownlee 2018年12月24日 上午5:25 #

      不一定需要,但也许可以比较使用和不使用编码的性能,以确认它是否增加了价值。

  57. kalyanramu 2019年1月22日 下午2:20 #

    如果您的数据中有一个像邮政编码这样的列。您会推荐使用整数编码还是独热编码?

    • Jason Brownlee 2019年1月23日 上午8:42 #

      尝试两者,也尝试嵌入。我预计嵌入效果会更好。

  58. Nachiketa 2019年2月10日 下午7:00 #

    嗨,Jason,
    在客户流失的情况下,我们需要对月度数据(例如 3 个月)进行独热编码并将其转换为列吗?当每个客户有多行时会怎样?像逻辑回归、决策树、随机森林这样的分类器能正确读取这些数据吗?或者是否绝对需要始终每位客户一行才能从这些算法中正确实现二元分类?

    • Jason Brownlee 2019年2月11日 上午7:57 #

      通常数据会被反规范化,以便您拥有被建模的每个实体一行,例如每个客户一行。

  59. Helen 2019年2月17日 下午7:16 #

    嗨,Jason,
    如果我所有的分类变量都是二维的,那么独热编码是必需的吗?

    • Jason Brownlee 2019年2月18日 上午6:29 #

      可能不是必需的,您可以将二元输入(整数输入)与独热编码输入进行比较。

  60. Dina 2019年2月21日 上午3:58 #

    嗨 Jason,感谢您的帖子,非常有帮助。
    我有一个问题,我需要向我的模型呈现循环特性:在这种情况下,特性是循环嵌套级别及其大小。循环包含指令,因此每个循环都有一个指令向量,每个指令都有其自身的特性。
    我的特性看起来大致如下:

    我真的不知道如何呈现它们,特别是我的某些输入是标量,有些是向量,有些是 ID,有些则与其他输入无关!

    我将非常乐意接受任何建议。非常感谢!:)

    • Jason Brownlee 2019年2月21日 上午8:17 #

      抱歉,我没有能力审查和评论这个。

      总的来说,我建议头脑风暴多种解决问题的不同方式,对每种方式进行原型设计,然后看看哪种方式能很好地适用于您的特定数据集。

      • Dina 2019年2月24日 下午8:09 #

        是的,你说得对。我做了一些类似您建议的事情,并且我设法将我的问题总结为以下输入:
        00-我将我的神经网络用作连续函数来预测一种称为循环展开的循环优化因子。
        01-我的输入长度是可变的。
        02-我必须一次性提供我的输入。
        03-由于第二个原因,RNN 对我来说将无法工作。
        04-如果我使用 MLP,我必须固定输入数量,在这种情况下,我可能会处理“0”填充,但根据我所读到的关于“0”填充的信息,它不是一个好的解决方案,并且在我们的训练示例中可能会有很多输入设置为“0”时会影响准确性。
        05-也许我必须改变特征的结构以获得固定数量的输入。

        只是我不确定“0”填充是否真的那么糟糕!这个解决方案是否取决于问题的性质,我的意思是对于某些问题这可能是一个有效的解决方案,而对于其他问题则不是?

        感谢您的任何建议。

        • Jason Brownlee 2019年2月25日 上午6:39 #

          如果您使用掩码层,则会忽略填充值。

  61. ayman 2019年3月14日 下午8:00 #

    嗨,jason

    我有一个数值数据集,其中一些是分类的,如城市代码、银行代码……,我应该使用编码还是仅将它们转换为类别类型?

    • Jason Brownlee 2019年3月15日 上午5:28 #

      我建议为每种方法尝试几种不同的编码方式,看看哪种能带来最佳的模型性能。

  62. Pasan 2019年3月20日 下午7:42 #

    Jason您好!好文章!我有一个多类别分类问题,我的类别是相关的,就像您提供的“地点”示例一样。问题是它们是在二维环境中相关的。我的类别是笛卡尔平面上的(x,y)对。我可以为每个位置分配整数,甚至可以使用独热编码,但我担心坐标/位置之间的关系不会被保留。这个问题有解决方案吗?或者除了多类别分类之外,还有其他方法可以建模这个问题吗?谢谢!

    • Jason Brownlee 2019年3月21日 上午8:03 #

      也许可以探索一种嵌入方式,也许为输入使用不同的分辨率?

  63. Utsav 2019年4月10日 下午7:40 #

    嘿 Jason,
    当一个列中有大约300个唯一值时,我该怎么办,例如:我有一个城市列,其中大约有300个唯一的城市,我该怎么办。
    我应该使用OneHotEncoder吗?这样在数据集中有这么多列是可以的吗?
    在这种情况下我该怎么办?请解释一下!!

    • Jason Brownlee 2019年4月11日 上午6:35 #

      如果它们对每一行都是唯一的,也许可以删除它们?

      如果它们在多于一行中使用,尝试整数编码,独热编码,如果您使用神经网络,也许可以尝试嵌入?

  64. Gautam 2019年4月20日 上午4:34 #

    独热编码如何解决问题?你能给我一个确切的答案吗?

  65. Banegamu 2019年6月4日 上午1:35 #

    Jason您好,内容一如既往地精彩。
    如果我可以问一下,如果我们看到标签与因变量之间存在线性关系,为什么我们不使用标签而不是独热编码呢?
    例如:如果我们获得汽车经销数据并考虑汽车类型数据,我们会发现掀背车是最经济实惠的,然后是轿车,然后可能是卡车等。所以,如果我们能按价格区间对这些类别进行编码,这是否可行?

    • Jason Brownlee 2019年6月4日 上午7:56 #

      机器学习算法使用数字进行工作。

      标签是字符串。

      我们可以将字符串建模为整数,称为整数编码,如果标签具有顺序关系,例如一周中的几天,这样是有意义的。

      我们可以使用独热编码来建模字符串标签,这对于名义关系更有意义,例如汽车类型。

  66. Satya 2019年6月6日 上午1:14 #

    早上好,Jason,
    我有一个快速问题。我正在尝试对包含分类和数值变量的数据集使用KNN算法。我已经缩放了数值变量,并为分类变量使用了独热编码。当我在计算距离度量时,我计算如下:当我比较两个样本,一个为男性,一个为女性

    男性 (1,0)
    女性 (0,1)

    距离计算是 abs((1-0) + (0-1)) = 2。

    在某些情况下,这不会正确分类。我猜是因为距离2与数值特征贡献的其他距离相比是一个非常大的数字,因为它们被缩放为0到1之间。

    我是否需要缩放这些独热编码变量以避免此问题,以及如何缩放它们?请提供建议。

    谢谢
    Satya

  67. Satyanarayana Medicherla 2019年6月6日 上午7:39 #

    谢谢Jason的快速回复。再问一个快速问题。

    sex_male sex_female
    例1 1 0
    例2 0 1

    例1和例2之间的距离,是否因为它们在两个位上不同而为2?还是需要做其他事情?请提供建议。

    谢谢
    Satya

  68. Satyanarayana Medicherla 2019年6月6日 上午7:46 #

    应该是根号2,因为它在向量空间中是斜向的?

  69. Satyanarayana Medicherla 2019年6月6日 晚上11:18 #

    早上好,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

  70. Prem Alphonse 2019年6月7日 上午11:13 #

    嗨,Jason,
    如果我在训练数据上使用 get dummies,我会得到新的列,如“columnName_cellValues”,基于不同的类别,然后我构建模型并保存它,
    之后我们加载模型和一个新的测试数据(只有一个记录),此时如何根据其值在新测试数据中获取新的列名以匹配模型中的列名。

    谢谢

    • Jason Brownlee 2019年6月7日 下午2:34 #

      数据必须以相同的方式编码。实现这一目标的一种方法是在训练数据集上拟合编码,并保存编码对象以备后用。

      • Prem Alphonse 2019年6月7日 下午3:32 #

        感谢您的回复,
        我使用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)

        谢谢

  71. Aakash Chotrani 2019年7月13日 上午9:55 #

    James您好,我有一个关于独热编码的问题。

    我有一个名为country的分类变量。它有149个国家。为大量国家创建独热编码会影响性能,因为大多数值都是0。

    当分类特征值数量巨大时,如何处理这种情况?

    我应该选择简单的标签编码吗?

    谢谢

    • Jason Brownlee 2019年7月14日 上午7:59 #

      一个150个元素的向量不是什么大问题。我不担心它。

      我曾处理过50K个独热编码向量而没有出现问题。

  72. Gokul Prasath 2019年7月28日 上午9:39 #

    嗨,Jason,
    好文章。我有5个因变量,每个因变量都有5个以上的类别,我应用了独热编码技术,但不知道在独热编码后应该删除哪个列。

  73. mary 2019年8月9日 上午1:30 #

    Jadon您好,
    感谢您的有用教程。
    我应用SVM、KNN、决策树、朴素贝叶斯和随机森林来分类Statlog(Heart)数据集,该数据集包含性别特征,为男性和女性。
    我使用了整数编码,即男性=1,女性=1。
    有必要使用独热编码吗?如果需要,它对性能的影响是什么原因?
    我非常热衷于知道答案。
    祝好
    玛丽

    • Jason Brownlee 2019年8月9日 上午8:17 #

      测试不同的方法是个好主意,因为我们的直觉往往会出错。

  74. madhu varun 2019年8月14日 晚上11:12 #

    你好,

    假设我有一个包含3个唯一值的分类数据列,例如法国、德国、西班牙。那么在标签编码和独热编码之后,我得到三个附加的列,它们是1和0的组合。我在网上读到,仅仅标签编码会给算法一种印象,即列中的值是相关的。所以我们进行独热编码。独热编码后,它会给出3个附加的1和0列。机器学习算法如何知道这些值是不相关的?

    • Jason Brownlee 2019年8月15日 上午8:11 #

      它们只是模型的输入,而某个模型会弄清楚如何最好地使用它们。

      更好的方法是使用一种学习到的嵌入,它可以明确地将它们关联起来。

  75. krs reddy 2019年8月15日 晚上9:56 #

    Jason,

    我的数据集中有4个分类列,其中3个是名义性的,1个是顺序性的。我的想法是使用pd.factorize或preprocessing.LabelEncoder进行编码,但对于3个名义性变量不带顺序,对于1个顺序性变量带顺序(因为输出结果是每个列的一个维度)。我宁愿不对名义性变量进行独热编码,因为它会显著增加维度。

    在使用pd.factorize()或preprocessing.LabelEncoder()时,如何控制排序或权重部分?

    • Jason Brownlee 2019年8月16日 上午7:53 #

      好问题。

      自己编写一些自定义代码来执行映射可能会更容易。

      • Krs reddy 2019年8月16日 上午11:44 #

        但是如何确保模型不会为名义变量假定顺序呢?

        • Jason Brownlee 2019年8月16日 下午2:10 #

          如果使用了OHE,就不会假定顺序。

          • krs reddy 2019年8月16日 下午5:30 #

            维度增加不是我想要的,同时模型不应该假定名义变量有任何顺序。

            pd.factorize和labelencoder的问题是模型可能会假定某种顺序,而OHE的问题是维度增加……如何同时解决这两个问题?

          • Jason Brownlee 2019年8月17日 上午5:32 #

            您可以使用嵌入,它对每个类别更具代表性,并且维度更低(您可以选择它)。

  76. Ali 2019年8月17日 下午1:40 #

    亲爱的 Brownlee,
    我是您优秀博客的读者,但我在这里引用了这篇文章
    https://www.kaggle.com/niyamatalmass/logistic-regression-in-tensorflow-for-beginner
    该教程将读者引导至此,以解释为什么在将数值特征馈送到LR之前将其转换为独热编码。
    这里的问题是,您的帖子只谈论将分类数据转换为独热编码,而不是谈论为什么需要将整数值转换为独热编码。

    • Jason Brownlee 2019年8月18日 上午6:38 #

      如果整数编码的变量实际上不是顺序的,那么独热编码是一个好主意。

      如果是顺序的,独热编码仍然可能有用,值得一试。

      至于页面链接到此帖的原因,也许可以联系该页面作者?

  77. Min 2019年8月21日 上午12:32 #

    嗨,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。这是否意味着我的模型真的很差?

    非常感谢!
    最小值

    • Jason Brownlee 2019年8月21日 上午6:47 #

      这很有趣。我不知道,它应该是等效的。

      我不确定您正在比较的两种情况之间的区别,抱歉。

  78. Jon 2019年9月13日 上午9:44 #

    谢谢,您能否更详细地说明变量的二进制格式编码如何确保它不会异常地影响ML决策。

    例如,3种颜色被编码为0,1,2,这仍然是一个数学差异,而二进制编码则使它们相等,我很初学者,不明白二进制版本如何使3种颜色相等,使它们变得无关紧要。

    • Jason Brownlee 2019年9月13日 下午1:53 #

      编码不是关于建模问题,而是提供数据给给定模型的一种一致的方式(数字而不是字符串)。

      这有帮助吗?

  79. kumar 2019年9月30日 下午3:02 #

    亲爱的 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)
    内存不会增加。

    提前感谢。请澄清。

    • Jason Brownlee 2019年10月1日 上午6:45 #

      一些想法

      您可以使用数据的较小样本。
      您可以使用更多RAM的机器。
      您可以尝试分层独热编码。

  80. Saeed 2019年10月6日 下午5:12 #

    您好,您的帖子很有信息量,但我在这里遇到了一个问题,即我的数据集的因变量(目标类别)有38个特征,现在我想通过get_dummies方法将其数字化,但它给了我38个其他列,现在当我训练模型时,我得到这个错误,您不能使用38列作为目标,而是需要使用这38列中的一列。所以请帮助我。

  81. scander90 2019年10月14日 下午3:07 #

    我的数据帧是分类的,所以我需要使用独热编码,但不是对所有数据,而是对预测的目标我想要使用标签编码,可以吗……。

  82. Mohammed 2019年10月14日 下午3:16 #

    我使用这段代码来预测攻击类型,所以我对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)

    • Jason Brownlee 2019年10月15日 上午6:02 #

      抱歉,我没有能力审查/调试代码。

      也许可以发布到stackOverflow?

  83. MK 2019年12月12日 上午12:03 #

    嗨,Jason,

    非常感谢这篇文章。

    如果我有几百个类别(产品类型)该怎么办?我不能使用独热编码,类别太多了。

    谢谢

    马丁

  84. Tufail waris 2019年12月19日 上午1:05 #

    在所有回归和分类方法中,我们是否总是需要排除一列进行独热编码以避免虚拟变量陷阱?

    • Jason Brownlee 2019年12月19日 上午6:32 #

      依我经验不是。您对变量进行独热编码,然后删除原始变量。

  85. tuna 2019年12月24日 下午6:57 #

    亲爱的 Jason,
    感谢您的教程。
    我有2个问题
    1、如果一个属性有许多类别,并且对象同时满足多个类别,我该如何编码?例如,一个故事可以同时被分类为“恐怖”和“圆满结局”。
    2、如果一个属性有3个类别,如您的示例(红、绿、蓝),我们是否应该表示2个类别(例如,红和绿),而将01类别(蓝)作为基础组以避免多重共线性(虚拟陷阱)?
    非常感谢您的帮助!

    • Jason Brownlee 2019年12月25日 上午10:34 #

      模型可以预测每个类别的概率。

      还有所谓的“多标签分类任务”,其中一个观测值可能同时具有多个类别。

  86. Asad Zahid 2020年3月10日 晚上11:12 #

    嗨,Jason,

    我喜欢您的内容。我有一个案例,我几乎有200个分类特征列,而且它们都不是字符串/文本形式。这些列的值是0或1,或者浮点数。应该使用哪种技术来处理这种分类数据?提前感谢。

    • Jason Brownlee 2020年3月11日 上午5:24 #

      尝试几种方法并比较结果。使用能带来最佳模型性能的方法。

  87. Nilesh Gode 2020年3月19日 下午4:51 #

    你好 Jason,
    我有一个关于回归和独热编码的疑问,您能帮我解决吗?
    在回归中,有X列我用作预测变量,但它包含混合数值和分类数据,那么我该如何编写Python代码逻辑来忽略数值列,而只对分类列进行独热编码?

    如何为包含超过15000个唯一值的“Pincode”列找到编码?

  88. Gandi Venkatesh 2020年3月26日 下午6:21 #

    Jason您好,好文章。您是否写过关于其他类型编码技术的博客,如响应编码(目标编码)?如果是,请分享链接。

  89. San 2020年3月31日 上午3:28 #

    何时进行独热编码?是应该在训练集和测试集拆分之前还是之后进行?

    根据我的一篇文章的发现,它说:
    “在应用任何编码方案之前,将数据集拆分为训练集、测试集和交叉验证集。否则,我们会遇到数据泄露问题。即至少将一部分测试数据暴露给训练数据”。

    然而,其他一些文章建议在训练集和测试集拆分之前执行独热编码。

    谢谢
    San

    • Jason Brownlee 2020年3月31日 上午8:16 #

      这取决于您想执行的其他操作,例如特征选择。

      在简单的情况下,它首先被执行。

  90. SJob 2020年4月14日 下午1:18 #

    独热向量是否应该与数值属性一起缩放?

  91. PIYUSH KUMAR 2020年4月20日 上午9:48 #

    嗨 Jason,在拆分训练集和测试集之前,我们是否需要将分类数据转换为数字?

    • PIYUSH KUMAR 2020年4月20日 上午9:49 #

      我忘了提,我正在为逻辑回归模型这样做。

    • Jason Brownlee 2020年4月20日 下午1:20 #

      在之前或之后都可以,只要保持一致性。

  92. Francesco 2020年5月11日 上午6:32 #

    您好,非常棒的教程。谢谢。我有一个关于使用独热编码与只有两个标签的分类数据的问题。在这种情况下,是否可以使用数据中的一个特征,将其设置为0或1?或者我必须使用 [1,0] 和 [0,1]?

    • Jason Brownlee 2020年5月11日 下午1:34 #

      不客气。

      同意。也许可以将独热编码与顺序编码进行比较,并与模型一起使用?

  93. Albi 2020年5月13日 上午2:32 #

    您的文章对我每天都有很大帮助!我有一个关于独热编码和 pd.get_dummies 的问题。您在数据集中是否得到了相同的结果?

    我现在面临的情况是为一大群客户提供 5 种不同的服务。我正试图根据过去的客户来构建一个模型,预测哪种服务最适合现有客户。

    在我进行 pd_dummies 后,我得到包含 5 种服务的列被分成了 4 列。

    所以,我定义了我的 X_train 数据集,但是如果我现在有 4 列,我该如何决定我的 y 在我的数据集中是什么?

    抱歉,说了这么久,感谢您所做的一切。

    • Jason Brownlee 2020年5月13日 上午6:41 #

      不客气。

      不,dummy 有 c-1 个二元变量,one-hot 有 c 个二元变量,其中 c 是类别的数量。

      在线性模型中使用 dummy,在其他所有情况中使用 one-hot。

  94. Deevyankar Agarwal 2020年6月12日 下午6:17 #

    我为我的数据集 { 47000 * 57 } 使用了热编码,其中 57 列是分类数据……然后应用了 CNN 进行预测,但无论如何,MAE 都无法低于 8.5。我该如何改进它?

  95. Blessing Agyei Kyem 2020年6月26日 下午10:45 #

    你好,Jason

    如果我有一个分类数值特征怎么办?例如,如果我有一个像“车门数量”这样的特征,并且它只包含值(3、4、5),但每个值都会重复出现。在这种情况下,应该进行独热编码吗?

    • Jason Brownlee 2020年6月27日 上午5:31 #

      您可以比较保留字段原样与独热编码,看看哪种表示形式能带来更好的模型性能。

      我认为保留字段原样就足够了。

  96. Jay 2020年7月17日 上午5:41 #

    使用独热编码最重要的优点是避免机器学习中的混淆。将分类值转换为数值,例如 A=1, B=2, C=3, D=4。

    这个解决方案的问题在于,机器学习算法可能会认为 4 大于 1,这可能会导致问题。

    这时,“独热编码”就派上用场了。

  97. Fikile Dube 2020年9月10日 上午3:44 #

    布朗利先生您好

    感谢这篇文章。

    我想知道您是否可以帮助我解决使用 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 文件中,它们被标记为文本。

    我该如何解决这个问题?

    您的帮助将非常感激。

    • Jason Brownlee 2020年9月10日 上午6:37 #

      您确定您指定了正确的列索引吗?

      • Fikile Dube 2020年9月10日 下午7:25 #

        是的,因为错误提到了我试图进行 OneHotEncode 的公司名称之一。

        • Jason Brownlee 2020年9月11日 上午5:54 #

          检查加载的数据以进行确认也可能很有帮助。

          另外,也许可以运行一个小测试,在内存中使用人工构造的字符串(如“company one”、“company “two””)来使用 OneHotEncoder,并确认您的代码对它们有效。

  98. sena mosisa 2020年11月3日 下午9:36 #

    感谢您分享这份文件,但直到现在我仍然不明白独热编码如何用于新闻文本分类,我有 10 个类别或标签类型。
    请帮助我如何将分类数据转换为数值数据,我想要您的评论。

  99. Sharan Sukesh 2020年11月7日 上午6:50 #

    感谢您分享这份文件,我有一个场景,其中我有许多重复的数值列,例如:多行具有相同的数值。大约有 50 个唯一的数值,因此直接进行独热编码会增加很多列。如果按原样保留,如上所述,模型可能会解释为 25 大于 10。

    有什么处理方法吗?我很想听听您的建议。
    提前感谢!

  100. Abdou 2021年4月8日 上午4:14 #

    嗨,Jason,
    感谢您一直以来精彩的讲解,我有一个问题,我正在做一个工业数据的回归任务(它看起来很糟糕),所以在预处理和清理之后,我使用了多种模型,但我的性能很低……您有没有处理糟糕数据集的经验以及如何解决这个问题?
    提前感谢。

  101. Johnny 2021年4月19日 下午12:33 #

    嗨,Jason!

    我仍然很困惑应该使用哪种编码器。例如,如果我的数据没有顺序关系,为什么我应该使用 onehotencoder 而不是 labelencoder,而且 onehotencoder 不会生成大量特征吗?

    如果我有一些具有顺序关系的数据,我不能直接使用 ordinalencoder(来自 sklearn)吗? ordinalencoder 在编码具有顺序关系特征方面不是最好的吗?

    onehotencoder 可以编码顺序关系吗?如果存在顺序关系,为什么我应该使用它?

    我不理解 onehotencoder 相对于 labelenocder 和 ordinalencoder 的优势,所以请告诉我,谢谢!

    • Jason Brownlee 2021年4月20日 上午5:53 #

      即使您的数据中存在顺序关系,您选择的模型也可能更适合嵌入或独热编码(或反之)。我建议进行实验以找出最适合您数据和模型的方法。

  102. Johnny 2021年4月23日 下午12:41 #

    好的,谢谢!

    但是,我该如何为我的数据找到最佳编码算法?或者一个更普遍的问题是,是否有方法可以搜索不是模型超参数的超参数,而是特定算法,例如使用 onehotencoder 在数据上进行 gridsearch 是否比使用 ordinalencoder 在数据上进行 gridsearch 性能更好?我不太确定这些将有助于模型性能的算法是否会被视为超参数,但我们可以使用 GridSearchCV 来搜索模型性能,例如 onehotencoder 与 ordinalencoder?这个想法是,我们可以使用超参数搜索来选择例如哪种类型的编码器,或者哪种类型的缩放器,或者哪种类型的降维技术?通过在数据上使用这些不同类型的算法来衡量模型性能。是否存在搜索这些“超参数”的可能性?

    • Jason Brownlee 2021年4月24日 上午5:15 #

      也许可以尝试几种方法,并使用最适合您数据和模型的方法。

  103. Pablo 2021年5月16日 上午12:40 #

    哇,好帖子!

    我有一个问题。
    我有 11 列:10 列用于预测,1 列是目标。
    目标列表示患者是否会缺席预约。
    1=出席 0=缺席。

    我是否应该对这个目标应用独热编码?我的意思是……它是二元的。在这种情况下这样做有意义吗?

    谢谢!!

  104. Raphael 2022年2月20日 上午1:22 #

    如何在 LSTM 中实现独热编码。我有数据,并且我想对星期几进行 OHE。将其转换为 8 列。我该如何将所有这些整合起来进行预测?

  105. Raphael 2022年2月21日 上午2:33 #

    感谢您的回复。但经过大量阅读后,我想重新表述我的问题。

    对于 LSTM 时间序列预测。如何将数值和分类值(将进行独热编码)组合到一个向量中作为 LSTM 的输入?

  106. Raphael 2022年2月21日 上午3:42 #

    谢谢。但在我们进行独热编码之后,我们如何将数据组合起来训练模型?

  107. Bobby 2022年2月23日 下午6:15 #

    我正在使用时间序列 LSTM 进行电力预测。我已经实现了模型,我的预测还可以。现在我想考虑添加每个时间序列的星期几,以便获得更好的电力预测,因为每天(周一至周五)在不同时间都对电力有自己的影响。我对星期几进行了独热编码,现在我有 8 列(电力和 7 天)。我生成了一个序列,但得到了很多错误。

    我还没有找到解决这类问题的最佳实践。

    • James Carmichael 2022年2月24日 下午2:39 #

      Bobby 你好……您有什么具体问题我可以解答吗?

  108. Pau 2022年7月25日 下午6:26 #

    您好,您有什么可以添加到我的论文中的参考文献吗?关于独热编码和未编码数据的比较文章?

    提前感谢。

  109. Pau 2022年7月26日 下午6:20 #

    您知道有哪篇文章更深入地讨论了缺失值处理吗?

    感谢您的关注和奉献。

  110. Ryan 2025年2月26日 下午8:52 #

    我必须承认,当我读这篇文章时,我对我们为什么要使用独热编码的真正原因感到有些不满意。它让我思考了好几天,我真的没见过有人像我要解释的那样来解释它。

    独热编码可能是表示分类数据的最佳方式的原因可以直接从创建的向量中理解。因为我们最终为我们希望表示的每个类别添加了一个完整的维度,并且在一个向量中只有其中一个维度可以为 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(其本质上只是一个统计引擎)得出结论,允许类别值之间的差异比传入数据具有更大的权重。

    总而言之,它是独热编码的正交性,并且它们都是单位向量,这确保了引擎不会偏向于将类别本身关联起来。

    • James Carmichael 2025年2月27日 上午9:42 #

      Ryan 你好……感谢您为我们的讨论做出的贡献!

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。