缺失值几种处理方式:不处理,删除,插值,前两种没什么说的,说说插值吧。
插值有多种方式
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等进行插值