• 数据编码


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

    标签编码(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

    具体用法请百度

  • 相关阅读:
    编写一个供浏览器端使用的NPM包
    针对低网速的性能优化
    前端性能优化之WebP
    Openwrt自定义CGI实现
    论用户体验测试:牛逼的功能千篇一律,好的用户体验万里挑一
    Vue 依赖收集原理分析
    怎么去写好一段优雅的程序
    hdu 1085 有num1个 1 ,num2个 2 ,num3个 5 (母函数)
    hdu 1398 整数划分变形 (母函数)
    hdu 1028 整数划分 (母函数)
  • 原文地址:https://www.cnblogs.com/yanshw/p/10709844.html
Copyright © 2020-2023  润新知