zoukankan      html  css  js  c++  java
  • 数据编码

    把文本型、字符型数据转换成数值型的方法

    标签编码(LabelEncode)

    从名字上看,这是对标签进行编码,实际上可以对任何数据进行编码

    作法很简单,就是将序列中不同值给个序号,以代表这个字符型数据。

    示例代码

    from sklearn.preprocessing import LabelEncoder  # 标签专用
    
    label = np.array(['','不好','不好','','不好','','不好'])
    encoding=LabelEncoder()
    classes = encoding.fit_transform(label)  # 把字符型特征转化成整型
    print(encoding.classes_)            # ['好','不好']
    print(classes)                      # [1 0 0 1 0 1 0]
    
    label = encoding.inverse_transform(classes)     # 还原
    print(label)

    上面把好与不好变成了0,1

    这种方法简单,但是有很大问题。

    思考以下问题:

    比如特征是[‘鸡’,‘鸭’,‘鹅’],彼此之间完全独立,没有关联性和大小,

    再如特征是[‘小学’,‘初中’,‘高中’],彼此之间不完全独立,有“大小”之分,小学<初中<高中,但彼此之间无法数据计算

    又如特征是[‘<45’,‘<90’,‘<135’],彼此之间不完全独立,不仅有“大小”之分,彼此间也可以数据计算

    单纯的变为 0 1 2,忽略了特征本身之间的联系,传达了不准确的信息,影响建模效果。

    独热编码(OneHotEncode)

    也叫哑编码,就是用二进制来表示特征,生成稀疏矩阵。

    作用

    1. 转换成数值型

    2. 解决labelencode的问题

    3. 增加维度

    用于特征 

    把特征做 onehot 编码时,特征之间可能产生多重共线性,因为每个特征加起来和是一样的;

    为了避免这个问题,一种可行的方法是扔掉一列特征,因为共 n 个编码,有了 n-1 个,就能推出第 n 个;

    这种方式也解释了为什么特征只有 2 个值时,无需进行独热编码,其实相当于编码了,然后扔掉一列,只剩一列了

    示例代码

    from sklearn.preprocessing import OneHotEncoder
    import numpy as np
    
    train = np.array([  [0, 1, 2],
                        [1, 1, 0],
                        [2, 0, 1],
                        [3, 1, 1]])
    one_hot = OneHotEncoder()
    one_hot = one_hot.fit(train)
    result = one_hot.transform([[1, 0, 1]]).toarray()
    print result                                        # [[0. 1. 0. 0. 1. 0. 0. 1. 0.]]
    
    # print(one_hot.transform([[1, 0, 1]]).todense())   # 将结果保存起来  稀疏矩阵,转为密集矩阵
    # print one_hot.inverse_transform(result)           # 还原
    # print one_hot.get_feature_names()                 
    
    ### 解释
    # one column 0 1 2 3-->0 1 2 3
    # two column 0 1-->0 1
    # three column 0 1 2-->0 1 2
    
    # 1 0 1 --> 1==> 0 1 0 0
    #           0==> 1 0
    #           1==> 0 1 0
    
    
    ### test1
    train = np.array([  ['0', 1, 2],
                        ['1', 1, 0],
                        ['2', 0, 1],
                        ['3', 1, 1]])
    one_hot = OneHotEncoder()
    one_hot.fit(train)
    print(one_hot.transform([['1', 0, 1]]).toarray())    # [[0. 1. 0. 0. 1. 0. 0. 1. 0.]]
    
    ### test2
    train = np.array([  ['0', 'a', 2],
                        ['1', 'a', 0],
                        ['2', 'b', 1],
                        ['3', 'a', 1]])
    one_hot = OneHotEncoder()
    one_hot.fit(train)
    print(one_hot.transform([['1', 'b', 1]]).toarray())    # ValueError: could not convert string to float: a

    sklearn中独热编码不能直接处理非数值的字符串,需要先根据 LableEncode 进行编码,再进行独热编码

    用于标签

    把 标签编码 转换成 one hot

    import numpy as np
    from sklearn.preprocessing import label_binarize
    
    y = np.array([0,0,1,2,2])
    y = label_binarize(y, classes=[0, 1, 2])
    print(y)
    # [[1 0 0]
    #  [1 0 0]
    #  [0 1 0]
    #  [0 0 1]
    #  [0 0 1]]

    二值化编码

    很简单,设定阈值,大于为1,小于为0

    from sklearn.preprocessing import Binarizer
    from sklearn.preprocessing import KBinsDiscretizer

    具体用法请百度

  • 相关阅读:
    Swift 泛型和闭包结合使用
    Swift中避免在多个文件中重复import相同的第三方包
    iOS AVAudioPlayer播放音频时声音太小
    python中装饰器的原理以及实现,
    python-网易云简单爬虫
    python模拟SQL语句操作文件
    python学习第二天-基本数据类型常用方法
    python学习第一天-语法学习
    iOS 出现错误reason: image not found的解决方案
    Swift as as!和as?的区别
  • 原文地址:https://www.cnblogs.com/yanshw/p/10709844.html
Copyright © 2011-2022 走看看