趋近智
简单的插补方法(如均值或中位数)速度快,但它们忽略了特征之间的关系。K近邻(KNN)插补器考虑特征相似性,但可能对数据尺度和距离度量的选择敏感。当你认为一个特征中的缺失值可以根据其他特征的值进行预测时,就需要一种更高级的方法。这时,基于模型的插补技术,比如IterativeImputer,就能发挥作用。
IterativeImputer 在 Scikit-learn 的 sklearn.impute 模块中提供,它通过将每个带有缺失值的特征建模为其他特征的函数来处理缺失数据。它将正在插补的特征视为目标变量 (),并将其他特征视为预测变量 ()。此过程迭代重复,在每个循环中优化插补值。
设想你有一个在多列中带有缺失值的数据集。IterativeImputer 分轮次进行操作:
max_iter),或者直到插补值稳定下来(即,连续轮次插补值之间的差异低于容忍阈值 tol)。每轮中特征的插补顺序可以通过 imputation_order 控制。这是单轮迭代插补过程的流程。整个循环会重复直到收敛。
IterativeImputer 的一个重要方面在于其选择用于预测的底层回归模型的灵活性。这由 estimator 参数 (parameter)控制。默认是 BayesianRidge,这通常是一个好的起点。然而,你可以传入任何能在预测时处理目标变量中 NaN 值的 scikit-learn 回归器(或者你可能需要根据估计器处理该方面)。常见选择包括:
BayesianRidge:默认,常选。DecisionTreeRegressor:捕捉非线性关系。ExtraTreesRegressor:类似于随机森林,通常更快。RandomForestRegressor:集成方法,处理交互作用。KNeighborsRegressor:使用类似于 KNNImputer 的邻近信息,但在迭代框架内。估计器的选择会影响插补的准确性和计算时间。像 RandomForestRegressor 这样更复杂的模型可能会捕捉到复杂的模式,但运行时间会更长,尤其是在大型数据集或多次迭代的情况下。
让我们看看如何使用 IterativeImputer。我们将创建一个带有缺失值的小型 DataFrame 并应用此插补器。
import pandas as pd
import numpy as np
from sklearn.experimental import enable_iterative_imputer # 启用实验性功能
from sklearn.impute import IterativeImputer
from sklearn.ensemble import RandomForestRegressor # 使用不同估计器的示例
# 带有缺失值的示例数据
data = {'FeatureA': [1, 2, np.nan, 4, 5, 6, np.nan, 8],
'FeatureB': [10, np.nan, 30, 40, 50, np.nan, 70, 80],
'FeatureC': [101, 102, 103, 104, 105, 106, 107, np.nan]}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
# 初始化 IterativeImputer(使用默认的 BayesianRidge)
imputer_br = IterativeImputer(max_iter=10, random_state=0)
# 拟合并转换数据
df_imputed_br = imputer_br.fit_transform(df)
# 转换回 DataFrame(可选,为了更好的可读性)
df_imputed_br = pd.DataFrame(df_imputed_br, columns=df.columns)
print("\n迭代插补后(BayesianRidge)的 DataFrame:")
print(df_imputed_br)
# 使用 RandomForestRegressor 作为估计器的示例
imputer_rf = IterativeImputer(estimator=RandomForestRegressor(n_estimators=10, random_state=0),
max_iter=10,
random_state=0)
df_imputed_rf = imputer_rf.fit_transform(df)
df_imputed_rf = pd.DataFrame(df_imputed_rf, columns=df.columns)
print("\n迭代插补后(RandomForestRegressor)的 DataFrame:")
print(df_imputed_rf)
运行此代码将首先显示带有 NaN 值的原始 DataFrame。然后,它将显示使用默认 BayesianRidge 估计器进行插补后的 DataFrame,接着是使用 RandomForestRegressor 的结果。你会注意到,插补值(例如索引2处的 FeatureA 或索引1处的 FeatureB)是根据从其他特征中学到的关系计算得出的。结果可能因所使用的估计器而略有不同。
优点:
注意事项:
max_iter 值时。估计器 的适当性及其调优。StandardScaler),尽管默认的 BayesianRidge 比基于距离的方法敏感度低。IterativeImputer 是一个强有力的选择,当:
它代表着从均值/中位数/众数或 KNN 插补的复杂程度提升,提供了一种有效的方式,通过借助数据集本身所具有的预测能力来处理缺失数据。然而,请记住要监控其性能和计算需求,并与更简单、更快的替代方案进行比较。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•