howsklearn.impute.IterativeImputer(estimator='linear')
和pandas.interpolate(method='linear')
?
如果任何对这件事了解一点的人都能简单地提到,我将不胜感激
顾名思义,pandas.interpolate(method='linear')
假设您的行是有序的,并通过取前一个值和后一个值的平均值来填充每列中的NaN。
例如:
import pandas as pd
X = pd.DataFrame([[7, 2, 3], [4, np.nan, 6], [10, 5, 9],[np.nan,7,12],[5,9,14]])
0 1 2
0 7.0 2.0 3
1 4.0 NaN 6
2 10.0 5.0 9
3 NaN 7.0 12
4 5.0 9.0 14
如果我们进行X.interpole(方法="线性"),我们可以看到在第一列中,NaN由(10+5)/2=7.5填充,而第二列中的NaN则由(2+5)/2=3.5填充。
X.interpolate(method="linear")
0 1 2
0 7.0 2.0 3
1 4.0 3.5 6
2 10.0 5.0 9
3 7.5 7.0 12
4 5.0 9.0 14
所以你可以看到,这种插补与其他列或变量无关。
对于sklearn.impute.IterativeImputer
,它有点复杂。默认情况下(设置initial_strategy="mean"),它通过填充列的平均值来估算缺失的值。在这个估算矩阵上,它适合一个模型,使用您的列作为因变量进行估算,其他列作为自变量进行估算。从这个模型中,它根据其他列中未丢失的条目来预测丢失的值。默认情况下,使用的模型为BayesianRidge()
。
例如:
from sklearn.linear_model import BayesianRidge
from sklearn.impute import SimpleImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imputed_X = SimpleImputer(strategy="mean").fit_transform(X)
imputed_X
array([[ 7. , 2. , 3. ],
[ 4. , 5.75, 6. ],
[10. , 5. , 9. ],
[ 6.5 , 7. , 12. ],
[ 5. , 9. , 14. ]])
您可以看到缺失的值被列的平均值所取代。现在模型拟合,以第一列为例:
mdl = BayesianRidge().fit(imputed_X[:,1:],imputed_X[:,0])
mdl.predict(X.loc[[3],1:])
array([6.49820435])
您在第一列第三行中得到相同的值6.49820435,其中丢失的值以前是:
IterativeImputer(random_state=0).fit_transform(X)
array([[ 7. , 2. , 3. ],
[ 4. , 4.30503804, 6. ],
[10. , 5. , 9. ],
[ 6.4987435 , 7. , 12. ],
[ 5. , 9. , 14. ]])