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.]])
-
import numpy
-
import sklearn
-
from sklearn.preprocessing import OneHotEncoder
-
data=[
-
[0,0,0],
-
[1,1,1],
-
[1,2,2],
-
[0,1,3]
-
]
-
encoder = OneHotEncoder()
-
encoder.fit(data)
-
ans = encoder.transform([[0, 0, 1]]).toarray()
-
ans
另外一个基于python和Scikit-learn的一个简单例子:
-
import numpy
-
import sklearn
-
from sklearn.preprocessing import OneHotEncoder
-
encoder2 = OneHotEncoder()
-
encoder2.fit([
-
[0, 2, 1, 12],
-
[1, 3, 5, 3],
-
[2, 3, 2, 12],
-
[1, 2, 4, 3]
-
])
-
encoded_vector = encoder2.transform([[2, 3, 5, 3]]).toarray()
-
encoded_vector
输出:
array([[0., 0., 1., 0., 1., 0., 0., 0., 1., 1., 0.]])