机器学习之One-Hot Encoding详解

one-hot编码解释-数据预处理之独热编码(One-Hot Encoding)

标签: AI

什么是one-hot编码?one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

假设有如下表格,记录了某网站访问者的三个信息:性别,来自,使用的浏览器:

考虑以下三个特征:

性别:["男","女"]

来自:["北京","上海","广州"]

使用的浏览器:["Firefox"," Chrome","Safari","Internet Explorer"]

如果将上述特征用数字表示。例如:

性别:["男","女"],我们用"0"表示"男",用"1"表示"女",则,["男","女"]可表示为[0,1]。其中,"男"对应0,"女"对应1

同样的:

表来自:["北京","上海","广州"],我们用"0"表示"北京",用"1"表示"上海",用"2"表示"广州",得到:

["北京","上海","广州"],表示为:[0,1,2]。其中,北京 对应 0,上海 对应 1,广州 对应 2。

使用的浏览器:["Firefox"," Chrome","Safari","Internet Explorer"],我们用"0"表示"Firefox",用"1"表示"Chrome",用"2"表示"Safari",用"3"表示"Internet Explorer",得到:

["Firefox"," Chrome","Safari","Internet Explorer"],表示为:[0,1,2,3]。其中 Firefox 对应0,Chrome 对应 1,Safari 对应 2,Internet Explorer 对应 3。

那么,如果现在有一个记录:

通过上面设置的对应关系,用数字表示,可表示为:[0,0,1]。

One-Hot Encoding

可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个**。

如上图:假设我们有四个样本(行,一共有四行),每个样本有三个特征(列,一共有三列,分别是:性别、来自、使用的浏览器),转化为数字以后,变为:

其中:特征1表示:性别,特征2表示:来自,特征3表示:使用的浏览器。

每个特征的取值个数(第一列共有2个取值,第二列有3个,第三列有4个),上图中我们已经对每个特征进行了普通的数字编码,那么one-hot编码是怎么计算的呢?我们拿特征3来说明:

特征3:使用的浏览器,有4种取值(状态),分别是 0,1,2,3。我们就用4个状态位来表示这个特征,one-hot编码要保证每个样本中的单个特征只有一位处于状态1(仅该位**),其他的都是0。

0表示为:1000(四个状态位)

1表示为:0100(四个状态位)

2表示为:0010(四个状态位)

3表示为:0001(四个状态位)

同理,特征2有3种取值(状态),分别是 0,1,2。我们就用3个状态位来表示这个特征,one-hot编码:

0表示为:100(三个状态位)

1表示为:010(三个状态位)

2表示为:001(三个状态位)

特征1,有2种取值(状态),分别是 0,1。我们就用2个状态位来表示这个特征,one-hot编码:

0表示为:10(两个状态位)

1表示为:01(两个状态位)

 所以我们可以得到上图样本特征的新表示:

对于四个样本我们可以得到它们的特征向量分别为:

样本1-->[1,0,1,0,0,1,0,0,0]====>[特征1+特征2+特征3]==>[10,100,1000]==>[1,0,1,0,0,1,0,0,0]

样本2-->[0,1,0,1,0,0,1,0,0]

样本3-->[0,1,0,0,1,0,0,1,0]

样本4-->[1,0,1,0,0,0,0,0,1]

基于python和Scikit-learn的一个简单例子,求样本5的one-hot编码

普通数字表示:[0,0,1]

输出:array([[1., 0., 1., 0., 0., 0., 1., 0., 0.]])

 
  1. import numpy

  2. import sklearn

  3. from sklearn.preprocessing import OneHotEncoder

  4. data=[

  5. [0,0,0],

  6. [1,1,1],

  7. [1,2,2],

  8. [0,1,3]

  9. ]

  10. encoder = OneHotEncoder()

  11. encoder.fit(data)

  12. ans = encoder.transform([[0, 0, 1]]).toarray()

  13. ans

另外一个基于python和Scikit-learn的一个简单例子:

 
  1. import numpy

  2. import sklearn

  3. from sklearn.preprocessing import OneHotEncoder

  4. encoder2 = OneHotEncoder()

  5. encoder2.fit([

  6. [0, 2, 1, 12],

  7. [1, 3, 5, 3],

  8. [2, 3, 2, 12],

  9. [1, 2, 4, 3]

  10. ])

  11. encoded_vector = encoder2.transform([[2, 3, 5, 3]]).toarray()

  12. encoded_vector

输出:

array([[0., 0., 1., 0., 1., 0., 0., 0., 1., 1., 0.]])

 

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值