如何解决将XGBClassifier包装到OneVsRest元估计器中时,提早停止
我正在尝试使用Scikit-Learn API对应用到多标签问题的XGBoost分类器进行早期停止,但未成功。为了提供示例,下面的代码段:
- 使用
make_multilabel_classification
创建一个多标签数据集。 - 生成评估集。
- 创建一个由
OneVsRestClassifier
对象包裹的XGBClassifier
组成的估算器。
from sklearn.datasets import make_multilabel_classification
from sklearn.model_selection import train_test_split
from sklearn.multiclass import OneVsRestClassifier
import xgboost as xgb
x,y = make_multilabel_classification(n_samples=1000,n_features=20,n_classes=5,n_labels=3)
x_tr,x_te,y_tr,y_te = train_test_split(x,y)
# As a wrapped estimator
clf = OneVsRestClassifier(xgb.XGBClassifier())
clf.fit(x_tr,y_tr)
我想将early_stopping_rounds
和eval_set
作为参数传递给clf.fit()
,但是这些参数无法识别,并且出现以下错误消息:
TypeError: fit() got an unexpected keyword argument 'early_stopping_rounds'
例如,在二进制分类问题中,如果我不将XGBClassifier
包装到OneVsRestClassifier
中,则fit
函数将接受early_stopping_rounds
和eval_set
作为有效参数,一切正常。
如果我在XGBClassifier中包含early_stopping_rounds
和eval_set
,例如:
clf = OneVsRestClassifier(xgb.XGBClassifier(early_stopping_rounds=10,eval_set=[[x_te,y_te]]))
不执行提前停止。我收到消息:
Parameters: { early_stopping_rounds,eval_set } might not be used.
并且通过检查拟合模型,我发现确实使用了所有n_estimators
,并且没有进行任何早期停止。
我的理解是,一旦XGBClassifier被包装到OneVsRestClassifier
对象中,fit
方法就不再公开早期停止的参数。有解决方法吗?我尝试在参数名称前加上estimator__
,但这没有任何区别。
非常感谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。