从零开始-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())[/code]
输出结果为:
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))[/code]
输出结果为:
[[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)[/code]
其中,
drop_first = True表示去掉第一个状态,如果这个参数设置为False,则与Onehot编码一致。
下面用代码来说明:
from sklearn import preprocessing import numpy as np import pandas as pd if __name__ == '__main__' 4000 : 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)[/code]
结果为:
color price size
0 Red 5 10
1 Blue 6 14
2 Blue 10 20
3 Yellow 5 11drop_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 1drop_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编码。
阅读更多- pandas 下的 one hot encoder 及 pd.get_dummies() 与 sklearn.preprocessing 下的 OneHotEncoder 的区别
- SAP Business One与SAP的区别与联系
- new/delete和malloc/free区别与联系
- 日志采集系统flume和kafka有什么区别及联系,它们分别在什么时候使用,什么时候又可以结合?
- ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系
- (4)期末财务成果的核算&收入与利得、费用与损失的区别与联系
- git github gitlab 之间的区别和联系
- windows环境下lib和dll的区别和联系详细
- C#数据库编程中SqlDataAdapter与DataSet的区别与联系
- 19.abstract class和interface有什么区别?
- OOP与AOP的区别和联系
- Linux主分区,扩展分区,逻辑分区的联系和区别
- 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别
- 客户端与服务器端Socket的区别与联系?
- CBitmap,HBitmap,Bitmap区别及联系
- X Window 和GNOME、KDE的区别和联系?
- 嵌入式linux和嵌入式android系统有什么区别和联系?
- L0/L1/L2/Lp/L∞范数的联系与区别
- unix和linux的区别与联系详解
- 儿子和女儿——解释器和编译器的区别与联系