前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >One_Hot总结

One_Hot总结

作者头像
用户5745385
发布2019-07-03 17:36:39
6460
发布2019-07-03 17:36:39
举报
文章被收录于专栏:XSYMamba

前言:

平时做项目只知道One_Hot编码作用,并不知道原因,今天在用到

pandas.get_dummies()时,发现其实它OneHotEncoder封装

所以在进行相应编码时有俩种方式:

  • pandas.get_dummies()(pandas库中)
  • OneHotEncoder()(sklearn库中)

离散特征的编码处理分为两种情况:

1、离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码

2、离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}

为什么使用one-hot编码来处理离散型特征?

————————————————————————————

在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

而我们使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。

将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。

比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理

不需要使用one-hot编码来处理的情况

————————————————————————————

将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码。

比如,该离散特征共有1000个取值,我们分成两组,分别是400和600,两个小组之间的距离有合适的定义,组内的距离也有合适的定义,那就没必要用one-hot 编码。

离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。

One-Hot在python中的使用

————————————————————————————

代码语言:javascript
复制
该函数在 sklearn.preprocessing 类中,格式为:
# -*- coding: utf-8 -*-

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 1, 3]]).toarray()  # 如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定 sparse = False 来达到同样的效果
print(ans) # 输出 [[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

下面解释输出结果的意思。对于输入数组,这依旧是把每一行当作一个样本,每一列当作一个特征,

  1. 我们先来看第一个特征,即第一列 [0,1,0,1],也就是说它有两个取值 0 或者 1,那么 one-hot 就会使用两位来表示这个特征,[1,0] 表示 0, [0,1] 表示 1,在上例输出结果中的前两位 [1,0...] 也就是表示该特征为 0
  2. 第二个特征,第二列 [0,1,2,0],它有三种值,那么 one-hot 就会使用三位来表示这个特征,[1,0,0] 表示 0, [0,1,0] 表示 1,[0,0,1] 表示 2,在上例输出结果中的第三位到第六位 [...0,1,0,0...] 也就是表示该特征为 1
  3. 第二个特征,第三列 [3,0,1,2],它有四种值,那么 one-hot 就会使用四位来表示这个特征,[1,0,0,0] 表示 0, [0,1,0,0] 表示 1,[0,0,1,0] 表示 2,[0,0,0,1] 表示 3,在上例输出结果中的最后四位 [...0,0,0,1] 也就是表示该特征为 3

好了,到此相信我们已经很明白它的意思了。值得注意的是,虽然训练样本中的数值仅仅代表类别,但是也必须使用数值格式的数据,如果使用字符串格式的数据会报错

下面解释一下函数中参数的意思

n_values=’auto’,表示每个特征使用几维的数值由数据集自动推断,即几种类别就使用几位来表示。当然也可以自己指定,看下面这个例子:

代码语言:javascript
复制
# -*- coding: utf-8 -*-

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(n_values = [2, 3, 4])
enc.fit([[0, 0, 3],
         [1, 1, 0]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) # 输出 [[ 1.  0.  0.  0.  1.  0.  0.  0.  1.]]

注意到训练样本中第二个特征列没有类别 2,但是结果中依然将类别 2 给编码了出来,这就是自己指定维数的作用了(我们使用 3 位来表示第二个特征,自然包括了类别 2),第三列特征同样如此。这也告诫我们,如果训练样本中有丢失的分类特征值,我们就必须显示地设置参数 n_values 了,这样防止编码出错。

categorical_features = 'all',这个参数指定了对哪些特征进行编码,默认对所有类别都进行编码。也可以自己指定选择哪些特征,通过索引或者 bool 值来指定,看下例:

代码语言:javascript
复制
# -*- coding: utf-8 -*-

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(categorical_features = [0,2]) # 等价于 [True, False, True]
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) # 输出 [[ 1.  0.  0.  0.  0.  1.  2.]]

输出结果中前两位 [1,0] 表示 0,中间四位 [0,0,0,1] 表示对第三个特征 3 编码,第二个特征 2 没有进行编码,就放在最后一位。

  1. dtype=<class ‘numpy.float64’> 表示编码数值格式,默认是浮点型。
  2. sparse=True 表示编码的格式,默认为 True,即为稀疏的格式,指定 False 则就不用 toarray() 了
  3. handle_unknown=’error’,其值可以指定为 "error" 或者 "ignore",即如果碰到未知的类别,是返回一个错误还是忽略它。

方法 transform(X) 就是对 XX 进行编码了。在实际应用中,我们更常用方法 fit_transform(),也就是一步到位,看下例:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
from sklearn.preprocessing import  OneHotEncoder
enc = OneHotEncoder(sparse = False) 
ans = enc.fit_transform([[0, 0, 3],
                         [1, 1, 0],
                         [0, 2, 1],
                         [1, 0, 2]])
print(ans) # 输出 [[ 1.  0.  1. ...,  0.  0.  1.]
           #      [ 0.  1.  0. ...,  0.  0.  0.]
           #      [ 1.  0.  0. ...,  1.  0.  0.]
           #      [ 0.  1.  1. ...,  0.  1.  0.]]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 XSYMamba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不需要使用one-hot编码来处理的情况
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档