Skip to content

'super' object has no attribute '__sklearn_tags__' 错误解决方案

问题描述

当使用 Scikit-learn 的 RandomizedSearchCV 调试 XGBoost 模型(特别是 XGBRegressor)时,您可能会遇到以下错误:

python
AttributeError: 'super' object has no attribute '__sklearn_tags__'

该错误通常在调用 fit() 方法时发生,尤其在以下环境组合中:

  • Python 3.12
  • XGBoost 最新版本
  • Scikit-learn(sklearn)1.6.0 及以上版本

此问题的核心是 Scikit-learn 与其他机器学习库(如 XGBoost)之间的版本兼容性问题,通常在新版本软件发布初期出现。

问题原因

此错误源于 Scikit-learn 1.6.0 的 API 变更:

  1. Scikit-learn 引入了 __sklearn_tags__ 属性用于框架内部元数据管理
  2. XGBoost 2.1.4 之前的版本未适配此变更
  3. 在 sklearn ≥1.6.0 且 xgboost <2.1.4 的组合下会触发此兼容性错误

解决方案

✅ 推荐方案:升级 XGBoost(优先建议)

最彻底的解决方案是更新 XGBoost 至 2.1.4 及以上版本:

bash
pip install xgboost>=2.1.4 --upgrade

此版本通过 PR11021 专门修复了与 sklearn 1.6+ 的兼容性问题,无需降级 sklearn,可持续使用最新特性。

⚠️ 替代方案:降级 Scikit-learn

如果暂时无法升级 XGBoost,可降级 sklearn 至兼容版本:

bash
pip uninstall scikit-learn -y
pip install scikit-learn==1.5.2  # 或 scikit-learn==1.3.1

版本参考

  • Scikit-learn 1.5.2:社区验证有效的兼容版本
  • Scikit-learn 1.3.1:备选兼容版本

ℹ️ 注意事项

  1. 警告处理:若使用 sklearn 1.6.1 及以上 + xgboost≥2.1.4
    • 可能遇到 DeprecationWarning 而非错误
    • 此为正常过渡状态,可通过代码忽略:
      python
      import warnings
      warnings.filterwarnings("ignore", category=DeprecationWarning)
  2. 未来版本
    • Scikit-learn 1.7+ 将重新将此问题转为错误
    • 强烈建议尽快使用 xgboost≥2.1.4 的推荐方案

验证方案

安装后运行以下代码检查版本兼容性:

python
import xgboost
from sklearn import __version__ as sklearn_version

print(f"XGBoost version: {xgboost.__version__}")
print(f"Scikit-learn version: {sklearn_version}")

# 验证兼容性组合
if xgboost.__version__ >= "2.1.4" or sklearn_version < "1.6.0":
    print("✅ 兼容版本组合")
else:
    print("⛔ 存在兼容风险!请参考上述解决方案")

资源参考

  1. XGBoost 2.1.4 版本说明
  2. Scikit-learn 1.6.0 变更日志
  3. GitHub 原始问题讨论

关键提示:机器学习库快速迭代中频繁出现类似兼容性问题。建立版本管理策略(如 requirements.txt 或虚拟环境)可避免此类问题。