在 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 校准多标签分类

如何检查 CalibratedClassifierCV BaseEstimator 参数

KerasClassifier 对象没有属性模型

如何从 sklearn 包中安装“校准”功能?

scikit-learn 中多数投票的训练会重新训练分类器吗?