机器学习中会遇到一些离散型数据,没法带入模型进行训练,因此要对其进行编码,经常使用的编码方式有两种:app
一、特征不具有大小意义的直接独热编码(one-hot encoding)机器学习
二、特征有大小意义的采用映射编码(map encoding)学习
两种编码在sklearn.preprocessing包里有实现方法编码
映射编码就是用一个字典指定不一样离散型数据对应哪些数字spa
import pandas as pd df = pd.DataFrame([ ['green', 'M', 10.1, 'label1'], ['red', 'L', 13.5, 'label2'], ['blue', 'XL', 15.3, 'label2']]) # color、label不具有大小含义,size具备大小意义 df.columns = ['color', 'size', 'length', 'label'] size_mapping = { 'XL': 3, 'L': 2, 'M': 1} df['size'] = df['size'].map(size_mapping)
one-hot编码有两种形式:code
1.one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每一个状态都有它独立的寄存器位,而且在任意时候,其中只有一位有效。举个例子,假设咱们有四个样本(行),每一个样本有三个特征(列),如图:blog
上图中咱们已经对每一个特征进行了普通的数字编码:咱们的feature_1有两种可能的取值,好比是男/女,这里男用1表示,女用2表示。那么one-hot编码是怎么搞的呢?咱们再拿feature_2来讲明:get
这里feature_2 有4种取值(状态),咱们就用4个状态位来表示这个特征,one-hot编码就是保证每一个样本中的单个特征只有1位处于状态1,其余的都是0。pandas
对于2种状态、三种状态、甚至更多状态都是这样表示,因此咱们能够获得这些样本特征的新表示:class
one-hot编码将每一个状态位都当作一个特征。对于前两个样本咱们能够获得它的特征向量分别为
one hot在特征提取上属于词袋模型(bag of words)。关于如何使用one-hot抽取文本特征向量咱们经过如下例子来讲明。假设咱们的语料库中有三段话:
我爱中国
爸爸妈妈爱我
爸爸妈妈爱中国
咱们首先对预料库分离并获取其中全部的词,而后对每一个此进行编号:
1 我; 2 爱; 3 爸爸; 4 妈妈;5 中国
而后使用one hot对每段话提取特征向量:
;
;
所以咱们获得了最终的特征向量为
我爱中国 -> 1,1,0,0,1
爸爸妈妈爱我 -> 1,1,1,1,0
爸爸妈妈爱中国 -> 0,1,1,1,1
优势:一是解决了分类器很差处理离散数据的问题,二是在必定程度上也起到了扩充特征的做用(上面样本特征数从3扩展到了9)
缺点:在文本特征表示上有些缺点就很是突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数状况下,词与词是相互影响的);最后,它获得的特征是离散稀疏的。
one-hot的基本思想:将离散型特征的每一种取值都当作一种状态,若你的这一特征中有N个不相同的取值,那么咱们就能够将该特征抽象成N种不一样的状态,one-hot编码保证了每个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其余状态位都是0。举个例子,假设咱们以学历为例,咱们想要研究的类别为小学、中学、大学、硕士、博士五种类别,咱们使用one-hot对其编码就会获得:
dummy encoding在pandas中有get_dummies()方法能够实现