一位有效编码(独热编码)

来源:互联网 发布:网络工程项目期中考试 编辑:程序博客网 时间:2024/06/04 23:32

简单介绍

有一组数据,其中有个特征是性别。既然是性别,那它的值显然只有两个选择,要么男性(用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 # 利用sklearnenc = 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,DataFramedf=pd.DataFrame({'sex': [1, 1, 0, 1], 'color': [1, 0, 2, 1]})df

Out:

   color  sex0      1    11      0    12      2    03      1    1

In:

s1 = pd.get_dummies(df['sex'], prefix = 'sex')s1

Out:

   sex_0  sex_10      0      11      0      12      1      03      0      1

In:

s2 = pd.get_dummies(df['color'], prefix = 'color')s2

Out:

Out[21]:    color_0  color_1  color_20        0        1        01        1        0        02        0        0        1

In:

pd.concat([s1, s2],axis=1)

Out:

   sex_0  sex_1  color_0  color_1  color_20      0      1        0        1        01      0      1        1        0        02      1      0        0        0        13      0      1        0        1        0

也可以同时对多个特征编码,结果是一样的

pd.get_dummies(df, columns=["color","sex"])
原创粉丝点击