scikit-learn 中的 Multivariate imputer 与 Simple imputer 有何不同?

Posted

技术标签:

【中文标题】scikit-learn 中的 Multivariate imputer 与 Simple imputer 有何不同?【英文标题】:How does the Multivariate imputer in scikit-learn differ from the Simple imputer? 【发布时间】:2019-12-02 18:56:43 【问题描述】:

我有一个包含缺失值的数据矩阵,我正在尝试估算这些数据,我正在查看不同估算器的选项,并检查哪些设置最适合我正在工作的生物学环境。我了解matlab 中的 knnimpute 函数和 scikit-learn 中的简单 imputer。但是,我不太确定我对迭代估算器的理解是否正确。

我已经查看了该站点上有关多变量/迭代估算器的文档 -- https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html

我不明白算法的解释,作为循环。 imputer 是否使用矩阵中列和行的特征来确定缺失数据点的“值”?然后采用这种方法一次一个随机缺失的数据点,以避免将数据不自然地转向先前估算数据点的特征?

【问题讨论】:

【参考方案1】:

我对算法的理解如下:

简单的估算器

简单的 Imputer 使用每列中的非缺失值来估计缺失值。

例如,如果您有一个像年龄这样的列,其中有 10% 的缺失值。它会找到平均年龄,并用该值替换年龄列中所有缺失的内容。

它支持几种不同的插补方法,例如中位数和众数(most_common)以及您自己定义的常数值。最后两个也可以用于分类值。

df = pd.DataFrame('A':[np.nan,2,3],
               'B':[3,5,np.nan],
               'C':[0,np.nan,3],
               'D':[2,6,3])
print(df)    

   A    B    C    D
0  NaN  3.0  0.0  2
1  2.0  5.0  NaN  6
2  3.0  NaN  3.0  3

imp = SimpleImputer()
imp.fit_transform(df)

array([[2.5, 3. , 0. , 2. ],
   [2. , 5. , 1.5, 6. ],
   [3. , 4. , 3. , 3. ]])

如您所见,估算值只是每列的平均值

迭代估算器

Iterative Imputer 可以根据您的配置方式执行许多不同的操作。此解释采用默认值。

Original Data
   A    B    C    D
0  NaN  3.0  0.0  2
1  2.0  5.0  NaN  6
2  3.0  NaN  3.0  3

首先,它与简单的 imputer 做同样的事情,例如simple 根据 initial_strategy 参数(默认 = 均值)估算缺失值。

Initial Pass
   A    B    C    D
0  2.5  3.0  0.0  2
1  2.0  5.0  1.5  6
2  3.0  4.0  3.0  3

其次,它训练传入的估计器(默认 = Bayesian_ridge)作为预测器。在我们的例子中,我们有列; A B C D。因此分类器将拟合一个具有自变量 A、B、C 和因变量 D 的模型

X = df[['A','B','C']]
y = df[['D']]
model = BaysianRidge.fit(X,y)

然后它为标记为估算的值调用这个新拟合模型的预测方法并替换它们。

model.predict(df[df[D = 'imputed_mask']])

对所有列组合重复此方法(文档中描述的循环),例如

X = df[['B','C','D']]
y = df[['A']]
...

X = df[['A','C','D']]
y = df[['B']]
...   

X = df[['A','B','D']]
y = df[['C']]    
...

在每个列组合上训练估计器的循环循环构成一次。重复此过程,直到满足停止容差或直到迭代器达到最大迭代次数(默认 = 10)

所以如果我们运行三遍,它看起来像这样:

Original Data
   A    B    C    D
0  NaN  3.0  0.0  2
1  2.0  5.0  NaN  6
2  3.0  NaN  3.0  3

Initial (simple) Pass
   A    B    C    D
0  2.5  3.0  0.0  2
1  2.0  5.0  1.5  6
2  3.0  4.0  3.0  3


pass_1
[[3.55243135 3.         0.         2.        ]
[2.         5.         7.66666393 6.        ]
[3.         3.7130697  3.         3.        ]]

pass_2
[[ 3.39559017  3.          0.          2.        ]
[ 2.          5.         10.39409964  6.        ]
[ 3.          3.57003864  3.          3.        ]]

pass_3
[[ 3.34980014  3.          0.          2.        ]
 [ 2.          5.         11.5269743   6.        ]
 [ 3.          3.51894112  3.          3.        ]]

显然,对于这样一个小示例,它并不适用,因为没有足够的数据来拟合估计器,因此对于较小的数据集,最好使用简单的估算方法。

【讨论】:

以上是关于scikit-learn 中的 Multivariate imputer 与 Simple imputer 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中的 DBSCAN(仅使用指标)

scikit-learn 中的不平衡

混淆矩阵中的 Scikit-learn 变化阈值

GradientBoostingClassifier 与 scikit-learn 中的 BaseEstimator?

如何修复 scikit-learn 中的令牌模式?

scikit-learn 中的测试集分区