从零开始-Machine Learning学习笔记(19)-One-hot与哑变量的区别与联系

One-hot与哑变量的区别与联系

1. One-hot编码

  独热编码直观来说就是有多少个状态就有多少个bit,且只有一个bit是1,其余全是0的一种编码方式。举个例子就是一个气球有四种颜色红色R,紫色P,蓝色B和黄色Y,我们使用One-hot进行编码就可以表示为:

红色R — 0001
紫色P — 0010
蓝色B — 0100
黄色Y — 1000

如果此时气球的特征还有大小之分,那么可以给大气球编码01,给小气球编码10。所以一条数据为红色大气球就可编码为000101,就是将两个特征的one-hot编码进行拼接,在python中我们可以调用sklearn中的库。

from sklearn import preprocessing
import numpy as np
if __name__ == '__main__':
    array = np.array([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
    print('array = \n', array)
    enc = preprocessing.OneHotEncoder()
    enc.fit(array)
    print('One-hot encoder bit: ', enc.n_values_)
    print('One-hot encoder : ',enc.transform([[0, 1, 3]]).toarray())

输出结果为:

array =
[[0 0 3]
[1 1 0]
[0 2 1]
[1 0 2]]
One-hot encoder bit: [2 3 4]
One-hot encoder : [[1. 0. 0. 1. 0. 0. 0. 0. 1.]]

可以看到,第一列只有0和1两个状态,所以使用了两位来编码,第二列有三个状态0,1,2,所以使用了三位来编码,第三列有四个状态,所以使用了4位来编码,将编码拼接起来就得到了one-hot编码。在sklearn中,我们调用库OneHotEncoder(),调用函数fit()对数据进行训练,调用transform()对新的数据进行编码。可以通过调用enc.n_values_来查看每个特征(列)编码的比特数。
 但是,我们通常使用fit_transform()函数对自身进行编码,如下所示:

 print('One-hot encoder : ',enc.fit_transform(array))

输出结果为:

[[1. 0. 1. 0. 0. 0. 0. 0. 1.] -> 0 0 3
[0. 1. 0. 1. 0. 1. 0. 0. 0.] -> 1 1 0
[1. 0. 0. 0. 1. 0. 1. 0. 0.] -> 0 2 1
[0. 1. 1. 0. 0. 0. 0. 1. 0.]] -> 1 0 2


2. 哑变量与One-hot编码的区别与联系

  哑变量与One-hot编码的区别在于:哑变量将定性特征转化为n-1个特征,而One-hot则是转化为n个特征。意思就是哑变量在编码时会去除第一个状态,而One-hot则对所有的状态都会进行编码。
  哑变量可以调用pandas中的get_dummies()来实现:

pd.get_dummies(df,columns = ['df_column_name'],drop_first = True)

其中,drop_first = True表示去掉第一个状态,如果这个参数设置为False,则与Onehot编码一致。
下面用代码来说明:

from sklearn import preprocessing
import numpy as np
import pandas as pd

if __name__ == '__main__':
    data = pd.DataFrame({'color': ['Red', 'Blue', 'Blue', 'Yellow'], 'size' : [10, 14, 20, 11], 'price' : [5, 6, 10, 5]})
    dummy_code1 = pd.get_dummies(data, columns=['color'])
    dummy_code2 = pd.get_dummies(data, columns=['color'], drop_first=True)
    print(data)
    print('drop_first = False:\n', dummy_code1)
    print('drop_first = True:\n', dummy_code2)

结果为:

color price size
0 Red 5 10
1 Blue 6 14
2 Blue 10 20
3 Yellow 5 11

drop_first = False:
price size color_Blue color_Red color_Yellow
0 5 10 0 1 0
1 6 14 1 0 0
2 10 20 1 0 0
3 5 11 0 0 1

drop_first = True:
price size color_Red color_Yellow
0 5 10 1 0
1 6 14 0 0
2 10 20 0 0
3 5 11 0 1

从结果可以看出,如果drop_first = False则编码结果就是One-hot编码,如果设置drop_first = True,则会去掉第一个状态,变成了哑变量,用全部为0来表示第一个状态。

值得注意的是:One-hot不能对字符串类型的状态进行编码!!!,需要先将字符串类型转化为连续的数值型变量,再进行编码


3. 为什么要使用One-hot编码

  在进行机器学习的时候,我们通常需要对数据进行处理。很多时候我们会遇到字符串型的数据,这个时候我们需要把它转化成我们需要的数值型变量,如性别:男、女。如果我们直接给男赋值为1, 女赋值为0,就会有一个问题出现:男比女大。所以为了避免出现这种由于人为赋值造成的变量间的差异,所以我们采用One-hot编码。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值