You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于机器学习的Pandas缺失值自动插补Python代码求询

用机器学习填充Pandas DataFrame缺失值的Python方案

当然有啦!比起简单的均值/中位数填充,用机器学习模型填补缺失值能更好地利用特征间的关联,填充结果往往更贴合数据的真实分布。下面给你几个实用的实现方案,都是Python生态里常用的工具:

1. Scikit-learn自带的迭代填充(IterativeImputer)

这是sklearn官方提供的工具,本质上是用多变量迭代回归的方式填充缺失值——它会把每个有缺失值的列当作目标变量,用其他列作为特征训练模型,反复迭代直到收敛。你可以自定义用什么模型(比如随机森林、线性回归)。

代码示例:

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

# 构造带缺失值的示例数据
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [np.nan, 2, 3, np.nan, 5],
    'C': [1, 2, 3, 4, 5]
})

# 初始化迭代填充器,指定用随机森林作为基础模型
imputer = IterativeImputer(
    estimator=RandomForestRegressor(n_estimators=100, random_state=42),
    max_iter=10,  # 迭代次数
    random_state=42
)

# 执行填充,返回的是numpy数组,转成DataFrame
filled_df = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
print(filled_df)

注意点:

  • 如果你的数据里有分类特征,要先做编码(比如OneHotEncoderLabelEncoder),不然模型无法处理字符串类型
  • 可以通过调整estimator参数更换模型,比如用LinearRegression适合线性关联强的数据,随机森林适合非线性场景

2. 手动用回归模型填充特定列

如果你只想针对某一列的缺失值做填充,也可以手动拆分数据训练模型,这种方式更灵活可控。

代码示例:

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor

# 还是用刚才的示例数据
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [np.nan, 2, 3, np.nan, 5],
    'C': [1, 2, 3, 4, 5]
})

# 假设我们要填充列A的缺失值
# 1. 分离有值和无值的行
train_data = df[df['A'].notna()]
test_data = df[df['A'].isna()]

# 2. 准备特征和目标
X_train = train_data[['B', 'C']].fillna(train_data[['B', 'C']].mean())  # 先填充特征里的小缺失
y_train = train_data['A']
X_test = test_data[['B', 'C']].fillna(train_data[['B', 'C']].mean())

# 3. 训练模型并预测
model = RandomForestRegressor(random_state=42)
model.fit(X_train, y_train)
predicted_values = model.predict(X_test)

# 4. 填充回原DataFrame
df.loc[df['A'].isna(), 'A'] = predicted_values
print(df)

3. 用专门的缺失值填充库:fancyimpute

这个库集成了多种高级填充方法,比如KNN填充、MICE(和IterativeImputer原理类似)、矩阵分解填充等,用法也很简单。

安装和代码示例:

首先安装库:

pip install fancyimpute

然后用MICE方法填充:

import pandas as pd
import numpy as np
from fancyimpute import IterativeImputer as FancyIterativeImputer

df = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [np.nan, 2, 3, np.nan, 5],
    'C': [1, 2, 3, 4, 5]
})

# 用MICE方法填充
filled_data = FancyIterativeImputer().fit_transform(df)
filled_df = pd.DataFrame(filled_data, columns=df.columns)
print(filled_df)

一些关键提示

  • 数据预处理:基于距离的方法(比如KNN)对数据尺度敏感,最好先做标准化/归一化
  • 模型选择:如果数据量小,用线性回归更稳定;数据量大且特征关联复杂,优先选树模型(随机森林、XGBoost)
  • 验证效果:可以用交叉验证来评估填充质量——比如故意隐藏部分已知值,填充后对比真实值的误差,选择最优方案

内容的提问来源于stack exchange,提问作者user40780

火山引擎 最新活动