一、背景
在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化。那什么是特征数字化呢?例子如下:
性别特征:[“男”,”女”] =>[0,1]
祖国特征:[“中国”,”美国,”法国”] =>[0,1,2]
运动特征:[“足球”,”篮球”,”羽毛球”,”乒乓球”] =>[0,1,2,3]
假如某个样本,它的特征是这样的[“男”,”中国”,”乒乓球”],我们可以用 [0,0,3] 来表示,但是这样的特征处理并不能直接放入机器学习算法中,因为类别之间是无序的。
二、定义
独热编码是指将离散型的特征数据映射到一个高维空间中,每个可能的取值都对应于高维空间的一个点,在这些点上取值为1,其余均为0,因此独热编码也被称为“一位有效编码”或“One-of-K encoding”。
回到一开始的例子,性别特征:[“男”,”女”],按照N位状态寄存器来对N个状态进行编码的原理:
性别特征:[“男”,”女”](这里N=2 二维数据)
男 => 10
女 => 01
地区特征:[“北京”,”上海,”深圳”](这里N=3,三维数据):
北京 => 100
上海 => 010
深圳 => 001
工作特征:[“演员”,”厨师”,”公务员”,”工程师”,”律师”](这里N=5,五维数据):
演员 => 10000
老师 => 01000
公务员 => 00100
工程师 => 00010
消防员 => 00001
三、优缺点
独热编码的优点有以下几个:
- 能够处理非数值属性。比如血型、性别等
- 一定程度上扩充了特征。
- 编码后的向量是稀疏向量,只有一位是 1,其他都是 0,可以利用向量的稀疏来节省存储空间。
- 能够处理缺失值。当所有位都是 0,表示发生了缺失。此时可以采用处理缺失值提到的高维映射方法,用第 N+1 位来表示缺失值。
当然,独热编码也存在一些缺点:
高维度特征会带来以下几个方面问题:
- KNN 算法中,高维空间下两点之间的距离很难得到有效的衡量;
- 逻辑回归模型中,参数的数量会随着维度的增高而增加,导致模型复杂,出现过拟合问题;
- 通常只有部分维度是对分类、预测有帮助,需要借助特征选择来降低维度。
四、代码
from sklearn import preprocessingenc = preprocessing.OneHotEncoder()enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])#这里一共有4个数据,3种特征array = enc.transform([[0,1,3]]).toarray()#这里使用一个新的数据来测试print array # [[ 100100001]]
参考:
独热编码(One-Hot Encoding)-CSDN博客
机器学习:数据预处理之独热编码(One-Hot)详解-CSDN博客