You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MissForest处理缺失值遇ImportError报错的解决方法咨询

解决MissForest导入报错:ImportError: cannot import name '_check_weights' from 'sklearn.neighbors._base'

问题原因

报错源于missingpy库未适配scikit-learn 1.2.x版本。scikit-learn在1.2版本中重构了sklearn.neighbors模块,移除了_check_weights函数的原有导出路径,而missingpy的代码仍在尝试从旧路径导入该函数,导致导入失败。

解决办法

方法1:降级scikit-learn到兼容版本

将scikit-learn降级到1.1.x系列(推荐1.1.3),该版本与missingpy的API完全兼容:

pip install scikit-learn==1.1.3 --force-reinstall

执行后重新运行原有代码即可恢复正常。

方法2:使用scikit-learn原生迭代填补替代

如果不想降级sklearn,可以用scikit-learn内置的IterativeImputer结合随机森林模型,实现MissForest的核心逻辑,无需依赖missingpy:

import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
import numpy as np

# 假设你的数据是df,包含数值和分类特征
numeric_cols = df.select_dtypes(include=[np.number]).columns
categorical_cols = df.select_dtypes(exclude=[np.number]).columns

# 填补数值特征
numeric_imputer = IterativeImputer(estimator=RandomForestRegressor(n_estimators=100, random_state=42), max_iter=10)
df[numeric_cols] = numeric_imputer.fit_transform(df[numeric_cols])

# 填补分类特征(转换回原数据类型)
categorical_imputer = IterativeImputer(estimator=RandomForestClassifier(n_estimators=100, random_state=42), max_iter=10)
df[categorical_cols] = categorical_imputer.fit_transform(df[categorical_cols]).astype(df[categorical_cols].dtypes)

方法3:手动修改missingpy源码(进阶)

若坚持使用missingpy,可找到安装目录下的missingpy/missforest.py文件,修改导入逻辑:

  • 找到代码行from sklearn.neighbors._base import _check_weights
  • 替换为from sklearn.utils.validation import _check_weights(sklearn 1.2+中该函数已移至此处)
    修改后保存文件即可正常导入,但后续更新missingpy会覆盖该修改,需谨慎使用。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:12:49