zoukankan      html  css  js  c++  java
  • 缺失值处理

    缺失值几种处理方式:不处理,删除,插值,前两种没什么说的,说说插值吧。

    插值有多种方式

    1. 均值、中位数、众数、固定值、插值

    2. 邻近插值

    3. 回归方法插值:曲线拟合

    4. 插值法:专门插值的方法,如拉格朗日插值法,牛顿插值法,分段插值,样条插值等

    回归是有误差的插值,,插值法是没有误差的插值,因为插值法是“完全拟合”

    sklearn 实现均值 中位数 众数插值

    sklearn.preprocessing.Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)

     参数

    missing_values:指定缺失值的表现形式,当然不一定是缺失值,如果你指定这个为1,会按指定的方式替换1

    strategy:指定方式替换缺失值,可取 mean  median  most_frequent 众数  

      据说在2.0版本上,可取 constant 常数,此时会有另一个参数 fill_value 来指定这个常数,我还没验证

    axis:指定轴,0代表列,1代表行

    copy:是否在原数据集上修改,如果为True,修改原数据集,如果为False,复杂一份数据,然后再修改

    示例代码

    import numpy  as np
    from sklearn.preprocessing import  Imputer
    
    ### NaN 的表现形式
    imp=Imputer(missing_values='NaN',strategy='mean',axis=0)
    imp=Imputer(missing_values=np.nan,strategy='mean',axis=0)
    imp=Imputer(missing_values=np.NaN,strategy='mean',axis=0)
    x=np.array([[1,2],
                [np.nan,3],
                [7,6]])
    imp.fit(x)
    print(x)
    print(imp.transform(x))
    # [[1. 2.]
    #  [4. 3.]
    #  [7. 6.]]
    
    ### 替换非缺失值
    imp=Imputer(missing_values=7,strategy='mean')
    x=np.array([[1,2],
                [6,3],
                [7,6]])
    imp.fit(x)
    print(x)
    print(imp.transform(x))
    # [[1.  2. ]
    #  [6.  3. ]
    #  [3.5 6. ]]

    scipy 实现拉格朗日插值

    平面上n个点,一定可以找到一个n-1次多项式,使得这个多项式经过这n个点,具体请百度

    示例代码

    from scipy.interpolate import lagrange
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    def interp_lagrange(x, y, xx):
        # 调用拉格朗日插值,得到插值函数p
        p = lagrange(x, y)
        yy = p(xx)
        plt.plot(x, y, "b*")
        plt.plot(xx, yy, "ro")
        plt.show()
    
    
    if __name__ == '__main__':
        NUMBER = 20
        eps = np.random.rand(NUMBER) * 2
    
        # 构造样本数据
        x = np.linspace(0, 20, NUMBER)
        y = np.linspace(2, 14, NUMBER) + eps
    
        # 兴趣点数据
        xx = np.linspace(12, 15, 10)
        interp_lagrange(x, y, xx)

    输出

    注意点:

    1. 拉格朗日插值法并不是数据越多越准确,因为数据过多时,其曲线最高次数会很高,曲线很复杂,这会造成较大的误差,此时可以尝试分段进行插值

    2. 拉格朗日插值在增加数据点时,曲线就会发生变化,这样就得重新插值,很不方便。

    3. 插值一般采用内插值,即对样本中存在的点进行插值,不存在的不进行插值。

    插值 VS 回归

    可以看到插值曲线是对蓝色*点完全拟合,回归曲线肯定不是这样的。

    此外还可以使用pandas、numpy等进行插值

  • 相关阅读:
    TP5多条件搜索,同时有必要条件
    微信支付模式二 统一下单一直提示签名错误
    Js选择器总结
    video.js视频播放插件
    chosen 下拉框
    在MySQL中实现Rank高级排名函数
    解决html页面英文和数字不自动换行,但中文就可以自动换行
    php去除html标签
    day29 继承
    day28 作业
  • 原文地址:https://www.cnblogs.com/yanshw/p/10701919.html
Copyright © 2011-2022 走看看