AttributeError: ‘XGBClassifier‘ object has no attribute ‘best_ntree_limit‘ 解决方案

  大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理解,而且能够帮助新手快速入门。

  本文主要介绍了AttributeError: ‘XGBClassifier’ object has no attribute 'best_ntree_limit’解决方案,希望能对使用XGBoost的同学们有所帮助。

1. 问题描述

  今天在运行XGBoost代码时,却出现了AttributeError: ‘XGBClassifier’ object has no attribute 'best_ntree_limit’的错误提示,具体报错信息如下图所示:
在这里插入图片描述

  在经过了亲身的实践后,终于找到了解决问题的方案,最终将逐步的操作过程总结如下。希望能对遇到同样bug的同学们有所帮助。

在这里插入图片描述
在这里插入图片描述
  本专栏的文章,都是我基于实际项目经验,剥离了繁杂的业务逻辑,提炼出的核心技术内容。我希望通过文字的复现,不仅带大家跑通代码,更重要的是养成一种“从问题出发,寻找最优解”的工程思维。

2. 解决方案

  经过调研和实践后发现,在较新版本的 XGBoost 中,best_ntree_limit 属性在 XGBoost 的新版本中确实已经被弃用 (deprecate

非常棒的问题!你遇到了一个典型的 **XGBoost 版本兼容性问题**: > `XGBClassifier object has no attribute best_ntree_limit` 这个问题通常出现在 **XGBoost 1.6 之后的版本中**,因为从 `xgboost>=1.6` 开始,`best_ntree_limit` 的获取方式发生了变化。 --- ## ✅ 问题原因 在 XGBoost 1.6 之前: ```python model.fit(...) print(model.best_ntree_limit) # ✅ 可用 ``` 在 XGBoost 1.6 及之后(包括 1.7、2.0、2.1): ```python model.fit(...) print(model.best_ntree_limit) # ❌ 报错!AttributeError ``` 原因是 `best_ntree_limit` 被移到了 `model.get_booster()` 的属性中。 --- ## ✅ 解决方案:获取 `best_ntree_limit` 的正确方式 ```python best_n_estimators = model.get_booster().best_ntree_limit ``` ### ✅ 示例代码片段(修复) ```python model.fit( X_train_bal, y_train_bal, eval_set=[(X_test_flagged, y_test)], early_stopping_rounds=10, verbose=False ) # ✅ 正确获取方式 best_n_estimators = model.get_booster().best_ntree_limit ``` --- ## ✅ 完整修复后的模型训练代码(带 Early Stopping) ```python model = XGBClassifier( objective="binary:logistic", eval_metric="auc", use_label_encoder=False, **param_dict ) model.fit( X_train_bal, y_train_bal, eval_set=[(X_test_flagged, y_test)], early_stopping_rounds=early_stopping_rounds, verbose=False ) # ✅ 获取最佳迭代次数 best_n_estimators = model.get_booster().best_ntree_limit # 重新训练模型并使用最佳迭代次数 model = XGBClassifier( objective="binary:logistic", eval_metric="auc", use_label_encoder=False, **param_dict, n_estimators=best_n_estimators ) model.fit(X_train_bal, y_train_bal) ``` --- ## ✅ 补充说明 - `best_ntree_limit` 是早停机制下推荐使用的树的数量; - 它通常比 `n_estimators` 小; - 如果你使用的是 `xgboost.train()`(而不是 sklearn 接口),可以直接获取 `best_iteration`; - 如果你希望兼容旧版本,可以使用如下兼容写法: ```python try: best_n_estimators = model.best_ntree_limit except AttributeError: best_n_estimators = model.get_booster().best_ntree_limit ``` --- ## ✅ 总结 | XGBoost 版本 | 获取方式 | |--------------|----------| | < 1.6 | `model.best_ntree_limit` | | ≥ 1.6 | `model.get_booster().best_ntree_limit` | --- ##
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的喵喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值