# 机器学习数据处理One-Hot编码详解

> 作者/来源: UCloud 运营管理员
> 发布时间: 2022-09-25T05:53:00.000Z
> 分类: AI专区
> 标签: 存储, Python
> 原文链接: http://117.50.162.249:3000/yun/articles/2462

---

# 机器学习数据处理One-Hot编码详解

> 来源: https://www.ucloud.cn/yun/127829.html
> 作者: 89542767
> 发布日期: 发布于2022-09-25 13:53

大家都知道，最近人工智能是比较火热的，那么，人工智能主要应用的就是机器学习，但是机器学习对其要求还是比较高的。在使用机器学习处理数据的时候，会经常性的用到One-Hot代码，下面小编就具体给大家介绍下这种编码的实现方式。

**1.为什么使用one-hot编码？**

　　在人工智能算法中，大家难免会遇到归类基本特征，比如说：人的性别有男人女人，国家有日本，韩国，朝鲜等。这类特征值并不是连续不断的，反而是分离的，混乱的。

　　目的：

　　如果要作为机器学习算法的输入，通常我们需要对其进行特征数字化。什么是特征数字化呢？例如：

　　性别特征：["男"，"女"]

　　祖国特征：["日本"，"韩国，"朝鲜"]

　　运动特征：["网球"，"游泳"，"田径"，"排球"]

　　瓶颈：

　　假如某个样本（某个人），他的特征是["男","中国","乒乓球"]，我们可以用[0,0,4]来表示，但是这样的特征处理并不能直接放入机器学习算法中。因为类别之间是无序的。

　　2.什么是one-hot编码？

　　定义：

　　独热编码即One-Hot编写代码，又被称为一个有效的编写代码。其方法采用N位状态寄存器的方式对N个工作状态开展编写代码，每一个工作状态都有其自主的存储器位，而且在随意情况下，在其中仅有一个有效的。

　　理解：

　　One-Hot编码是分类变量作为二进制向量的表示。

　　(1)将分类值映射到整数值。

　　(2)然后，每个整数值被表示为二进制向量，除了整数的索引之外，它都是零值，它被标记为1。

　　举例1：

　　举个例子，假设我们有四个样本（行），每个样本有三个特征（列），如图：

　　上述feature\_1有两种可能的取值，比如是男/女，这里男用1表示，女用2表示。feature\_2和feature\_3各有4种取值（状态）。

　　one-hot编码就是保证每个样本中的单个特征只有1位处于状态1，其他的都是0。

　　上述状态用one-hot编码如下图所示：

![0.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127829/images/127829_000.png)

　　举例2：

　　按照N位状态寄存器来对N个状态进行编码的原理，处理后应该是这样的

　　性别特征：["男","女"]（这里只有两个特征，所以N=2）：

　　男=>10

　　女=>01

　　祖国特征：["中国"，"美国，"法国"]（N=3）：

　　中国=>100

　　美国=>010

　　法国=>001

　　运动特征：["足球"，"篮球"，"羽毛球"，"乒乓球"]（N=4）：

　　足球=>1000

　　篮球=>0100

　　羽毛球=>0010

　　乒乓球=>0001

　　所以，当一个样本为["男","中国","乒乓球"]的时候，完整的特征数字化的结果为：

　　[1，0，1，0，0，0，0，0，1]

　　下图可能会更好理解：

![2.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127829/images/127829_001.png)

　　python代码示例：

```
　fromsklearnimportpreprocessing
　　enc=preprocessing.OneHotEncoder()
　　enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])#训练。这里共有4个数据，3种特征
　　array=enc.transform([[0,1,3]]).toarray()#测试。这里使用1个新数据来测试
　　printarray#[[100100001]]#独热编码结果
```

　　以上对应关系可以解释为下图：

![3.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127829/images/127829_002.png)

　　3.one-hot编码优缺点？

　　优点：

　　(1)化解了训练样本不太好解决离散数据的情况。

　　a.欧几里得空间。在重归，归类，层次聚类等人工智能算法中，基本特征之间距离计算或相似度计算是很重要的，也许我们常见的相距或相似性的计算方法都会在欧几里得空间的相似度计算，计算余弦相似性，基于的就是欧几里得空间。

　　b.one-hot编写代码。使用one-hot编写代码，将离散特征的选值扩大到了欧几里得空间，离散特征跟某个选值就相匹配欧几里得空间跟某个点。将离散型基本特征使用one-hot编写代码，确实会让基本特征之间的距离计算更加合理。

　　(2)在很大程度上起到了很好的扩大特点的功效。

　　缺点：

　　在文本特征表示上有些缺点就非常突出了。

　　(1)它是一个词袋模型，不考虑词与词之间的顺序（文本中词的顺序信息也是很重要的）；

　　(2)它假设词与词相互独立（在大多数情况下，词与词是相互影响的）；

　　(3)它得到的特征是离散稀疏的(这个问题最严重)。

　　上述第3点展开：

　　(1)为什么得到的特征是离散稀疏的？

　　例如，如果将世界所有城市名称作为语料库的话，那这个向量会过于稀疏，并且会造成维度灾难。如下：

　　杭州[0,0,0,0,0,0,0,1,0,……，0,0,0,0,0,0,0]

　　上海[0,0,0,0,1,0,0,0,0,……，0,0,0,0,0,0,0]

　　宁波[0,0,0,1,0,0,0,0,0,……，0,0,0,0,0,0,0]

　　北京[0,0,0,0,0,0,0,0,0,……，1,0,0,0,0,0,0]

　　在语料库中，杭州、上海、宁波、北京各对应一个向量，向量中只有一个值为1，其余都为0。

　　(2)能不能把词向量的维度变小呢？

　　a)Dristributedrepresentation：

　　可以解决Onehotrepresentation的问题，它的思路是:

　　1.通过训练，将每个词都映射到一个较短的词向量上来。

　　2.所有的这些词向量就构成了向量空间，

　　3.进而可以用普通的统计学的方法来研究词与词之间的关系。

　　这个较短的词向量维度是多大呢？这个一般需要我们在训练时自己来指定。

　　b)举例：

　　1.比如将词汇表里的词用"Royalty","Masculinity","Femininity"和"Age"4个维度来表示，King这个词对应的词向量可能是(0.99,0.99,0.05,0.7)。

![4.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127829/images/127829_003.png)

　　2.在实际情况中，并不能对词向量的每个维度做一个很好的解释。

　　3.将king这个词从一个可能非常稀疏的向量坐在的空间，映射到现在这个四维向量所在的空间，必须满足以下性质：

　　（1）这个映射是单射；

　　（2）映射之后的向量不会丢失之前的那种向量所含的信息。

　　4.这个过程称为wordembedding（词嵌入），即将高维词向量嵌入到一个低维空间。如图：

![6.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127829/images/127829_004.png)

　　5.经过我们一系列的降维神操作，有了用representation表示的较短的词向量，我们就可以较容易的分析词之间的关系了，比如我们将词的维度降维到2维，有一个有趣的研究表明，用下图的词向量表示我们的词时，我们可以发现：

　　6.出现这种现象的原因是，我们得到最后的词向量的训练过程中引入了词的上下文。举例：

![7.png](https://ucloud-blog.cn-bj.ufileos.com/articles/127829/images/127829_005.png)

　　想到得到"learning"的词向量，但训练过程中，你同时考虑了它左右的上下文，那么就可以使"learning"带有语义信息了。通过这种操作，我们可以得到近义词，甚至cat和它的复数cats的向量极其相近。

　　以上为止，小编就给大家介绍到这里了，希望可以能给各位读者带来帮助。