精华内容
下载资源
问答
  • 下面将给出两种预测onehot编码方法,其中模型用LinearRegression。 汽车数据 密码:7izi 2.训练+预测 2.1.get_dummies方法 import pandas as pd df = pd.read_csv('carprices.csv') dummies = pd.get_dummies(df['Car...
  • 机器学习算法中,常会遇到分类特征是离散的,无序的。例如:性别有男、女,城市有北京,上海,深圳等。性别特征:["男","女"] => 0,1地区特征:["北京","上海,"深圳"] => 0,1,2工作特征:["演员",...

    在机器学习算法中,常会遇到分类特征是离散的,无序的。例如:性别有男、女,城市有北京,上海,深圳等。

    性别特征:

    ["男","女"] => 0,1

    地区特征:

    ["北京","上海,"深圳"] => 0,1,2

    工作特征:

    ["演员","厨师","公务员","工程师","律师"] => 0,1,2,3,4

    比如,样本(女,北京,工程师)=>(1,0,3),但是,这样的特征处理并不能直接放入机器学习算法中,因为,分类器通常数据是连续且有序。解决这类问题,一种解决方法是采用独热编码(One-Hot Encoding)。

    什么是独热编码

    独热编码(One-Hot Encoding),又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。即,只有一位是1,其余都是零值。

    例如,对六个状态进行编码:

    自然顺序码为 000,001,010,011,100,101

    独热编码则是 000001,000010,000100,001000,010000,100000

    回到一开始的例子,性别特征:["男","女"],按照N位状态寄存器来对N个状态进行编码的原理:

    性别特征:["男","女"](这里N=2)

    男 => 10

    女 => 01

    地区特征:["北京","上海,"深圳"](这里N=3):

    北京 => 100

    上海 => 010

    深圳 => 001

    工作特征:["演员","厨师","公务员","工程师","律师"](这里N=5):

    演员 => 10000

    厨师 => 01000

    公务员 => 00100

    工程师 => 00010

    律师 => 00001

    所以,样本的特征是["女","北京","工程师"]的时候,独热编码(One-Hot Encoding)的结果为:[0,1,1,0,0,0,0,0,1,0]

    展开全文
  • 本文转载记录并学习一下热编码机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。 这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化。 ...

    本文转载记录并学习一下热编码

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

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

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

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

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

    假如某个样本(某个人),他的特征是这样的["男","中国","乒乓球"],我们可以用 [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://img1.sycdn.imooc.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。


    作者:NateHuang
    链接:https://www.imooc.com/article/35900
    来源:慕课网

    展开全文
  • 什么是独热编码? ———————————————————————————————————————— 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。 这些特征...

    一. 什么是独热编码?

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

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

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

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

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

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

    假如某个样本(某个人),他的特征是这样的["男","中国","乒乓球"],我们可以用 [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。

     

    示例详解:

    假如有三种颜色特征:红、黄、蓝。 在利用机器学习的算法时一般需要进行向量化或者数字化。那么你可能想令 红=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的例子:

     

    from sklearn import preprocessing  
    enc = preprocessing.OneHotEncoder()  
    enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])    # fit来学习编码  
    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

     

    再来看要进行编码的参数[0 , 1, 3], 0作为第一个特征编码为10, 1作为第二个特征编码为010, 3作为第三个特征编码为0001. 故此编码结果为 1 0 0 1 0 0 0 0 1

    二. 为什么要独热编码?

    正如上文所言,独热编码(哑变量 dummy variable)是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。

    为什么特征向量要映射到欧式空间?

    将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

    三 .独热编码优缺点

    • 优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。

    • 缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。

    四. 什么情况下(不)用独热编码?

    • 用:独热编码用来解决类别型数据的离散值问题,

    • 不用:将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码。 有些基于树的算法在处理变量时,并不是基于向量空间度量,数值只是个类别符号,即没有偏序关系,所以不用进行独热编码。 Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。

    总的来说,要是one hot encoding的类别数目不太多,建议优先考虑。

    五. 什么情况下(不)需要归一化?

    • 需要: 基于参数的模型或基于距离的模型,都是要进行特征的归一化。

    • 不需要:基于树的方法是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。

    六. 标签编码LabelEncoder

    作用: 利用LabelEncoder() 将转换成连续的数值型变量。即是对不连续的数字或者文本进行编号例如:

     

    from sklearn.preprocessing import LabelEncoder  
    le = LabelEncoder()  
    le.fit([1,5,67,100])  
    le.transform([1,1,100,67,5])  
    

    输出: array([0,0,3,2,1])

     

    >>> le = preprocessing.LabelEncoder()  
    >>> le.fit(["paris", "paris", "tokyo", "amsterdam"])  
    LabelEncoder()  
    >>> list(le.classes_)  
    ['amsterdam', 'paris', 'tokyo']     # 三个类别分别为0 1 2  
    >>> le.transform(["tokyo", "tokyo", "paris"])   
    array([2, 2, 1]...)      
    >>> list(le.inverse_transform([2, 2, 1]))   # 逆过程  
    ['tokyo', 'tokyo', 'paris'] 
    

    限制:上文颜色的例子已经提到标签编码了。Label encoding在某些情况下很有用,但是场景限制很多。再举一例:比如有[dog,cat,dog,mouse,cat],我们把其转换为[1,2,1,3,2]。这里就产生了一个奇怪的现象:dog和mouse的平均值是cat。所以目前还没有发现标签编码的广泛使用。

    附:基本的机器学习过程

     

    我们使用sklearn进行虚线框内的工作(sklearn也可以进行文本特征提取)。通过分析sklearn源码,我们可以看到除训练,预测和评估以外,处理其他工作的类都实现了3个方法:fit、transform和fit_transform。从命名中可以看到,fit_transform方法是先调用fit然后调用transform,我们只需要关注fit方法和transform方法即可。

    transform方法主要用来对特征进行转换。从可利用信息的角度来说,转换分为无信息转换和有信息转换。无信息转换是指不利用任何其他信息进行转换,比如指数、对数函数转换等。有信息转换从是否利用目标值向量又可分为无监督转换和有监督转换。无监督转换指只利用特征的统计信息的转换,统计信息包括均值、标准差、边界等等,比如标准化、PCA法降维等。有监督转换指既利用了特征信息又利用了目标值信息的转换,比如通过模型选择特征、LDA法降维等。通过总结常用的转换类,我们得到下表:

     

    不难看到,只有有信息的转换类的fit方法才实际有用,显然fit方法的主要工作是获取特征信息和目标值信息,在这点上,fit方法和模型训练时的fit方法就能够联系在一起了:都是通过分析特征和目标值,提取有价值的信息,对于转换类来说是某些统计量,对于模型来说可能是特征的权值系数等。另外,只有有监督的转换类的fit和transform方法才需要特征和目标值两个参数。fit方法无用不代表其没实现,而是除合法性校验以外,其并没有对特征和目标值进行任何处理,Normalizer的fit方法实现如下:

     

    def fit(self, X, y=None):  
            """Do nothing and return the estimator unchanged 
            This method is just there to implement the usual API and hence 
            work in pipelines. 
            """  
            X = check_array(X, accept_sparse='csr')  
            return self  

    ==============使用示例: ==================

     

    背景:

    在拿到的数据里,经常有分类型变量的存在,如下:
    球鞋品牌:Nike、adidas、 Vans、PUMA、CONVERSE
    性别:男、女
    颜色:红、黄、蓝、绿
    However,sklearn大佬不能直接分析这类变量呀。在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是算法关键部分,而常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。于是,我们要对这些分类变量进行哑变量处理,又或者叫虚拟变量。
    缺点:
    当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。有些基于树的算法在处理变量时,并不是基于向量空间度量,数值只是个类别符号,即没有偏序关系,所以不用进行独热编码。Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。
    In summary,
    要是one hot encoding的类别数目不太多,可优先考虑。

    一.pd.get_dummies()简单&粗暴

    pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
    官网文档:
    http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html

    输入:array-like, Series, or DataFrame
    输出:DataFrame
    主要参数说明:
    data : array-like, Series, or DataFrame
    prefix : 给输出的列添加前缀,如prefix="A",输出的列会显示类似
    prefix_sep : 设置前缀跟分类的分隔符sepration,默认是下划线"_"
    一般,我们输入data就够了。如果要专门关注Nan这类东东,可设置dummy_na=True,专门生成一列数据。
    见下面的栗子:(简直不要太容易)

    import numpy as np
    import pandas as pd
    data = pd.DataFrame({"学号":[1001,1002,1003,1004],
                        "性别":["男","女","女","男"],
                        "学历":["本科","硕士","专科","本科"]})
    data
     学历学号性别
    0本科1001
    1硕士1002
    2专科1003
    3本科1004
    pd.get_dummies(data)
     学号学历_专科学历_本科学历_硕士性别_女性别_男
    0100101001
    1100200110
    2100310010
    3100401001
    pd.get_dummies(data,prefix="A")
     学号A_专科A_本科A_硕士A_女A_男
    0100101001
    1100200110
    2100310010
    3100401001
    pd.get_dummies(data,prefix=["A","B"],prefix_sep="+")
     学号A+专科A+本科A+硕士B+女B+男
    0100101001
    1100200110
    2100310010
    3100401001

    二.sklearn的崽一:LabelEncoder 将不连续的数字or文本进行编号

    sklearn.preprocessing.LabelEncoder()
    官方文档:
    https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    le.fit([1,5,67,100])
    le.transform([1,1,100,67,5])
    #输出: array([0,0,3,2,1])
    array([0, 0, 3, 2, 1], dtype=int64)
    from sklearn import preprocessing
    le = preprocessing.LabelEncoder()
    le.fit([1, 3, 3, 7])
    LabelEncoder()
    le.transform([1, 1, 3, 7]) 
    #array([0, 0, 1, 2]...)
    le.classes_   #查看分类
    #array([1, 2, 6])
    le.inverse_transform([0, 0, 1, 2])  #transform的逆向
    #array([1, 1, 2, 6])    
    array([1, 1, 3, 7])

    三.sklearn的崽二:OneHotEncoder 对表示分类的数字进行编码,输出跟dummies一样

    sklearn.preprocessing.OneHotEncoder(n_values=None, categorical_features=None, categories=None, sparse=True, dtype=<class ‘numpy.float64’>, handle_unknown=’error’)
    官方文档:
    https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
    注意:
    输入的应该是表示类别的数字,如果输入文本,会报错的

    from sklearn.preprocessing import OneHotEncoder
    OHE = OneHotEncoder()
    OHE.fit(data)
    
    ValueError: could not convert string to float: '男'

    看到,OneHotEncoder处理不了字符串。要先用

    data3 = le.fit_transform(data["性别"])
    OHE.fit(data3.reshape(-1,1))
    OHE.transform(data3.reshape(-1,1)).toarray()
    array([[ 0.,  1.],
           [ 1.,  0.],
           [ 1.,  0.],
           [ 0.,  1.]])

    对因变量y不能用OneHotEncoder,要用LabelBinarizer。

     

    Spark ML 特征工程之 One-Hot Encoding

    参照:https://blog.csdn.net/u011622631/article/details/81562699

     

    展开全文
  • 机器学习算法中,常会遇到分类特征是离散的,无序的。例如:性别有男、女,城市有北京,上海,深圳等。 性别特征: ["男","女"] => 0,1 地区特征: ["北京","上海,"深圳"] => 0,1,2 工作特征: [...

    在机器学习算法中,常会遇到分类特征是离散的,无序的。例如:性别有男、女,城市有北京,上海,深圳等。

    性别特征:
    ["男","女"] => 0,1
    地区特征:
    ["北京","上海,"深圳"] => 0,1,2
    工作特征:
    ["演员","厨师","公务员","工程师","律师"] => 0,1,2,3,4

    比如,样本(女,北京,工程师)=>(1,0,3),但是,这样的特征处理并不能直接放入机器学习算法中,因为,分类器通常数据是连续且有序。解决这类问题,一种解决方法是采用独热编码(One-Hot Encoding)。

    什么是独热编码

    独热编码(One-Hot Encoding),又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。即,只有一位是1,其余都是零值。

    例如,对六个状态进行编码:
    自然顺序码为 000,001,010,011,100,101
    独热编码则是 000001,000010,000100,001000,010000,100000

    回到一开始的例子,性别特征:["男","女"],按照N位状态寄存器来对N个状态进行编码的原理:

    性别特征:["男","女"](这里N=2)
    男 => 10
    女 => 01

    地区特征:["北京","上海,"深圳"](这里N=3):
    北京 => 100
    上海 => 010
    深圳 => 001

    工作特征:["演员","厨师","公务员","工程师","律师"](这里N=5):
    演员 => 10000
    厨师 => 01000
    公务员 => 00100
    工程师 => 00010
    律师 => 00001

    所以,样本的特征是["女","北京","工程师"]的时候,独热编码(One-Hot Encoding)的结果为:

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

    为什么要进行独热编码

    在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的。而常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
    使用独热编码(One-Hot Encoding),将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用独热编码(One-Hot Encoding),会让特征之间的距离计算更加合理。
    比如,上面的工作特征,该离散型特征,共有五个取值,不使用独热编码(One-Hot Encoding),其表示分别是:

    演员 = (0)
    厨师 = (1)
    公务员 = (2)
    工程师 = (3)
    律师 = (4)

    两个工作之间的距离是:

    d(演员,厨师) = 1
    d(厨师,公务员) = 1
    d(公务员,工程师) = 1
    d(工程师,律师) = 1
    d(演员,公务员) = 2
    d(演员,工程师) = 3
    .....

    显然这样的表示,计算出来的特征的距离是不合理。那如果使用独热编码(One-Hot Encoding),则得到d(演员,厨师) = 1与d(演员,公务员)都是1。那么,两个工作之间的距离就都是sqrt(2)。即每两个工作之间的距离是一样的,显得更合理。

    什么情况下不需要独热编码

    1、如果特征是离散的,并且不用独热编码就可以很合理的计算出距离,就没必要进行独热编码。(比如,离散特征共有1000个取值,分成两组是400和600,两个小组之间的距离有合适的定义,组内距离也有合适的定义,就没必要独热编码)
    2、有些并不是基于向量空间度量的算法,数值只是个类别符号,没有偏序关系,就不用进行独热编码。
    3、如果原本的标签编码是有序的,就不必独热编码了,因为会丢失顺序信息。

    参考文献:
    https://blog.csdn.net/u013385925/article/details/80142310
    https://blog.csdn.net/lanhaier0591/article/details/78702558
    https://www.imooc.com/article/35900



    作者:李春辉
    链接:https://www.jianshu.com/p/42e93acacc52
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 特征工程是数据科学模型...分类特征可以编码成数字格式,独热编码就是其中一种方式。 什么是独热编码? 独热编码,又称虚拟编码,是一种将分类变量转换为数值向量格式的方法。每个类别在数值向量中都有自己的列或特征.
  • 数据科学家Rakshith Vasudev简要解释了one hot编码这一机器学习中极为常见的技术。 你可能在有关机器学习的很多文档、文章、论文中接触到“one hot编码”这一术语。本文将科普这一概念,介绍one hot编码到底是...
  • One-Hot编码,又称“独热编码”,是一种编码方式。 一、问题的产生 在进行机器学习,例如回归,分类,聚类或者NLP等问题的时候,通常很多数据都是无法直接利用的。例如一个学生信息数据集中样本有三种类别,每个...
  • 标签编码、独热编码
  • 机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。 这些特征值并不是连续的,而是离散的,无序的。 目的: 如果要作为机器学习算法的输入,通常我们需要对其进行...
  •  当我们在机器学习做特征工程时,如果某个categorical特征具有多个符号值,则不可能对具有这种特征的数据进行训练,而独热编码是解决这个问题的一种方法。比如我们有一个特征是protocol_type有三个值:tcp,udp,...
  • 机器学习之数据预处理——特征编码数据预处理——特征编码离散数据的编码标签编码sklearn LabelEncoder(使用fit_transform函数)sklearn LabelEncoder(反向变换可以用函数 inverse_transform) 机器学习里有一句名言:...
  • One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。 One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值...
  • 独热编码 一、为什么要独热编码独热编码(是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到原点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式...
  • 文章目录独热编码和 LabelEncoder标签编码1、介绍2、代码测试2.1 导入相关库2.2 读取数据2.3 查看缺失值2.4 利用中位数填补年龄2.5 删除Embarked的缺失行2.6 查看每个特征的类别2.7 对标签进行LabelEncoder编码2.8 ...
  • 机器学习-数据预处理之独热编码(One-Hot) 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男有女,国籍有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行...
  • 很多人开始接触深度学习,数据处理遇到第一个专业英文术语就是one-hot encode(独热编码),很多初学者就会迷茫,这个东西是什么意思,其实说的直白点所谓的独热编码最重要的就是把一组字符串或者数字转为一组向量而且...
  • 本文转载自 机器学习实战:数据预处理之独热编码(One-Hot Encoding) 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值。 例如,考虑一下的三个特征: ["male", "...
  • 我们在处理机器学习数据的时候经常会见到离散特征的数据,例如水果的颜色、人名等,离散特征的挑战在于不是连续的方式,这导致很难用数字去描述,所以引入独热编码进行处理。 独热编码,One-Hot编码,又称为一...
  • 机器是看不懂绝大部分原始数据的,为了让让机器看懂,需要将原始数据进行预处理。 引入模块和数据 import numpy as np from sklearn import preprocessing data = np.array([[3,-1.5,2,-5.4], [0,4,0.3,2.1]...
  • 独热编码

    千次阅读 2017-07-24 21:26:55
    针对这个问题,一种可能的解决方案是采用独热编码( One-Hot Encoding ),独热,顾名思义,就是编码中只有一个位是有效的,所以又称为“一位有效编码”。   例如上面的特征 “性别”,有 2 个可能的分类: ...
  • 机器学习问题中,我们通过训练数据集学习得到的其实就是一组模型的参数,然后通过学习得到的参数确定模型的表示,最后用这个模型再去进行我们后续的预测分类等工作。在模型训练过程中,我们会对训练数据集进行...
  • Sklearn独热编码one hot 编码,preprocessing.OneHotEncoder()使用
  • 关于sklearn独热编码

    2020-12-11 11:15:37
    get_dummies千般好,万般好,但毕竟不是 sklearn 里的transformer类型,所以得到的结果得手动输入到 sklearn 里的相应模块,也无法像 sklearn 的transformer一样可以输入到pipeline中 进行流程化地机器学习过程。...
  • 机器学习分类任务中,经常存在一个特征有多个分类变量值,例如在kaggle中的Titanic比赛数据中,...可以参考这篇博文:数据预处理:独热编码(One-Hot Encoding) 一、onehot的优点  onehot编码的优点可以总结
  • 1、独热编码(OneHotEncoder) 有一些特征并不是以连续值的形式给出。例如以下三个特征属性: 人的性别 [“male”, “female”], 来自的国家 [“from Europe”, “from US”, “from Asia”], 使用的浏览器[...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,956
精华内容 5,982
关键字:

机器学习独热编码