one-hot encoding

1. abstract

在机器学习中,大多算法是基于数字类型进行建模的,而实际情况往往包含了很多非数值型变量,如category类型。在遇到字符类型变量时,则需要对数值进行预处理,将其映射成数字。通常对于有序类型,如A>B>C, 则可处理为3,2,1。但对于无序类型按此种方式处理的话则不太合理,比如{x, y, z},如果映射成{1, 2, 3},那么在聚类算法中计算得到的x-y和y-z的距离则小于x-z的距离,显然这不是我们想要的结果。为了解决这个问题,我们可以采用one-hot encoding(独热编码)。

2. introduction

one-hot encoding(独热编码), 或者称为独热码(one-hot code),其原理是将一个特征中的所有类别映射到一个多维的向量空间中,被选中的类别值为1。比如地理位置特征包含了三个类别{“NewYork”, “Beijing”, “Shanghai”} (见表2.1), 经过one-hot encoding处理后则扩展成三个新的特征变量location_NewYork, location_Beijing, location_Shanghai ,如表2.2所示。

表2.1 原始数据

location temperature
NewYork 20
Beijing 15
Shanghai 8

表2.2 经过one-hot encoding处理后的数据

location_NewYork location_Beijing location_Shanghai temperature
1 0 0 20
0 1 0 15
0 0 1 8

这样一来,location这个特征各类别间的距离就能保证一致了。

3. practice

利用pandas的get_dummies()可以实现one-hot encoding.

1> 准备数据
1
2
3
4
5
6
7
In[4]: pd_a = pd.DataFrame(data=[['NewYork', 20], ['Beijing', 15], ['Shanghai', 8]], columns=['location', 'temperature'])
In[5]: pd_a
Out[5]:
location temperature
0 NewYork 20
1 Beijing 15
2 Shanghai 8
2> 数据预处理

step 1, 转换location数据

1
2
3
4
5
6
In[6]: pd.get_dummies(pd_a['location'], prefix='location')
Out[6]:
location_Beijing location_NewYork location_Shanghai
0 0 1 0
1 1 0 0
2 0 0 1

step 2, 将转换后的数据连接到原数据上
1
2
3
4
5
6
7
8
9
10
11
12
In[7]: loc = pd.get_dummies(pd_a['location'], prefix='location')
In[8]: pd_a = pd.concat([pd_a, loc], axis=1)
In[9]: pd_a
Out[9]:
location temperature location_Beijing location_NewYork \
0 NewYork 20 0 1
1 Beijing 15 1 0
2 Shanghai 8 0 0
location_Shanghai
0 0
1 0
2 1

step 3, 删除原location数据(如果inplace为false,则原数据不会改变)
1
2
3
4
5
6
7
In[13]: pd_a.drop(['location'], axis=1, inplace=True)
In[14]: pd_a
Out[14]:
temperature location_Beijing location_NewYork location_Shanghai
0 20 0 1 0
1 15 1 0 0
2 8 0 0 1

4. conclusion

one-hot encoding在处理category类型的特征上确实是个不错的选择,至少保证了我们在计算不同case间的距离或相似度上不致出现偏差。但不难发现,此算法增加了数据的特征维度,如果特征的类别数量很多的话,在存储和计算上会存在很大的消耗。所以,我们需要根据实际情况去考虑是否使用one-hot encoding进行数据预处理。当然,也有人提出了在此类情形下可以采用降维算法来降低特征维度,至于是否可行还有待调研。

5. references

[1] https://zhuanlan.zhihu.com/p/35287916
[2] https://blog.csdn.net/luguanyou/article/details/80599666


one-hot encoding
https://r-future.github.io/post/one-hot-encoding/
Author
Future
Posted on
June 25, 2019
Licensed under