one hot encoding

Posted iiiLISA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了one hot encoding相关的知识,希望对你有一定的参考价值。

感谢转:https://www.jianshu.com/p/cb344e1c860a
详细:https://zhuanlan.zhihu.com/p/134495345

一、问题来由

机器学习中的特征并不总是连续值,还有分类值。
离散特征的编码分为两种情况:
1、离散特征的取值没有大小顺序的含义
比如color:[red,blue],那么就使用one-hot编码
2、离散特征的取值有大小顺序的含义
比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}
(此种情况暂未遇到,先记下了)

分类器往往默认数据是连续的(可以计算距离?),并且是有序的。

二、one hot encoding

为了解决上述问题,采用one hot encoding(一位有效编码),其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,只有一位有效。
例如:

自然状态码为:000,001,010,011,100,101
独热编码为:000001,000010,000100,001000,010000,100000

例如:

from sklearn import preprocessing

encoder = preprocessing.OneHotEncoder()
encoder.fit([
    [0, 2, 1, 12],
    [1, 3, 5, 3],
    [2, 3, 2, 12],
    [1, 2, 4, 3]
])  # fit来学习编码
encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray()  # 进行编码
print("\\n Encoded vector =", encoded_vector)

输出为:


 Encoded vector = [[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
 
分析:
数据矩阵是4*4的,列数代表特征个数,行数代表每个特征的维度
第一列是[0,1,2,1],有(0,1,2)三种取值,所以可以对应编码为(100010,001)
第二列是[2,3,3,2],有(2,3)两种取值,对应编码为(10,01)
第三列是[1,5,2,4],有(1,2,4,5)四种取值,对应编码为(1000,0100,0010,0001)
第四列是[12,3,12,3],有(3,12)两种取值,对应编码为(10,01)
所以,[2,3,5,3]可以表示为[0,0,1,0,1,0,0,0,1,1,0]

三、为什么要才采用one hot encoding

将离散特征通过one-hot编码映射到欧式空间
因为,在回归、分类、聚类等机器学习算法中,特征之间的距离计算或者相似度计算是非常重要的,常用的距离或者相似度的计算都是基于欧式空间。

四、one hot encoding的优缺点

优点:独热编码解决了分类器不好处理属性数据的问题, 在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。

one-hot降维后的缺点:
降维前可以交叉的降维后可能变得不能交叉(暂时未接触到这种情况)

以上是关于one hot encoding的主要内容,如果未能解决你的问题,请参考以下文章

one-hot encoding是啥意思

如何从包含集合的 pandas 列转置和转换为“one-hot-encode”样式?

python one_hot_encode.py

One Hot Encoding:ValueError:无法将字符串转换为float:'是'

one hot encoding

从 scikit-learn 中的 one-hot-encoding 回溯分类特征?