精华内容
下载资源
问答
  • python 数据、曲线平滑处理——方法总结Savitzky-Golay 滤波器实现曲线平滑插值对折线进行平滑曲线处理基于Numpy.convolve实现滑动平均滤波数据平滑处理——log()和exp()函数 问题描述: 在寻找曲线的波峰、波谷时...


    问题描述:

    在寻找曲线的波峰、波谷时,由于数据帧数多的原因,导致生成的曲线图噪声很大,不易寻找规律。如下图:

    在这里插入图片描述

    由于高频某些点的波动导致高频曲线非常难看,为了降低噪声干扰,需要对曲线做平滑处理,让曲线过渡更平滑。常见的对曲线进行平滑处理的方法包括: Savitzky-Golay 滤波器、插值法等。

    Savitzky-Golay 滤波器实现曲线平滑

    对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。

    代码语法:

    python中Savitzky-Golay滤波器调用如下:

    y_smooth = scipy.signal.savgol_filter(y,53,3)  
    # 亦或
    y_smooth2 = savgol_filter(y, 99, 1, mode= 'nearest')
    
    # 备注:
    y:代表曲线点坐标(x,y)中的y值数组
    window_length:窗口长度,该值需为正奇整数。例如:此处取值53
    k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3
    mode:确定了要应用滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied.

    调参规律:

    现在看一下window_length和k这两个值对曲线的影响。

    (1)window_length对曲线的平滑作用: window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害(备注:该值必须为正奇整数)。

    (2)k值对曲线的平滑作用: k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线。

    典型范例:

    # 用于生成问题描述中示例曲线的代码如下:
    import numpy as np
    
    Size = 100
    x = np.linspace(1, Size,Size)
    
    data = np.random.randint(1, Size, Size)
    print(data)
    >>>
    array([33, 19,  2, 56, 11, 38,  3, 45,  4, 20, 59,  3, 71, 94, 85, 23, 93,
           65, 23, 99, 38, 43, 41, 96, 46, 56, 79,  1, 38, 90, 97, 88,  2, 72,
           25, 51, 70, 42,  4, 86, 26, 44, 40, 49,  5, 37, 10, 99, 40, 88, 34,
           99, 26,  6, 20, 37, 22, 88, 13, 68, 54, 95, 15,  4, 58, 20, 51, 89,
           81,  1, 41, 21, 17, 52, 84, 46, 76, 44, 90, 72, 96, 32, 12, 50, 81,
           64, 67, 99, 42, 35, 70, 79, 21, 51, 56, 10, 23, 21, 25, 64])
          
    # 可视化图线
    plt.plot(x, data)
    
    # 使用Savitzky-Golay 滤波器后得到平滑图线
    from scipy.signal import savgol_filter
    
    y = savgol_filter(data, 5, 3, mode= 'nearest')
    # 可视化图线
    plt.plot(x, y, 'b', label = 'savgol')
    

    下图所示为经过Savitzky-Golay 滤波器处理的示例曲线效果图:
    在这里插入图片描述
    原理剖析:

    scipy官方帮助文档里可以看到关于Savitzky-Golay 滤波器中关于savgol_filter()函数的详细说明。

    以下是关于Savitzky-Golay平滑滤波的简单介绍(引至博客:Python 生成曲线进行快速平滑处理):

    Savitzky-Golay平滑滤波是光谱预处理中的常用滤波方法,其 核心思想:是对一定长度窗口内的数据点进行k阶多项式拟合,从而得到拟合后的结果。 对它进行离散化处理后,S-G 滤波其实是一种移动窗口的加权平均算法,但是其加权系数不是简单的常数窗口,而是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。

    Savitzky-Golay平滑滤波被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器的 最大特点:在滤除噪声的同时可以确保信号的形状、宽度不变。

    使用平滑滤波器对信号滤波时,实际上是拟合了信号中的低频成分,而将高频成分平滑出去了。 如果噪声在高频端,那么滤波的结果就是去除了噪声,反之,若噪声在低频段,那么滤波的结果就是留下了噪声。

    总之,平滑滤波是光谱分析中常用的预处理方法之一。用Savitzky-Golay方法进行平滑滤波,可以提高光谱的平滑性,并降低噪音的干扰。S-G平滑滤波的效果,随着选取窗宽不同而不同,可以满足多种不同场合的需求。

    参考链接:Savitzky-Golay平滑滤波的python实现

    插值法对折线进行平滑曲线处理

    实现所需的库: numpy、scipy、matplotlib

    插值法的常见实现方法:

    • nearest:最邻近插值法
    • zero:阶梯插值
    • slinear:线性插值
    • quadraticcubic:2、3阶B样条曲线插值

    拟合和插值的区别:

    1、插值:简单来说,插值就是根据原有数据进行填充,最后生成的曲线一定过原有点。

    2拟合:拟合是通过原有数据,调整曲线系数,使得曲线与已知点集的差别(最小二乘)最小,最后生成的曲线不一定经过原有点。

    代码语法:

    通过执行from scipy.interpolate import make_interp_spline,导入make_interp_spline模块,之后调用make_interp_spline(x, y)(x_smooth)函数实现。

    官方帮助文档:scipy.interpolate.make_interp_spline

    典型范例:

    import numpy as np
    from matplotlib import pyplot as plt
    from scipy.interpolate import make_interp_spline
    
    x = np.array([6, 7, 8, 9, 10, 11, 12])
    y = np.array([1.53E+03, 5.92E+02, 2.04E+02, 7.24E+01, 2.72E+01, 1.10E+01, 4.70E+00])
    x_smooth = np.linspace(x.min(), x.max(), 300)  # np.linspace 等差数列,从x.min()到x.max()生成300个数,便于后续插值
    y_smooth = make_interp_spline(x, y)(x_smooth)
    plt.plot(x_smooth, y_smooth)
    plt.show()
    

    上述执行代码的效果如下:
    在这里插入图片描述
    参考链接:python利用插值法对折线进行平滑曲线处理

    基于Numpy.convolve实现滑动平均滤波

    滑动平均概念:

    滑动平均滤波法 (又称:递推平均滤波法),它把连续取N个采样值看成一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。

    N值的选取:流量,N=12;压力:N=4;液面,N=4 ~ 12;温度,N=1~4

    滑动平均的优缺点:

    优点: 对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。

    缺点: 灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM 。

    滑动平均的数学原理:

    滑动平均滤波法计算类似一维卷积的工作原理,滑动平均的N就对应一维卷积核大小(长度)。 不过区别在于:

    (1)步长会有些区别,滑动平均滤波法滑动步长为1,而一维卷积步长可以自定义;
    (2)一维卷积的核参数是需要更新迭代的,而滑动平均滤波法核参数都是1。

    我们应该怎么利用这个相似性呢?其实也很简单,只需要把一维卷积核大小(长度)和N相等,步长设置为1,核参数都初始为1就可以了。由于一维卷积计算速度快,因此我们可以使用一维卷积来快速高效地实现这个功能。

    代码语法:

    通过Numpy库中的convolve()函数可以实现这些功能。

    def np_move_avg(a,n,mode="same"):
        return(np.convolve(a, np.ones((n,))/n, mode=mode))
    

    Numpy.convolve函数:numpy.convolve函数官方文档

    numpy.convolve(a, v, mode=‘full’)  # 返回a和v的离散线性卷积。
    

    参数说明:

    • a:(N,)输入的第一个一维数组
    • v:(M,)输入的第二个一维数组
    • mode:{‘full’, ‘valid’, ‘same’}参数可选,该参数指定np.convolve函数如何处理边缘。

    mode可能的三种取值情况:
    full’ 默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。
    ‘same’ 返回的数组长度为max(M, N),边际效应依旧存在。
    ‘valid’  返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。

    和一维卷积参数类似,a就是被卷积数据,v是卷积核大小。

    原理剖析:

    滑动平均值是卷积数学运算的一个例子。对于滑动平均值,沿着输入滑动窗口并计算窗口内容的平均值。对于离散的1D信号,卷积是相同的,除了代替计算任意线性组合的平均值,即将每个元素乘以相应的系数并将结果相加。那些系数,一个用于窗口中的每个位置,有时称为卷积核。现在,N值的算术平均值是 ( x 1 + x 2 + . . . + x N ) / N (x_1 + x_2 + ... + x_N) / N (x1+x2+...+xN)/N,所以相应的内核是 ( 1 / N , 1 / N , . . . , 1 / N ) (1/N, 1/N, ..., 1/N) (1/N,1/N,...,1/N),这正是我们通过使用得到的np.ones((N,))/N

    np.convolve函数中通过mode参数指定如何处理边缘。下面是一个说明模式不同取值之间差异的图:

    import numpy as np
    import matplotlib.pyplot as plt
     
    def np_move_avg(a,n,mode="same"):
        return(np.convolve(a, np.ones((n,))/n, mode=mode))
     
    modes = ['full', 'same', 'valid']
    
    for m in modes:
        plt.plot(np_move_avg(np.ones((200,)), 50, mode=m))
     
    
    plt.axis([-10, 251, -.1, 1.1])
     
    plt.legend(modes, loc='lower center')
     
    plt.show()
    

    在这里插入图片描述
    参考链接:
    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)
    numpy中的convolve的理解

    典型范例:

    # 实现数据可视化中的数据平滑
    import numpy as np
    import matplotlib.pylab as plt
     
    '''
    其它的一些知识点:
    raise:当程序发生错误,python将自动引发异常,也可以通过raise显示的引发异常
    一旦执行了raise语句,raise语句后面的语句将不能执行
    '''
     
    def moving_average(interval, windowsize):
        window = np.ones(int(windowsize)) / float(windowsize)
        re = np.convolve(interval, window, 'same')
        return re
     
    def LabberRing():
        t = np.linspace(-4, 4, 100)   # np.linspace 等差数列,从-4到4生成100个数
        print('t=', t)
     # np.random.randn 标准正态分布的随机数,np.random.rand 随机样本数值
        y = np.sin(t) + np.random.randn(len(t)) * 0.1   # 标准正态分布中返回1个,或者多个样本值
        print('y=', y)
        
        plt.plot(t, y, 'k')     # plot(横坐标,纵坐标, 颜色)
        
        y_av = moving_average(y, 10)
        plt.plot(t, y_av, 'b')
        plt.xlabel('Time')
        plt.ylabel('Value')
        # plt.grid()网格线设置
        plt.grid(True)
        plt.show()
        return
     
    LabberRing()  # 调用函数
    

    黑色曲线为原始折线,蓝色曲线为通过np.convolve函数进行平滑处理后的曲线效果。
    在这里插入图片描述
    参考链接:数据可视化中的数据平滑

    数据平滑处理——log()和exp()函数

    log()函数的使用就像是将一个数据压缩到了一个区间,与数据的标准化类似

    在数据预处理时,引入log()函数的优点:

    1、在数据预处理时首先可以对偏度比较大的数据用log()函数进行转化,使其更加服从高斯分布,此步处理可能会使我们后续的分类结果得到一个更好的结果。

    2、在数据、曲线平滑处理时,同样需要使用log()函数,从而避免复值的问题 ,否则,将导致模型的结果总是达不到一定的标准。(备注: 复值指一个自变量对应多个因变量

    下面再说说它的 逆运算 exp()函数

    由于前面使用过log()将数据进行了压缩,所以最后需要记得将预测出的平滑数据进行一个还原,而还原过程就是log()函数的逆运算exp()函数

    常用的数学表达式:
    l o g 1 p = l o g ( x + 1 ) 即 : l n ( x + 1 ) log1p = log(x+1)即:ln(x+1) log1p=log(x+1)ln(x+1)
    e x p m 1 = e x p ( x ) − 1 expm1 = exp(x)-1 expm1=exp(x)1

    log1p函数有它存在的意义,即保证了x数据的有效性,当x很小时(如 两个数值相减后得到 x = 1 0 − 16 x = 10^{-16} x=1016),由于太小超过数值有效性,用 l o g ( x + 1 ) log(x+1) log(x+1)计算得到结果为0,换作log1p则计算得到一个很小却不为0的结果,这便是它的意义(好像是用泰勒公式来展开运算的,不确定)。
    同样的道理对于expm1,当x特别小,就会急剧下降出现如上问题,甚至出现错误值。
    在最开始看到这样的处理方式的时候,不是很理解包括为什么是逆运算(一下子没有想到),后来慢慢摸索就优点清晰了,比如为什么两这是逆运算(简单处理):
    l o g x logx logx是e为底的对数, e x e^x ex是e为底的指数,根据对数的规则,再进行变换推导可以得到: e l o g e x = x e^{log_e^x}=x elogex=x
    可以看到x经过对数的处理后,再经过指数处理再次得到x,这里对两者的逆运算做了简单的介绍。
    在这里插入图片描述
    另外RMSLE(均方根对数误差)会更多的惩罚欠拟合,所以在使用该误差定义时我们也可以用到上面的函数:
    np.loglp计算加一后的对数,其逆运算是np.expm1;
    采用此误差函数时,可以先对原始数据做np.log1p,再使用RMSE。

    参考链接:数据平滑处理——log1p()和exmp1()

    展开全文
  • 一:开放定址 1.定义 2.要求 3.线性探测 4.二次探测 5.随机探测 二:再散列函数 1.散列函数 2.解释 3.优点弊端 A:优点 B:弊端 三:链地址 1.定义 2.优点弊端 A:优点 B:弊端 四:公共...

    目录:

    一:开放定址法

    1.定义

    2.要求

    3. 线性探测法

    4.二次探测法

    5. 随机探测法

    二:再散列函数法

    1.散列函数

    2.解释

    3.优点弊端

    A:优点

    B:弊端

    三:链地址法

    1.定义

    2.优点弊端

    A:优点

    B:弊端

    四: 公共溢出区法


    一:开放定址法

    1.定义

    所谓的 开放定址法 就是一旦发生了冲突,就去寻找下一个空的散列地址

    2.要求

    只要散列表足够大

    空的散列地址总能找到,并将记录存入

    3. 线性探测法

    使用该公式用于解决冲突的开放定址法称为 线性探测法

     

    对于 线性探测法,在出现冲突时,它只能晚后一步一步检测是否有空位置

     

    假设此时该冲突位置没有可用位置,但前面有一个空位置

    尽管可以不断地求余数后得到结果,但效率很差

    4.二次探测法

    因此可以改进该算法,增加双向寻找可能的空位置,这种新算法称为 二次探测法

    5. 随机探测法

    此外还有一种方法是,在冲突时,对于位移量采用随机函数计算得到,我们称为 随机探测法

     

    这里的随机其实是伪随机数

    即设置相同的随机种子,则不断调用随机函数的过程中可以生成不会重复的数列

    同时,在查找时,用同样的随机种子,它每次得到的数列也是相同

    因此相同的 就可以得到相同的散列地址

     

    二:再散列函数法

    1.散列函数

    提供多个散列函数

    2.解释

    这里的 就是不同的散列函数

    然后每当发生散列地址冲突时

    换一个散列函数计算

    相信总会有一个可以把冲突解决掉(todo:: how to search??)

    3.优点弊端

    A:优点

    这种方法能够使得关键字不产生聚集

    B:弊端

    当然,相应地也增加了计算的时间

     

    三:链地址法

    1.定义

    将所有关键字为同义词(即哈希地址相同)的记录存储在一个单链表中

    我们称这种表为同义词子表

     

    散列表只存储所有同义词子表头指针

    2.优点弊端

    A:优点

    链地址法对于可能会造成很多冲突散列函数来说

    提供绝不会出现找不到地址的保障

    B:弊端

    当然,这也就带来了查找时需要遍历单链表的性能损耗

     

    四: 公共溢出区法

    即为所有冲突的关键字建立一个公共的溢出区来存放

     

    在查找时,对给定值通过散列函数计算出散列地址后

    先与基本表的相应位置进行比对

    如果相等,则查找成功

    如果不相等,则到溢出表去进行顺序查找

     

    如果对于基本表而言,有冲突的数据很少的情况下

    公共溢出区的结构对查找性能来说还是非常高

    展开全文
  • 但是由于实际上存储在字典里的关键字集合K比实际上所有可能的关键字的全域U要小的多,因此散列表所需要的存储空间比直接寻址表要小的多    通过散列函数 h:U -> {0,1,2…m-1} 其中m 远小于|U| 但是...

    在介绍hash表之前首先提到直接寻址表


    但是由于实际上存储在字典里的关键字集合K比实际上所有可能的关键字的全域U要小的多,因此散列表所需要的存储空间比直接寻址表要小的多

     


     通过散列函数

    h:U -> {0,1,2…m-1}

    其中m 远小于|U|


    但是对于h(2)=h(5)这样的访问冲突,我们采用两种方法来解决

    ①  链接法

    ②  开放定址法

     

    链接法,插入最坏运行时间O(1),查找最坏运行时间和表的长度成正比。

     


    开放寻址法,所有的元素都存储在散列表中,要系统的检查所有的表项,直到找到所需的元素,或者所需的不在表中。用开放寻址法来插入元素,需要进行探查,直到找到空的槽来存放关键字为止。典型的探查方法有线性探查

     

    下面介绍一个线性探查的例子:(本位置X被占据,继续寻找下一个x+1的位置,直到找到空槽为止)
    设散列表的长度为11,哈希函数H(k)=(k的第一个字母在字母表中的序号)mod11, 若输入的顺序为(D,BA,TN,M,CI,I,K,X,TA)采用内散列表,处理冲突方法为线性探查法,按要求构造哈希表,在等概率的情况下,查找成功的平均查找长度为?

     

    D: 4%11=4   1次

    BA:2%11=2   1次

    TN:20%11=9   1次

    M:13%11=2 已被占据,放在3;                2次

    CI:3%11=3 已被占据,放在4;4已被占据放在5   3次

    I:9%11=9 已被占据,放在10                    2次

    K:11%11=0                                    1次

    X:24%11=2 已被占据放在3 已被占据放在4 已被占据放在5 已被占据放在6   5次

    TA:20%11=9 已被占据放在10 已被占据放在0 已被占据放在1               4次

    所以平均查找长度为(1+1+1+2+3+2+1+5+4)/9 = 20/9

     

     

    总结:

     

    采用开放定址法处理散列表的冲突时,其平均查找长度高于链接法处理冲突

    链接法其中优点有: 
    1
    、链接法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短
    2
    、由于链接法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况。

    开放寻址法不用指针,潜在地节约了空间,用这些空间可存放更多的槽,从而潜在地减少了冲突,提升了速度。

     

     

     

     

     

    展开全文
  • Python数据分析基础: 数据缺失值处理

    千次阅读 2020-10-31 21:56:01
    作者:东哥起飞 公众号:Python数据科学 圣人曾说过:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。 再好的模型,如果没有好...本篇我们来说说面对数据的缺失值,我们该如何处理。文末有.

    作者:东哥起飞

    公众号:Python数据科学


    圣人曾说过:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

    再好的模型,如果没有好的数据和特征质量,那训练出来的效果也不会有所提高。数据质量对于数据分析而言是至关重要的,有时候它的意义会在某种程度上会胜过模型算法。

    本篇开始分享如何使用Python进行数据分析,主要侧重介绍一些分析的方法和技巧,而对于pandas和numpy等Pyhon计算包的使用会在问题中提及,但不详细介绍。本篇我们来说说面对数据的缺失值,我们该如何处理。文末有博主总结的思维导图。

    1 数据缺失的原因

    首先我们应该知道:数据为什么缺失?数据的缺失是我们无法避免的,可能的原因有很多种,博主总结有以下三大类:

    • 无意的:信息被遗漏,比如由于工作人员的疏忽,忘记而缺失;或者由于数据采集器等故障等原因造成的缺失,比如系统实时性要求较高的时候,机器来不及判断和决策而造成缺失;
    • 有意的:有些数据集在特征描述中会规定将缺失值也作为一种特征值,这时候缺失值就可以看作是一种特殊的特征值;
    • 不存在:有些特征属性根本就是不存在的,比如一个未婚者的配偶名字就没法填写,再如一个孩子的收入状况也无法填写;

    总而言之,对于造成缺失值的原因,我们需要明确:是因为疏忽或遗漏无意而造成的,还是说故意造成的,或者说根本不存在。只有知道了它的来源,我们才能对症下药,做相应的处理。

    2 数据缺失的类型

    在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量称为完全变量,数据集中含有缺失值的变量称为不完全变量。而从缺失的分布来将缺失可以分为完全随机缺失,随机缺失和完全非随机缺失。

    • 完全随机缺失(missing completely at random,MCAR):指的是数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失;
    • 随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关;
    • 非随机缺失(missing not at random,MNAR):指的是数据的缺失与不完全变量自身的取值有关,如高收入人群不原意提供家庭收入;

    对于随机缺失和非随机缺失,直接删除记录是不合适的,原因上面已经给出。随机缺失可以通过已知变量对缺失值进行估计,而非随机缺失的非随机性还没有很好的解决办法。

    3 数据缺失的处理方法

    重点来了,对于各种类型数据的缺失,我们到底要如何处理呢?以下是处理缺失值的四种方法:删除记录,数据填补,和不处理

    1. 删除记录

    优点:

    • 最简单粗暴;

    缺点:

    • 牺牲了大量的数据,通过减少历史数据换取完整的信息,这样可能丢失了很多隐藏的重要信息;
    • 当缺失数据比例较大时,特别是缺失数据非随机分布时,直接删除可能会导致数据发生偏离,比如原本的正态分布变为非正太;

    这种方法在样本数据量十分大且缺失值不多的情况下非常有效,但如果样本量本身不大且缺失也不少,那么不建议使用。

    Python中的使用:
    可以使用 pandasdropna 来直接删除有缺失值的特征。

    #删除数据表中含有空值的行
    df.dropna(how='any')
    

    2. 数据填补

    对缺失值的插补大体可分为两种:替换缺失值,拟合缺失值,虚拟变量。替换是通过数据中非缺失数据的相似性来填补,其核心思想是发现相同群体的共同特征,拟合是通过其他特征建模来填补,虚拟变量是衍生的新变量代替缺失值。

    替换缺失值

    • 均值插补:

    对于定类数据:使用 众数(mode)填补,比如一个学校的男生和女生的数量,男生500人,女生50人,那么对于其余的缺失值我们会用人数较多的男生来填补。

    对于定量(定比)数据:使用平均数(mean)或中位数(median)填补,比如一个班级学生的身高特征,对于一些同学缺失的身高值就可以使用全班同学身高的平均值或中位数来填补。一般如果特征分布为正太分布时,使用平均值效果比较好,而当分布由于异常值存在而不是正太分布的情况下,使用中位数效果比较好。

    注:此方法虽然简单,但是不够精准,可能会引入噪声,或者会改变特征原有的分布。
    下图左为填补前的特征分布,图右为填补后的分布,明显发生了畸变。因此,如果缺失值是随机性的,那么用平均值比较适合保证无偏,否则会改变原分布。

    Python中的使用:
    #使用price均值对NA进行填充
    df['price'].fillna(df['price'].mean())
    df['price'].fillna(df['price'].median())
    
    • 热卡填补(Hot deck imputation):

    热卡填充法是在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。通常会找到超出一个的相似对象,在所有匹配对象中没有最好的,而是从中随机的挑选一个作为填充值。这个问题关键是不同的问题可能会选用不同的标准来对相似进行判定,以及如何制定这个判定标准。该方法概念上很简单,且利用了数据间的关系来进行空值估计,但缺点在于难以定义相似标准,主观因素较多。

    • K最近距离邻法(K-means clustering)

    另外一种方法就是利用无监督机器学习的聚类方法。通过K均值的聚类方法将所有样本进行聚类划分,然后再通过划分的种类的均值对各自类中的缺失值进行填补。归其本质还是通过找相似来填补缺失值。

    注:缺失值填补的准确性就要看聚类结果的好坏了,而聚类结果的可变性很大,通常与初始选择点有关,并且在下图中可看到单独的每一类中特征值也有很大的差别,因此使用时要慎重。

    拟合缺失值

    拟合就是利用其它变量做模型的输入进行缺失变量的预测,与我们正常建模的方法一样,只是目标变量变为了缺失值。

    注:如果其它特征变量与缺失变量无关,则预测的结果毫无意义。如果预测结果相当准确,则又说明这个变量完全没有必要进行预测,因为这必然是与特征变量间存在重复信息。一般情况下,会介于两者之间效果为最好,若强行填补缺失值之后引入了自相关,这会给后续分析造成障碍。

    利用模型预测缺失变量的方法有很多,这里仅简单介绍几种。

    • 回归预测:

    如我们之前提到的房价预测项目一样数据分析实战—北京二手房房价分析(建模篇),基于完整的数据集,建立回归方程。对于有缺失值的特征值,将已知特征值代入模型来估计未知特征值,以此估计值来进行填充,以下图为例。当然关于回归的方法有很多,这里就不详细介绍了。

    缺失值是连续的,即定量的类型,才可以使用回归来预测。

    • 极大似然估计(Maximum likelyhood):

    在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂,且仅限于线性模型。

    • 多重插补(Mutiple imputation):

    多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。

    我们看到,以上提出的拟合和替换方法都是单一的插补方法,而多重插补弥补了单一插补的缺陷,它并没有试图去通过模拟值去估计每个缺失值,而是提出缺失数据值的一个随即样本(这些样本可以是不同的模型拟合结果的组合)。这种程序的实施恰当地反映了由于缺失值引起的不确定性,使得统计推断有效。多重插补推断可以分为以下3个步骤:

    • 为每个缺失值产生一套可能的插补值,这些值反映了无响应模型的不确定性;
    • 每个插补数据集合都用针对完整数据集的统计方法进行统计分析;
    • 对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值;

    根据数据缺失机制、模式以及变量类型,可分别采用回归、预测均数匹配( predictive mean matching, PMM )、趋势得分( propensity score, PS )、Logistic回归、判别分析以及马尔可夫链蒙特卡罗( Markov Chain Monte Carlo, MCMC) 等不同的方法进行填补。

    假设一组数据,包括三个变量Y1,Y2,Y3,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失Y3,C组缺失Y1和Y2。在多值插补时,对A组将不进行任何处理,对B组产生Y3的一组估计值(作Y3关于Y1,Y2的回归),对C组作产生Y1和Y2的一组成对估计值(作Y1,Y2关于Y3的回归)。

    当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组Y3的值,对C将利用Y1,Y2,Y3它们的联合分布为正态分布这一前提,估计出一组(Y1,Y2)。

    上例中假定了Y1,Y2,Y3的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。

    注:使用多重插补要求数据缺失值为随机性缺失,一般重复次数20-50次精准度很高,但是计算也很复杂,需要大量计算。

    • 随机森林:

    另一种比较常用的拟合方法就是随机森林,这也是Kaggle竞赛中大佬们经常使用的一个办法,具体实现方式与正常一样,只是将缺失值作为目标变量即可。以下**知识星球项目(一)**中一段代码,仅供参考。

    def set_missing_ages(df):
    
        # 把已有的数值型特征取出来丢进Random Forest Regressor中
        age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
    
        # 乘客分成已知年龄和未知年龄两部分
        known_age = age_df[age_df.Age.notnull()].as_matrix()
        unknown_age = age_df[age_df.Age.isnull()].as_matrix()
    
        # y即目标年龄
        y = known_age[:, 0]
    
        # X即特征属性值
        X = known_age[:, 1:]
    
        # fit到RandomForestRegressor之中
        rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
        rfr.fit(X, y)
    
        # 用得到的模型进行未知年龄结果预测
        predictedAges = rfr.predict(unknown_age[:, 1:])
    #     print predictedAges
        # 用得到的预测结果填补原缺失数据
        df.loc[ (df.Age.isnull()), 'Age' ] = predictedAges 
    
        return df, rfr
    
    • 虚拟变量

    虚拟变量其实就是缺失值的一种衍生变量。具体做法是通过判断特征值是否有缺失值来定义一个新的二分类变量。比如,特征为A含有缺失值,我们衍生出一个新的特征B,如果A中特征值有缺失,那么相应的B中的值为1,如果A中特征值没有缺失,那么相应的B中的值为0。

    下面是**知识星球项目(一)**中的一段程序:

    data_train['CabinCat'] = data_train['Cabin'].copy()
    data_train.loc[ (data_train.CabinCat.notnull()), 'CabinCat' ] = "No"
    data_train.loc[ (data_train.CabinCat.isnull()), 'CabinCat' ] = "Yes"
    
    fig, ax = plt.subplots(figsize=(10,5))
    sns.countplot(x='CabinCat', hue='Survived',data=data_train)
    plt.show()
    

    下面可以通过一行代码清楚看到衍生的虚拟变量。

    data_train[['Cabin','CabinCat']].head(10)
    

    3. 不处理

    补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。

    在实际应用中,一些模型无法应对具有缺失值的数据,因此要对缺失值进行处理。然而还有一些模型本身就可以应对具有缺失值的数据,此时无需对数据进行处理,比如Xgboostrfr等高级模型。

    4 总结

    总而言之,大部分数据挖掘的预处理都会使用比较方便的方法来处理缺失值,比如均值法,但是效果上并一定好,因此还是需要根据不同的需要选择合适的方法,并没有一个解决所有问题的万能方法。具体的方法采用还需要考虑多个方面的:

    • 数据缺失的原因;
    • 数据缺失值类型;
    • 样本的数据量;
    • 数据缺失值随机性等;

    关于数据缺失值得思维导图:

    如果大家有任何好的其他方法,欢迎补充。

    参考:

    http://www.restore.ac.uk/PEAS/imputation.php
    https://blog.csdn.net/lujiandong1/article/details/52654703
    http://blog.sina.com.cn/s/blog_4b0f1da60101d8yb.html
    https://www.cnblogs.com/Acceptyly/p/3985687.html

    原创不易,来波点赞支持。

    本篇首发于我的原创公众号:Python数据科学,欢迎关注。
    数据科学网站:datadeepin

    展开全文
  • 假设正态分布,根据Robert Dean和Wilfrid Dixon以及其他人的说法,这个测试应该在数据集中谨慎使用,并且不要超过一次。要对错误数据应用Q测试,请按增加值的顺序排列数据并按定义计算Q:   其中的差距是绝对差...
  • 文章目录数据采集空间数据采集的方法野外数据采集地图数字化摄影测量方法遥感图像处理方法属性数据采集的方法数据来源属性数据的分类数据编码方案的制定数据编辑图形数据编辑属性数据编辑数据处理数学基础变换几何...
  • 数据挖掘:数据清洗——异常值处理 一、离群点是什么? 离群点,是一个数据对象,它显著不同于其他数据对象,与其他数据分布有较为显著的不同。有时也称非离群点为“正常数据”,离群点为“异常数据”。 离群点跟...
  • 数据挖掘和机器学习是进行数据处理的非常有用的工具...因此,后面的论述主要以处理数据的流程入手,把每个方法带入到数据处理的步骤中来讲,使得这些方法在数据处理中的具体位置有一个清晰的显示,有利于理解这些方法。
  • 海量数据处理

    千次阅读 2012-08-11 11:55:27
    面对海量数据,我们想到的最简单方法即是分治,即分开处理,大而化小,小而治之。我们也可以想到集群分布式处理。 1 海量数据的存储:为大数据分析做准备 传统关系型数据库
  • 数据缺失值的处理方法

    万次阅读 2018-03-03 15:24:45
    数据的准备往往占到整个工作的70%的时间。数据准备包括了数据的抽取,清洗,转换,...优点:简单易行,在数据含有多个属性缺失值、被删除的含缺失值的数据与信息表中的数据量相比非常小的情况下是非常有效的 缺点:...
  • R语言 处理缺失值数据

    万次阅读 多人点赞 2016-05-18 11:34:55
    R语言 处理缺失值数据 VIM包 mice包
  • 数据结构:八大数据结构分类

    万次阅读 多人点赞 2018-09-05 18:23:28
    常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 每一种数据结构都有着独特的数据存储方式,下面为大家介绍它们的结构和优缺点。 1、数组 数组是可以再内存中连续存储多个元素的...
  • 介绍: 在统计理论中,肖维勒准则(以William ...通过这样做,来自位于该概率带之外的n个样本的任何数据点可以被认为是异常值,从数据集中移除,并且可以计算基于剩余值和新样本大小的新的均值和标准偏差。 ...
  • 海量数据处理算法

    千次阅读 2017-08-14 20:00:04
    海量信息即大规模数据,随着互联网技术的发展,...在海量数据中提取信息,不同于常规量级数据中提取信息,在海量信息中提取有用数据,会存在以下几个方面的问题: (1)数据量过大,数据中什么情况都可能
  • 拉链解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组T[0..m-1...与开放定址相比,拉链有如下几个优点: 拉链
  • Python异常数据处理——箱型图分析

    万次阅读 2020-08-05 15:35:51
    数据分析中,利用箱型图的方法对异常数据进行过滤,是一种很快速、很有效的异常数据处理方法。 箱形图(英文:Box plot),又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。...
  • 普林斯顿Stata教程 - Stata数据处理

    万次阅读 2018-06-04 11:46:41
    译者:谢作翰 | 连玉君 | (知乎 | 简书 | 码云)   原文链接:Princeton Stata 在线课程 (Princeton University - Stata Tutorial ) ...普林斯顿Stata教程 - Stata数据管理 普林斯顿Stata教程 ...
  • 如何处理海量数据

    千次阅读 2012-11-01 10:07:26
    如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能...
  • 数据层面处理方法多借助数据采样(sampling)使整体训练集样本趋于平衡 即各类样本数基本一致 12.1.1 数据重采样 重采样包括上采样和下采样 对于样本较少的类别,使用上采样(赋值/数据扩充),增加样本数 对...
  • 如何处理海量数据(长文)

    千次阅读 2015-08-03 21:27:12
    如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至 过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都...
  • 海量数据处理:算法

    千次阅读 2016-06-20 21:54:08
    海量信息即大规模数据,随着互联网技术的发展,互联网上的信息越来越多,如何从海量信息中提取有用信息成为当前互联网技术发展必须面对的问题。 在海量数据中提取信息,不同于常规量级数据中提取信息,在海量信息中...
  • 关于 LiDAR 点云数据处理的一些思考

    万次阅读 多人点赞 2019-04-20 23:00:59
    关于机载LiDAR数据处理的几点心得体会 LiDAR 点云数据的定向,要通过多个坐标系间的几何关系来确定,包括激光扫描仪的参考坐标系、瞬时激光束坐标系、空中平台坐标系、目标所在水平参考坐标系与垂直坐标系和...
  • 4.处理缺失值 识别 判断缺失值:is.na() 识别矩阵或数据框中的完整观测:complete.cases() 例: any(is.na(data)):检查是否存在缺失值 head(is.na(datacol1),5):查看数据data中col1列前5个数据的缺失情况sum...
  • 机器学习中数据缺失值处理方法

    千次阅读 2018-06-17 22:48:00
    这时如果手工处理非常低效,如果舍弃缺失记录,则会丢失大量信息,使不完全观测数据与完全观测数据间产生系统差异,对这样的数据进行分析,很可能会得出错误的结论。 造成数据缺失的原因 缺失值处理的方法 ...
  • R语言——数据清洗之缺失值处理

    千次阅读 多人点赞 2020-10-13 16:29:51
    缺失值处理步骤: 1)识别缺失数据; 2)检查导致数据缺失的原因; 3)删除包含缺失值的实例或用合理的数值代替(插补)缺失值 缺失值数据的分类: 1)完全随机缺失:若某变量的缺失数据与其他任何观测或未观测变量...
  • 数据清理/探索性数据分析阶段的主要问题之一是处理缺失值。 缺失值表示未在观察值中作为变量存储的数据值。 这个问题在几乎所有研究中都是常见的,并且可能对可从数据得出的结论产生重大影响。 查看数据中的缺失值...
  • 海量数据处理 算法总结

    千次阅读 2016-07-08 20:40:38
    Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,...
  • 前段时间在做点云深度学习网络课题时,随手在博客“ModelNet40 中加入自己的数据集”中放了两串代码,目的是方便自己的存取(当时不会GIT的菜鸟)。结果成了所写博客中访问最多,提问最多的博文(瑟瑟发抖)。近段...
  • 海量数据处理常用的方法

    千次阅读 2016-03-10 22:34:22
    通过对海量数据的挖掘能有效地揭示用户的行为模式,加深对用户需求的理解,提取...在处理海量数据的过程中,使用Hash方法一般可以快速存取、统计某些数据,将大量数据进行分类,例如提取某日访问网站次数最多的ip。 2.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,652
精华内容 47,860
关键字:

列表法处理数据的优点