前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习之独热编码(One-Hot)详解(代码解释)

机器学习之独热编码(One-Hot)详解(代码解释)

作者头像
用户7699929
发布2020-08-27 11:40:32
26.2K0
发布2020-08-27 11:40:32
举报
文章被收录于专栏:一刻AI一刻AI

01

什么是One-Hot编码

One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。

One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

听概念的话显得比较复杂,我们来看一个例子。

假设我们有一群学生,他们可以通过四个特征来形容,分别是:

  • 性别:[“男”,“女”]
  • 年级:[“初一”,“初二”,“初三”]
  • 学校:[“一中”,“二中”,“三中”,“四中”]

举个例子,用上述四个特征来描述小明同学,即“男生,初一,来自二中”,如果特征类别是有序的话,我们能够用表示顺序的数组表示

即“男生,初一,来自一中” ==> [0,0,1]

但是这样的特征处理并不能直接放入机器学习算法中,因为类别之间是无序的。

这时候就可以用独热编码的形式来表示了,我们用采用N位状态寄存器来对N个状态进行编码,拿上面的例子来说,就是:

性别

[“男”,“女”]

N=2

男:1 0女:0 1

年级

[“初一”,“初二”,“初三”]

N=3

初一:1 0 0 初二:0 1 0初三:0 0 1

学校

[“一中”,“二中”,“三中”,“四中”]

N=4

一中:1 0 0 0二中:0 1 0 0三中:0 0 1 0四中:0 0 0 1

因此,当我们再来描述小明的时候,就可以采用 [1 0 1 0 0 0 1 0 0]

02

One-Hot编码的作用

之所以使用One-Hot编码,是因为在很多机器学习任务中,特征并不总是连续值,也有可能是离散值(如上表中的数据)。将这些数据用数字来表示,执行的效率会高很多。

  • 性别:[“男”,“女”]
  • 年级:[“初一”,“初二”,“初三”]
  • 学校:[“一中”,“二中”,“三中”,“四中”]

若是直接转换成数字的话,[“男”,“初二”,“四中”]的表示方式就是[0,1,3]。

然而,即使转化为数字表示后,上述数据也不能直接用在分类器中。因为分类器往往默认数据数据是连续的、有序的。但是,直接数字并不是有序的,而是随机分配的。为了解决上述问题,其中一种可能的解决方法是采用独热编码。

03

One-Hot编码的代码解释

很多人在介绍独热编码的时候,都引用了下面这段代码,但是解释的比较模糊,下面详细解释一下。

代码语言:javascript
复制
from sklearn import preprocessing  

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()  #这里使用一个新的数据来测试

print(array)   # [[ 1  0  0  1  0  0  0  0  1]]

这里一共有四个数据,三种特征。是哪四个呢,我们列出矩阵

第一种

第二种

第三种

第一个

0

0

3

第二个

1

1

0

第三个

0

2

1

第四个

1

0

2

我们竖着看,可以看出第一种特征中只有0、1两类,第二组有0,、1、2三类,第三种有0、1、2、3四类,因此分别可以用2、3、4个状态类来表示。

enc.transform就是将[0,1,3]这组特征转换成one hot编码,toarray()则是转成数组形式。

第一个数为0,对应第一种特征则为 1 0;

第二个数为1,对应第二种特征则为 0 1 0;

第三个数为3,对应第三种特征则为 0 0 0 1。

所以最后的输出为:[[ 1 0 0 1 0 0 0 0 1]]

同样的,当我们拿小明的表述[0,0,1]来测试的时候,得到了与第一个例子相同的结果。

代码语言:javascript
复制
from sklearn import preprocessing  
 
enc = preprocessing.OneHotEncoder()  
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])  #这里一共有4个数据,3种特征
 
array = enc.transform([[0,0,1]]).toarray()  #这里使用一个新的数据来测试
 
print(array)   [[1. 0. 1. 0. 0. 0. 1. 0. 0.]]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一刻AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档