在 CalibratedClassifierCV 内使用管道分类器
Posted
技术标签:
【中文标题】在 CalibratedClassifierCV 内使用管道分类器【英文标题】:Using pipeline classifier inside of CalibratedClassifierCV 【发布时间】:2021-05-26 04:03:19 【问题描述】:我正在尝试训练 XGBoost 分类器。目标变量y
是二进制的。
数据(找不到样本数据集来完全重现。对此感到抱歉)。
X_train, X_validate, X_test
(包含数字和分类数据)
y_train, y_validate, y_test
(值为二进制 1/0)。
预处理器。
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='MISSING')),
('encoder', OneHotEncoder(handle_unknown='ignore'))])
numerical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value=-999))])
preprocessor = ColumnTransformer(
remainder='passthrough',
transformers=[
('cat', categorical_transformer, selector(dtype_include="object")),
('num', numerical_transformer, selector(dtype_exclude="object"))
])
型号。
best_clf = Pipeline(steps=[('preprocessor', preprocessor),
('classifier',
xgb.XGBClassifier(
seed=42,
objective='binary:logistic',
missing=-999,
## optimal params
learning_rate = 0.1))])
best_clf.fit(X_train, y_train,
classifier__early_stopping_rounds=10,
classifier__eval_metric='aucpr',
classifier__eval_set=[(X_validate_preprocessed, y_validate)],
classifier__verbose=True)
到目前为止一切正常。我现在有模型。但我想校准这个模型。
校准。
我试过了:
best_clf_calib = Pipeline(steps=[('preprocessor', preprocessor),
('calibrator', CalibratedClassifierCV(
base_estimator=best_clf.named_steps.classifier,
cv='prefit',
method='isotonic'))])
best_clf_calib.fit(X_validate, y_validate)
但它给了我以下错误:
TypeError: predict_proba() got an unexpected keyword argument 'X'
问题:具体应该如何设置CalibratedClassifierCV
中的base_estimator
参数?我试过设置
base_estimator = best_clf
但在这种情况下,管道似乎运行了两次。这是流水线步骤的示意图。
【问题讨论】:
请检查此解决方案是否有效:***.com/questions/65517931/… @Anu:是的,降级 sklearn 版本有效。谢谢。如果你把它写下来作为答案,我会接受。 这能回答你的问题吗? Xgboost not running with Callibrated Classifier 【参考方案1】:您不一定需要降级 sklearn。
我相信问题出在 XGBoost 上。 这里解释一下:https://github.com/dmlc/xgboost/pull/6555
XGBoost 定义:
predict_proba(self, data, ...
代替:
predict_proba(self, X, ...
并且由于 sklearn 0.24 调用clf.predict_proba(X=X)
,因此引发了异常。
这里有一个在不更改包版本的情况下解决问题的想法:创建一个继承 XGBoostClassifier
的类,以使用正确的参数名称覆盖 predict_proba
并调用 super()
。
【讨论】:
请不要对多个问题发布完全相同的答案:如果问题重复,请照此标记/投票;如果不是,请尝试针对不同的问题调整您的答案。【参考方案2】:感谢您的回复,我很高兴降级适用于您的 sklearn 版本。在此处发布链接以供将来参考。 Xgboost not running with Callibrated Classifier
【讨论】:
这不应该是一个答案,它应该是一个投票/标志关闭为重复。以上是关于在 CalibratedClassifierCV 内使用管道分类器的主要内容,如果未能解决你的问题,请参考以下文章
CatBoost 中的错误? CatBoostClassifier 不适用于 sklearn 的 CalibratedClassifierCV
Sklearn:使用 CalibratedClassifierCV 校准多标签分类