one-hot编码(独热编码) \ 哑编码

学习sklearn和kagggle时遇到的问题,什么是独热编码?为什么要用独热编码?什么情况下可以用独热编码?以及和其他几种编码方式的区别。
首先了解机器学习中的特征类别:连续型特征离散型特征
拿到获取的原始特征,必须对每一特征分别进行归一化,比如,特征A的取值范围是[-1000,1000],特征B的取值范围是[-1,1].如果使用logistic回归,w1x1+w2x2,因为x1的取值太大了,所以x2基本起不了作用。所以,必须进行特征的归一化,每个特征都单独进行归一化。
对于连续性特征:

  • Rescale bounded continuous features: All continuous input that are bounded, rescale them to [-1, 1] through x = (2x - max - min)/(max - min). 线性放缩到[-1,1]
  • Standardize all continuous features: All continuous input should be standardized and by this I mean, for every continuous feature, compute its mean (u) and standard deviation (s) and do x = (x - u)/s. 放缩到均值为0,方差为1

对于离散性特征:

  • Binarize categorical/discrete features: 对于离散的特征基本就是按照one-hot(独热)编码,该离散特征有多少取值,就用多少维来表示该特征。

一. 什么是独热编码?
独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。举例如下:
假如有三种颜色特征:红、黄、蓝。 在利用机器学习的算法时一般需要进行向量化或者数字化。那么你可能想令 红=1,黄=2,蓝=3. 那么这样其实实现了标签编码,即给不同类别以标签。然而这意味着机器可能会学习到“红<黄<蓝”,但这并不是我们的让机器学习的本意,只是想让机器区分它们,并无大小比较之意。所以这时标签编码是不够的,需要进一步转换。因为有三种颜色状态,所以就有3个比特。即红色:1 0 0 ,黄色: 0 1 0,蓝色:0 0 1 。如此一来每两个向量之间的距离都是根号2,在向量空间距离都相等,所以这样不会出现偏序性,基本不会影响基于向量空间度量算法的效果。
自然状态码为:000,001,010,011,100,101
独热编码为:000001,000010,000100,001000,010000,100000
来一个sklearn的例子:

  1. from sklearn import preprocessing
  2. enc = preprocessing.OneHotEncoder()
  3. enc.fit([ [0, 0, 3],
  4. [1, 1, 0],
  5. [0, 2, 1],
  6. [1, 0, 2]]) # fit来学习编码
  7. enc.transform([[0, 1, 3]]).toarray() # 进行编码

输出:array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
数据矩阵是4*3,即4个数据,3个特征维度。
0 0 3 观察左边的数据矩阵,第一列为第一个特征维度,有两种取值0\1. 所以对应编码方式为10 、01
1 1 0 同理,第二列为第二个特征维度,有三种取值0\1\2,所以对应编码方式为100、010、001
0 2 1 同理,第三列为第三个特征维度,有四种取值0\1\2\3,所以对应编码方式为1000、0100、0010、0001
1 0 2
再来看要进行编码的参数[0 , 1, 3], 0作为第一个特征编码为10, 1作为第二个特征编码为010, 3作为第三个特征编码为0001. 故此编码结果为 1 0 0 1 0 0 0 0 1

原地址
上面是根据独热编码进行fit_transfrom

这里来个简单版本的 数据预处理之独热编码
但是没有提到特征中出现特征重复时候怎么办,比如示例中的 “性别特征:{‘男’, ‘女’}”
如果是“性别特征:{‘男’, ‘女’, ‘男’}”,那么N还是3,按照原方法编码后把相同特征代表的数字相加
男1: 100,男2:001,相加后 男:101

  1. OneHotEncoder()一次最多编码俩列
  2. 可以用
  3. # 直接整个丢进去,colums选择列,dummy_na 是否把NA值,作为一个离散值进行处理,默认为不处理,详见下方链接
  4. df.get_dummies(df,columns=nominal_features,dummy_na=True)

get_dummies 参数解释

标签编码

1,2,3……n

  1. from sklearn import LabelEncoder