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> 数据预处理
step 1, 转换location数据1
2
3
4
5
6In[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
12In[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
7In[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