缺失值幾種處理方式:不處理,刪除,插值,前兩種沒什么說的,說說插值吧。
插值有多種方式
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等進行插值