我有一个要缺失的值构成的数据矩阵,我正在寻找针对不同注入者的选项,并检查哪些设置最适合我正在研究的生物学环境。我理解Matlab中的knnimpute函数和scikit-learn中的简单imputer。但是,我不太确定我对迭代推动力的理解是否正确。
我已经查看了该站点上有关多变量/迭代迭代器的文档-https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html
我不理解该算法的解释,例如轮询。冒充者是否使用矩阵中列和行的特征来确定缺失数据点的“值”?然后一次采用这种方法随机丢失一个数据点,以避免将数据自然地移向先前估算的数据点的特征?
答案 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. ]]
显然,对于这么小的示例来说,它并不适用,因为没有足够的数据来适合估计量,因此对于较小的数据集,最好使用简单的插补方法。