zoukankan      html  css  js  c++  java
  • 数据预处理之离散化

    按照我们对于变量的分类:分为数值变量和分类变量,数值变量可以分为连续型和离散型,分类变量又有有序的和无序的。下面我将介绍一些对于这些变量进行离散化处理。

    无序分类变量的离散化方法:

      比如在泰坦尼克号当中,有一个变量叫做乘客登陆的港口,取值为(C, Q, S)代表三个地方。这是一个典型的无序分类变量,我们在进行数据预处理的时候应该如何进行。 一种很容易想到的方法就是把每个值映射为一个数字,比如C=0, Q=1, S=2。 但是这样容易产生一个问题:我们实际上是把它们当做了有序的数字来进行看待了,2比1大,这就存在了顺序关系。但是我们的数据本来并不存在这样的关系。

      为了解决上面的问题,我们使用独热编码(One-Hot Encoding)对无序的分类变量进行处理。对于取值有m种情况的变量,我们用m维来表示。比如上面的变量可以取值100, 010,001, 仅当样本取值为第i种情况的时候,在第i维上面编码为1,其余维均编码为0。独热编码形成的变量也叫做虚变量或者哑变量(dummpy variable)。

    sklearn 中有提供的OneHotEncoder的方法

    from sklearn.preprocessing import  OneHotEncoder
    
    enc = OneHotEncoder()
    
    enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
    
    print(enc.n_values_)
    
    print(enc.transform([[0, 1, 1]]).toarray())
    '''
    数据为这样的情况
    0 0 3
    1 1 0
    0 2 1 
    1 0 2
    一共有三个特征,第一个特征有两个取值,第二个特征有三个取值,第四个特征有四个取值
    所以n_values_输出为[2,3,4]
    当我们对[0, 1, 1]进行编码的时候为10 010 0100 
    
    '''

    输出结果如下:

    [2 3 4]
    [[1. 0. 0. 1. 0. 0. 1. 0. 0.]]

    另外,panda当中也有一个get_dummies方法,可以进行独热编码。当get_dummies接受的是一个DataFrame类型的时候,将其中变量类型为object和category的类型(可以使用info()查看类型)转化为哑变量。int64,float64和bool类型不进行转换。

    import pandas as pd
    import seaborn as sns
    
    #我们从seaborn当中调入 titanic的数据。
    titanic = sns.load_dataset("titanic")
    
    print(titanic['embarked'].head())
    
    embarked_dummpy = pd.get_dummies(titanic['embarked'])
    
    print(embarked_dummpy.head())
    
    #我们可以使用 pd.concat方法,把得到的dummpy数据和元数据连接在一起
    new_data = pd.concat([titanic, embarked_dummpy], axis=1)

    输出结果如下

    0    S
    1    C
    2    S
    3    S
    4    S
    Name: embarked, dtype: object
       C  Q  S
    0  0  0  1
    1  1  0  0
    2  0  0  1
    3  0  0  1
    4  0  0  1

     

    有序分类变量的离散化

      有序分类变量可以直接利用划分后的数值。如分类变量 [贫穷,温饱,小康,富有],直接可以将他们转换为[0,1,2,3]就可以了。可以直接使用pandas当中的map函数进行映射离散化;

    train_df['Sex'] = train_df['Sex'].map({'male':0, 'female':1})
    

    或者是借用sklearn.preprocessing.LabelEncoder 来完成这样的操作。

    连续变量的离散化

    对于连续变量,我们直接把他们扔进我们的模型当中,为什么还有进行离散化?

    离散化有很多的好处,比如能够使我们的模型更加的简单,因为相对于连续类型数据,离散类型数据的可能性更少。对于某些模型比如计算广告中常用的逻辑回归,是非常需要我们输入离散化的特征的。

    连续特征离散化的方法可以分为有监督的和无监督的。前者主要是利用了数据集中的类信息。

    无监督的方法分为:

    等宽划分:按照相同宽度将数据分成几等份。缺点是受到异常值的影响比较大。 pandas.cut方法可以进行等宽划分。

    等频划分:将数据分成几等份,每等份数据里面的个数是一样的。pandas.qcut方法可以进行等频划分。

    聚类划分:使用聚类算法将数据聚成几类,每一个类为一个划分。

     有监督学习方法:

    1R方法

    基于信息熵的方法

    基于卡方的方法

     参考

    One-Hot Encoding与类别特征处理

    特征工程七种常用方法

    连续特征离散化方法综述

  • 相关阅读:
    修改表结构
    enum/set 约束
    MYSQL 数据类型
    表和数据的基础操作
    存储引擎
    mysql
    HTML 介绍
    selor模块
    select
    协程
  • 原文地址:https://www.cnblogs.com/jiaxin359/p/8574510.html
Copyright © 2011-2022 走看看