1.MICE算法
链式方程的多重插补(MICE,Multiple Imputation by Chained Equations)通过一系列迭代的预测模型来“填充”(插补)数据集中的缺失数据。在每次迭代中,将使用数据集中的其他变量来估算数据集中的每个指定的变量,这些迭代持续运行,直到满足收敛为止。
(由于每次迭代中填补的值会影响下一次迭代中其他缺失值的预测,这个过程形成了一个链式的反应)
迭代过程:
- 在每次迭代中,MICE算法逐个处理每个缺失值。
- 对于每个缺失值,算法使用一个模型(基于其他已观测到的值和已插补的值)来预测该缺失值的可能值。
- 模型的预测结果作为该缺失值的填补。
MICE 假设数据随机丢失 (MAR),但情况可能并非总是如此。如果数据不是随机丢失 (MNAR),则插补可能会有偏差。 使用各种缺失情况。
2. Scikit-learn的sklearn.impute.IterativeImputer函数 主要用于数值型数据
Scikit-learn的sklearn.impute.IterativeImputer函数是一种用于填补数据缺失值的函数。这个函数的主要作用是基于回归预测来对数据中的空值进行估计和填充,从而使得数据集更完整和一致,能够提高机器学习模型的性能。
这个函数主要实现的是采用多个回归模型来拟合缺失值,即采用多重填补法,可以使用不同的回归算法,如线性回归、决策树、KNN等。该函数返回的是填充后的数据表。
#要加这个必须注意 此评估器目前仍处于实验阶段:预测和API可能会发生变化,而不会出现任何弃用周期。要使用它,你需要显式地导入enable_iterative_imputer:
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
官网几个参数sklearn.impute.IterativeImputer 的官方文档在此.
DataFrame 是一个二维表格,可以被看作是一个 Excel 电子表格或 SQL 表,具有行和列。
fit_transform 方法:
- fit_transform 是一个便利的方法,它首先调用 fit 方法来拟合模型,然后立即调用 transform 方法来转换数据。这个方法通常用于以下情况:
- 当你需要对数据进行预处理,并且预处理依赖于数据的某些特性(如均值、方差等)。
- 当你需要在训练模型之前对数据进行相同的预处理
3.例子
使用 IterativeImputer 进行数据插补的基本流程:创建实例、拟合数据、转换数据到最终将结果转换为 NumPy 数组。
import pandas as pd
import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge
# 定义 Multivariate_Interpolation 函数
def Multivariate_Interpolation(data, random_state=1997):
imp = IterativeImputer(estimator=BayesianRidge(), max_iter=10, random_state=random_state)
imp.fit(data)
imputed_data = imp.transform(data)
imputed_data_df = pd.DataFrame(imputed_data, columns=data.columns)
return imputed_data_df
# 创建一个示例 DataFrame 包含缺失值
# 用 np.nan 表示缺失的数据
data_example = pd.DataFrame({
'Feature1': [1, 2, np.nan, 4],
'Feature2': [np.nan, 2, 3, 4],
'Feature3': [1, 2, 3, np.nan]
})
# 打印原始数据
print("Original data with missing values:")
print(data_example)
# 调用 Multivariate_Interpolation 函数进行插补
imputed_data_df = Multivariate_Interpolation(data_example)
# 打印填补后的数据
print("\nData after imputation:")
print(imputed_data_df)