与sklearn.iterativeimputer和pandas.interpolate(method='linear')有何不同?



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.        ]])

最新更新