评分卡模型开发-数据集缺失值处理

作者: 鸣人吃土豆 | 来源:发表于2017-12-17 14:44 被阅读161次

    更新内容:missingno库可视化缺失值


    在实际的应用过程中,样本由于各种原因缺少一个或多个值的情况并不少见,其主要原因有:在数据收集过程中出现了错误,常用的度量方法并不适用于某些特征,或在某些调查过程中有些数据未被填写,等等。我们见到的缺失值是数据表中的空值,或者是类似于NaN的占位符。
    有些时候缺失值的存在是合乎逻辑的,比如婚姻状态是未婚,则孩子数量不填是很正常的,但是有些缺失值我们忽略之后会让机器学习算法的效能大打折扣,所以我们必须采取一些措施来处理缺失值。
    关于处理缺失值的方案在当我们在谈论数据时我们应该谈些什么?有提及,这里就不赘述了。

    数据集的准备

    改数据来与R中的“klaR”包中的German credit data

    install.packages("klaR")
    library(klaR)
    write.csv(GermanCredit,file="C:\\Users\\Administrator\\OneDrive\\步履不停\\评分卡制作\\数据\\GermanCredit.csv")
    

    或者也可以直接去http://archive.ics.uci.edu/ml/datasets/Statlog+(German+Credit+Data)下载
    关于数据集中各个属性所代表的含义可以去https://pan.baidu.com/s/1o8aaGXk下载doc文件查看

    一、缺失值的识别

    • 在python中缺失值可以用pandas中的isnull()
    import pandas as pd
    df = pd.read_csv("C:\\Users\\Administrator\\OneDrive\\步履不停\\评分卡制作\\数据\\GermanCredit.csv",engine='python')
    df.isnull().sum()
    

    得到如下结果,可以看到没有缺失值。没办法,这个数据应该是事先被处理过的,方便建模。总之,呵呵。。。。。。

    Unnamed: 0                 0
    status                     0
    duration                   0
    credit_history             0
    purpose                    0
    amount                     0
    savings                    0
    employment_duration        0
    installment_rate           0
    personal_status_sex        0
    other_debtors              0
    present_residence          0
    property                   0
    age                        0
    other_installment_plans    0
    housing                    0
    number_credits             0
    job                        0
    people_liable              0
    telephone                  0
    foreign_worker             0
    credit_risk                0
    dtype: int64
    
    • 还可以用missingno这个库图形化缺失值
    import missingno
    missingno.matrix(data)
    

    那我们可以自己构造数据

    import pandas as pd 
    from io import StringIO
    csv_data='''A,B,C,D
    1,2,3,4
    5,6,7,8
    0,11,12,'''
    data = pd.read_csv(StringIO(csv_data))
    data
    
        A   B   C   D
    0   1   2   3.0 4.0
    1   5   6   NaN 8.0
    2   0   11  12.0NaN
    
    data.isnull().sum()
    A    0
    B    0
    C    1
    D    1
    dtype: int64
    

    二,将存在缺失值的特征或样本删除

    • 优点:简单方便
    • 缺点:可能会删除过多的样本,导致分析结果可靠性不高
      在python中可以用DataFrame.dropna()方法删除缺失值
    #删除存在缺失值的行
    data.dropna()
         A  B   C   D
    0   1   2   3.0 4.0
    
    data.dropna(axis=1) #删除存在缺失值的列
    
    df.dropna(how='all') #删除所有列都是缺失值的行
    
    df.dropna(thresh=4) #删除没有至少4个非NaN值的行
    
    df.dropna(subset=['C']) #删除指定列中存在缺失值的行
    

    三,缺失值的填充

    在不能剔除缺失值的时候,我们可以使用不同的插值技术,通过数据集中其他训练样本的数据来估计缺失值。对于数值型数据来说,通常使用能代表变量中心趋势的值来填补。通常有平均值,中位数,众数等。选择哪种中心趋势值来填充需要观察变量的分布。因为平均值易受极端值影响,在这中偏态数据中,我们可以用中位数来填充,而在正态分布下我们可以用平均值。对于定性数据来讲,我们可以用众数来填充
    在numpy中,缺失值可以用numpy.NaN或者numpy.nan来表示
    在scikit-learn中,有可以实现的类-Imputer

    • 平均值
    
    from sklearn.preprocessing import Imputer
    #axis=0,代表用列的均值来进行相应的替换,等于1代表用行的均值来替换
    imr = Imputer(missing_values='NaN',strategy='mean',axis=0)
    imr.fit(data)
    imputed_data = imr.transform(data.values)
    imputed_data
    
    • 中位数
    from sklearn.preprocessing import Imputer
    imr = Imputer(missing_values='NaN',strategy='median',axis=0)
    imr.fit(data)
    imputer_data = imr.transform(data.values)
    imputer_data
    
    • 众数
    from sklearn.preprocessing import Imputer
    imr = Imputer(missing_values='NaN',strategy='most_frequent',axis=0)
    imr.fit(data)
    imputer_data = imr.transform(data.values)
    imputer_data
    

    也可以使用pandas 中的相关方法,具体可以参考这篇文章http://blog.csdn.net/helen1313/article/details/53304641

    • 采用拉格朗日插值法
    #构建数据
    import numpy as np
    sales = pd.DataFrame(data={'sale_money':[3442.1,3393.1,3136.6,3744.1,6607.4,4060.3,3614.7,3295.5,2332.1,2699.3,np.nan,3036.8]})
    
    #导入库
    from scipy.interpolate import lagrange #导入拉格朗日插值函数
    
    #过滤异常值,将其变为空值
    sales['sale_money'][(sales['sale_money']<400) | (sales['sale_money']>5000)]=None
    
    
    #自定义函数
    ##导入拉格朗日插值函数
    from scipy.interpolate import lagrange
    def ployinterp_columns(s,n,k=5):
        #s为列向量,n为缺失值位置,K为取前后的数据个数。默认为5
        y = s[list(range(n-k,n))+list(range(n+1,n+1+k))] #取数
        y=y[y.notnull()] #剔除空值
        return(lagrange(y.index,list(y))(n))
    #逐个列逐个行判断是否需要插值
    for i in sales.columns:
        for j in range(len(sales)):
            if(sales[i].isnull())[j]:
                sales[i][j] = ployinterp_columns(sales[i],j)
    

    相关文章

      网友评论

        本文标题:评分卡模型开发-数据集缺失值处理

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