zoukankan      html  css  js  c++  java
  • OneHot编码(转)

    机器学习:数据预处理之独热编码(One-Hot)

    前言

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

    在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。
    这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化。

    那什么是特征数字化呢?例子如下:

    • 性别特征:["男","女"]

    • 祖国特征:["中国","美国,"法国"]

    • 运动特征:["足球","篮球","羽毛球","乒乓球"]

    假如某个样本(某个人),他的特征是这样的["男","中国","乒乓球"],我们可以用 [0,0,4] 来表示,但是这样的特征处理并不能直接放入机器学习算法中。因为类别之间是无序的(运动数据就是任意排序的)。

    什么是独热编码(One-Hot)?

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

    One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。

    One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

    One-Hot实际案例

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

    就拿上面的例子来说吧,性别特征:["男","女"],按照N位状态寄存器来对N个状态进行编码的原理,咱们处理后应该是这样的(这里只有两个特征,所以N=2):

    男  =>  10

    女  =>  01

    祖国特征:["中国","美国,"法国"](这里N=3):

    中国  =>  100

    美国  =>  010

    法国  =>  001

    运动特征:["足球","篮球","羽毛球","乒乓球"](这里N=4):

    足球  =>  1000

    篮球  =>  0100

    羽毛球  =>  0010

    乒乓球  =>  0001

    所以,当一个样本为["男","中国","乒乓球"]的时候,完整的特征数字化的结果为:

    [1,0,1,0,0,0,0,0,1]

    下图可能会更好理解:

    https://img.mukewang.com/5b20f1b90001cc2202550045.jpg

    One-Hot在python中的使用

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

    1
    2
    3
    4
    5
    6
    7
    8
    from sklearn import preprocessing  
       
    enc = 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   # [[ 1  0  0  1  0  0  0  0  1]]

    结果为 1 0 0 1 0 0 0 0 1

    为什么使用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。

  • 相关阅读:
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之六 多点触控
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之九 定位
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之七 重力感应
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之五 保存数据的几种方式
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之三 Application 配置详解
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据
    ADOBE FLASH BUILDER 4.6 IOS 开发之部署与调试
    [译] 高性能JavaScript 1至5章总结
    页签及盒子的web标准实现
  • 原文地址:https://www.cnblogs.com/kongweisi/p/10623706.html
Copyright © 2011-2022 走看看