美文网首页
Python 数据预处理

Python 数据预处理

作者: 喵_十八 | 来源:发表于2017-11-22 11:50 被阅读0次

    存在问题

    获取未经处理的原始数据,可能有以下问题:

    • 不属于同一量纲:即数据的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
    • 信息冗余:对于某些定量数据,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
    • 定性特征不能直接使用:某些机器学习算法和模型只能接受定量数据的输入,那么需要将定性数据转换为定量数据。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。
    • 存在缺失值:缺失值需要补充。
    • 信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。

    处理方式

    在处理数据前,会先查看其基本信息。然后进行无量纲化,对定量特征二值化,对定性特征哑编码,缺失值计算,数据变换等操作。

    基本信息

    一般的数据分析都需要先了解数据的基本信息,比如缺失值情况、数值的平均、标准差等。
    基本信息可以直观的告诉我数据中是否有明显的问题,使用pandas可以一步得到这个总结。

    # 对数据进行基本的检查
    # 得到数据的形状
    n_df = df.shape[0]
    print ("共有{row}行{col}列数据".format(
            row=df.shape[0],
            col=df.shape[1]))
    
    # 得到数据的总结信息
    summary_df = df.describe()
    # 得到变量列表,得到格式为list
    cols = df.columns.tolist()
    

    输出如下:

    
    Out[]36:共有18行5列数据
    
    In [37]: summary_df
    Out[37]:
           duration_log  count_log   max_base   max_hour       max_day
    count     18.000000  18.000000  18.000000  18.000000  1.800000e+01
    mean      15.676040   6.966977   2.944444  11.222222  2.017098e+07
    std        1.906317   1.755471   2.312936   6.292438  5.732390e+01
    min       11.482951   2.944439   1.000000   1.000000  2.017081e+07
    25%       15.140543   6.487231   1.000000   6.750000  2.017101e+07
    50%       16.005462   7.381930   2.000000  10.000000  2.017101e+07
    75%       16.591520   8.298575   4.750000  16.000000  2.017101e+07
    max       18.878600   8.673855   8.000000  23.000000  2.017101e+07
    
    In [38]: cols
    Out[38]: ['duration_log', 'count_log', 'max_base', 'max_hour', 'max_day']
    

    缺失值

    很多真实数据中,因为各种各样的原因大量数据都缺失了。在进行任何严肃的数据分析前,我们一般都需要先检查数据缺失的情况。

    # 缺失值处理
    # 计算每个变量的缺失值
    for col in cols:
        missing = n_df - np.count_nonzero(df[col].isnull().values)
        mis_perc = 100 - float(missing) / n_df * 100 
        print ("{col}的缺失比例是{miss}%".format(col=col,miss=mis_perc))
    

    输出如下:

    共有20行5列数据
    duration_log的缺失比例是10.0%
    count_log的缺失比例是10.0%
    max_base的缺失比例是10.0%
    max_hour的缺失比例是10.0%
    max_day的缺失比例是10.0%
    

    可以看出各个属性的缺失情况

    可以将缺失值删去,或者填补

    # 将整个文件中的缺失值用0代替
    df.fillna(value=0, inplace=True)
    
    # 将note这个变量中的缺失值用0代替
    df['notes'].fillna(value=0, inplace=True)
    
    #删除缺失的行
    df.dropna(axis=0, how='any')
    

    关于dropna()

    参数
    axis : {0 or ‘index’, 1 or ‘columns’}, or tuple/list thereof
    Pass tuple or list to drop on multiple axes
    how : {‘any’, ‘all’}
    any : if any NA values are present, drop that label
    all : if all values are NA, drop that label
    thresh : int, default None
    int value : require that many non-NA values
    subset : array-like Labels along other axis to consider, e.g. if you are dropping rows these would be a list of columns to include
    inplace : boolean, default False
    If True, do operation inplace and return None.

    关于缺失值补全

    常用的方法如下:

    • 均值补全
    • 中位数补全
    • 趋势补全
    • ......等

    将多个描述型变量一次性转为数值型

    大部分机器学习算法要求输入的数据必须是数字,不能是字符串。
    我们在不假设分类器的前提下,往往需要将描述变量转化为数字型变量,因为大部分算法无法直接处理描述变量。

    # 寻找描述变量
    # 将描述变量储存到 cat_vars这个list中去
    cat_vars = []
    print ("\n描述变量有:")
    for col in cols:
        if df[col].dtype == "object":
            print (col)
            cat_vars.append(col)
    

    使用LabelEncoder 转化

    print ("\n开始转换描述变量...")       
    from sklearn import preprocessing
    le = preprocessing.LabelEncoder()
    
    # 将描述变量自动转化为 数值型变量
    # 并将转化为的数据附加到原始数据上
    for col in cat_vars:
        tran = le.fit_transform(df[col].tolist())
        tran_df = pd.DataFrame(tran, columns=['num_'+col])
        print("{col}经过转化为{num_col}".format(col=col,num_col='num_'+col))
    #    print (le.classes_)
        df = pd.concat([df, tran_df], axis=1)
    

    无量纲化

    无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。

    标准化

    标准化需要计算特征的均值和标准差,公式表达为:



    使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:

    from sklearn.preprocessing import StandardScaler
     
    #标准化,返回值为标准化后的数据
    StandardScaler().fit_transform(df)
    

    区间缩放法

    区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:


    使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:

    from sklearn.preprocessing import MinMaxScaler
    
    #区间缩放,返回值为缩放到[0, 1]区间的数据
    MinMaxScaler().fit_transform(df)
    

    归一化

    归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:


    image.png

    使用preproccessing库的Normalizer类对数据进行归一化的代码如下:

    from sklearn.preprocessing import Normalizer
    
    #归一化,返回值为归一化后的数据
    Normalizer().fit_transform(df)
    

    ref:
    Python机器学习中的实用小操作(一):数据清理篇
    https://zhuanlan.zhihu.com/p/29893734

    十分钟搞定pandas
    https://www.cnblogs.com/chaosimple/p/4153083.html

    相关文章

      网友评论

          本文标题:Python 数据预处理

          本文链接:https://www.haomeiwen.com/subject/vbjnvxtx.html