感谢转: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(一位有效编码),其方法是使用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)三种取值,所以可以对应编码为(100,010,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编码映射到欧式空间
因为,在回归、分类、聚类等机器学习算法中,特征之间的距离计算或者相似度计算是非常重要的,常用的距离或者相似度的计算都是基于欧式空间。
优点:独热编码解决了分类器不好处理属性数据的问题, 在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。
one-hot降维后的缺点:
降维前可以交叉的降维后可能变得不能交叉(暂时未接触到这种情况)