简单介绍
有一组数据,其中有个特征是性别。既然是性别,那它的值显然只有两个选择,要么男性(用1表示)要么女性(用0表示)。
独热编码就是将这一个特征变成两个特征:是男性、是女性。
我是男的,我的特征就变成了 [1, 0],1代表我是男的,0代表我不是女的。同样,女性的特征变为[0, 1]。
用处
为什么用独热编码?
假设一个特征是颜色,选项有:黄色、红色、绿色等等。如果我们不采用独热编码,用0表示黄色,用1表示绿色,用2表示红色,以此类推。从数学上看,它们之间的距离不一样了,0和1的距离显然比0和2的距离小,可是不能认为黄色与红色的关系比绿色更接近。
采用独热编码后,黄色变成[1, 0, 0 , … ],红色变成[0, 1, 0, … ],绿色变成[0, 0, 1, … ],这样它们的相似度就一样了,这对机器学习算法很重要。
怎么用
以性别为例,有两个人,一男一女。他们原始属性是[1]和[0]。
from sklearn.preprocessing import OneHotEncoder # 利用sklearn
enc = OneHotEncoder()
test=[[1],[0]]
enc.fit(test) # 调用函数
完成了,就是这么简单。
我们来预测一下
enc.transform([[1]]).toarray()
输出是
array([[ 0., 1.]])
有点简单唉,再复杂点,加上颜色属性,假设有三个人:
A 男性、红色衣服 [1 ,1 ]
B 男性、黄色衣服 [1 ,0 ]
C 女性、绿色衣服 [0 ,2 ]
在这三人的属性的基础上进行独热编码,编码成功后,看看D 女性、红色衣服会被编码成什么样子
test2=[[1,1],[1,0],[0,2]]
enc.fit(test2)
enc.transform([[0,1]]).toarray()
Out:
array([[ 1., 0., 0., 1., 0.]])
有五列数据,分别代表:女性、男性、黄色、红色、绿色。这是从A、B,C三人中得到的规律。
1代表是,0代表不是,很容易看出结果表示的是 女性、红色。
Pandas
依旧以年龄和颜色为例,我已经有了一堆数据,怎样快速地编码呢。
先做一个表格
import pandas as pd
from pandas import Series,DataFrame
df=pd.DataFrame({'sex': [1, 1, 0, 1], 'color': [1, 0, 2, 1]})
df
Out:
color sex
0 1 1
1 0 1
2 2 0
3 1 1
In:
s1 = pd.get_dummies(df['sex'], prefix = 'sex')
s1
Out:
sex_0 sex_1
0 0 1
1 0 1
2 1 0
3 0 1
In:
s2 = pd.get_dummies(df['color'], prefix = 'color')
s2
Out:
Out[21]:
color_0 color_1 color_2
0 0 1 0
1 1 0 0
2 0 0 1
In:
pd.concat([s1, s2],axis=1)
Out:
sex_0 sex_1 color_0 color_1 color_2
0 0 1 0 1 0
1 0 1 1 0 0
2 1 0 0 0 1
3 0 1 0 1 0
也可以同时对多个特征编码,结果是一样的
pd.get_dummies(df, columns=["color","sex"])