scikit-learn中的多元变量与简单变量有何不同?

时间:2019-07-24 15:05:11

标签: python scikit-learn imputation conceptual

我有一个要缺失的值构成的数据矩阵,我正在寻找针对不同注入者的选项,并检查哪些设置最适合我正在研究的生物学环境。我理解Matlab中的knnimpute函数和scikit-learn中的简单imputer。但是,我不太确定我对迭代推动力的理解是否正确。

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

我不理解该算法的解释,例如轮询。冒充者是否使用矩阵中列和行的特征来确定缺失数据点的“值”?然后一次采用这种方法随机丢失一个数据点,以避免将数据自然地移向先前估算的数据点的特征?

1 个答案:

答案 0 :(得分:1)

我对算法的理解如下:

简单的计算机

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

例如,如果您有一个诸如age的列,其值缺失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. ]])

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

迭代冲刺

迭代式计算机可以根据您的配置方式执行许多不同的操作。此说明采用默认值。

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

首先,它的作用与简单的不当之物如simple根据initial_strategy参数(默认值= Mean)估算缺失值。

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

显然,对于这么小的示例来说,它并不适用,因为没有足够的数据来适合估计量,因此对于较小的数据集,最好使用简单的插补方法。