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

 

插值有多种方式

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等进行插值