在 Scikit-learn 中使用 MissingIndicator 有什么意义?

数据挖掘 机器学习 Python scikit-学习 数据插补
2022-03-12 05:45:46

我最近发现了Sklearn 的 MissingIndicator,但仍然想知道它如何改进通常的机器学习工作。清除那个

from sklearn.impute import MissingIndicator
indicator = MissingIndicator()
X_mask = indicator.fit_transform(X)

可能导致 X_mask原始中缺失值的布尔指示符数组X但是除了跟踪估算值的位置之外,它还能如何实际使用呢?我知道在每个功能的单独列中标记 NA 可能对学习者有用,但这里X_mask 没有与估算相结合,X所以这似乎不是重点。

将 MissingIndicator 放入 ML 管道中也会出现类似的问题:

transformer = FeatureUnion(
     transformer_list=[
         ('features', SimpleImputer(strategy='mean')),
         ('indicators', MissingIndicator())])

在这里将纯掩码数组添加到估算数组有什么意义?

2个回答

好问题。这是我的看法:

下面的代码创建了估算特征和哪些特征被估算的指示的联合。

transformer = FeatureUnion(
     transformer_list=[
         ('features', SimpleImputer(strategy='mean')),
         ('indicators', MissingIndicator())])

我可以看到它对于可能学会不那么依赖经常丢失的功能的学习者变得有用。或者,某些特征完全缺失的事实可能对学习者有所帮助。因为,缺失值可能意味着数据收集中发生了不同的事情,这对于做出预测很有用。

假设我有以下问题:

我想根据他们在我喜欢的流媒体平台上的观看习惯对用户进行分类。用户必须对电影的好评或差评进行评分。当然,并不是我的所有用户都会观看所有电影,所以我会有空白值。通过使用让我们说SimpleImputer,我基本上会对他们会如何喜欢他们没有看过的电影做出有根据的猜测。这很有用,因为我可以比较所有电影的用户。然而,知道用户一共看过哪些电影可能同样有用。这就是MissingIndicator为您提供的。

跟踪缺失数据的想法可能很有用,因此您知道哪些数据点被估算或删除以训练模型。它可以让您了解功能重要性/可靠性。

但是,有很多方法可以做到这一点,如果您使用的是 Pandas DataFrame,那么MissingIndicator在我看来,该类对于跟踪缺失值的单一目的是多余的。

同样可以如下实现。假设我从这个数据框开始:

import pandas as pd
import numpy as np

In [1]: df                                                                                                           
Out[1]: 
            A         B          C         D
0    1.095564 -0.225533   0.441428  0.099792
1    1.198053  0.523837   -1.53928  0.871108
2         NaN  0.336165  NOT_FOUND -1.881777
3   -0.077794  0.175203   -1.76324  1.172351
4   -1.167858  0.340200   0.369765       NaN
5    0.514393 -0.045929   0.771916  0.130821
6   -0.065623  0.978825  -0.668706 -0.703892

所以有几个可能的缺失值:

In [2] missing_vals = ["NOT_FOUND", np.NaN]

In [3] missing_mask = df.isin(missing_vals)   # boolean mask of True where missing values found

In [4]: missing_mask                                                                                                 
Out[4]: 
       A      B      C      D
0  False  False  False  False
1  False  False  False  False
2   True  False   True  False
3  False  False  False  False
4  False  False  False   True
5  False  False  False  False
6  False  False  False  False

但由于这是一个 DataFrame,如果你需要它,你就拥有它的所有力量。查看每个特征缺少多少值:

In [5]: missing_mask.sum()
Out[5]: 
A    1
B    0
C    1
D    1
dtype: int64

用单个标记替换所有缺失值,例如“MISSING”

In [6]: df.where(~missing_mask, "MISSING")
Out[6]: 
           A          B         C          D
0    1.09556  -0.225533  0.441428  0.0997919
1    1.19805   0.523837  -1.53928   0.871108
2    MISSING   0.336165   MISSING   -1.88178
3 -0.0777938   0.175203  -1.76324    1.17235
4   -1.16786     0.3402  0.369765    MISSING
5   0.514393 -0.0459287  0.771916   0.130821
6 -0.0656233   0.978825 -0.668706  -0.703892

如果您想了解丢失的数据,我建议您查看这个名为 的出色软件包missingno,它是为此目的而构建的 :)