使用 sklearn xgboost gridsearchcv 的多个评分指标

Posted

技术标签:

【中文标题】使用 sklearn xgboost gridsearchcv 的多个评分指标【英文标题】:Multiple scoring metrics with sklearn xgboost gridsearchcv 【发布时间】:2018-11-05 08:27:08 【问题描述】:

如何使用 sklearn xgboost 运行网格搜索并获取各种指标,最好是 F1 阈值?

在下面查看我的代码...找不到我做错了什么/不理解错误..

######################### just making up a dataset here##############
from sklearn import datasets

from sklearn.metrics import precision_score, recall_score, accuracy_score,   roc_auc_score, make_scorer
from sklearn.calibration import CalibratedClassifierCV, calibration_curve
from sklearn.model_selection import train_test_split
from sklearn.grid_search import RandomizedSearchCV

import xgboost as xgb

X, y = datasets.make_classification(n_samples=100000, n_features=20,
                                    n_informative=2, n_redundant=10,
                                    random_state=42)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.99,
                                                    random_state=42)

剩下的是一堆参数,然后是随机网格搜索...... 如果我将 'SCORING_EVALS' 更改为 'roc_auc' 那么它可以工作......如果我尝试执行似乎是记录在案的方法,我会收到错误消息?我哪里错了?

此外,我如何确保这些指标在 F1 阈值上报告!?

params = 
    'min_child_weight': [0.5, 1.0, 3.0, 5.0, 7.0, 10.0],
    'gamma': [0, 0.25, 0.5, 1.0],
    'reg_lambda': [0.1, 1.0, 5.0, 10.0, 50.0, 100.0],
    "max_depth": [2,4,6,10],
    "learning_rate": [0.05,0.1, 0.2, 0.3,0.4],
    "colsample_bytree":[1, .8, .5],
    "subsample": [0.8],
    'reg_lambda': [0.1, 1.0, 5.0, 10.0, 50.0, 100.0],
            'n_estimators': [50]



folds = 5
max_models = 5

scoring_evals = 'AUC': 'roc_auc', 'Accuracy': make_scorer(accuracy_score), 'Precision': make_scorer(precision_score),'Recall': make_scorer(recall_score)


xgb_algo = xgb.XGBClassifier()
random_search = RandomizedSearchCV(xgb_algo,
                                   param_distributions=params, n_iter=max_models, 
                                   scoring= scoring_evals, n_jobs=4, cv=5, verbose=False, random_state=2018 )

random_search.fit(X_train, y_train)

我的错误是:

ValueError:评分值应该是可调用的、字符串或无。 'AUC': 'roc_auc', '准确度': make_scorer(accuracy_score), 'Precision':make_scorer(precision_score),'Recall': make_scorer(recall_score) 已通过

【问题讨论】:

您使用的是哪个版本的 scikit-learn?这个多指标存在于 0.19.1 【参考方案1】:

正如错误提示以及 v0.18.2 的文档所述:

评分:字符串,可调用或无,默认=无

不能在scoring 参数中提供多个指标(在这个 scikit-learn 版本中)。

附:您尝试包装到 make_scorer 中的所有函数都已预定义为标准记分器,因此您可以使用它们的字符串名称:see docs

已编辑:在批评 Vivek 后删除了对使用多个指标的评论

【讨论】:

不,最新版本的 scikit learn 可以处理多个指标。 公平点,较新的版本确实可以处理它。我的疏忽。但是,错误似乎正是来自这个原因,所以答案适用,但必须删除额外的细节【参考方案2】:

首先检查您使用的 scikit-learn 的版本。如果它是 v0.19 ,那么您正在使用已弃用的模块。

你正在这样做:

from sklearn.grid_search import RandomizedSearchCV

而且你一定收到了这样的警告:

DeprecationWarning:此模块在 0.18 版中已弃用 支持所有重构的 model_selection 模块 类和函数被移动。 ... ... ...

grid_search 模块中的类已过时且已弃用,并且不包含您正在使用的多指标功能。

注意该警告并执行以下操作:

from sklearn.model_selection import RandomizedSearchCV

...
...
...

random_search = RandomizedSearchCV(xgb_algo,
                               param_distributions=params,  
                               n_iter=max_models, 
                               scoring= scoring_evals, n_jobs=4, cv=5,  
                               verbose=False, random_state=2018, refit=False )

现在仔细查看refit 参数。在多指标设置中,您需要设置此值,以便最终模型可以与之匹配,因为模型的最佳超参数将仅基于单个指标来确定。

如果您不想要最终模型并且只想要模型在数据和不同参数上的性能,您可以将其设置为False,或者将其设置为您在评分字典中拥有的任何key

【讨论】:

以上是关于使用 sklearn xgboost gridsearchcv 的多个评分指标的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost 和 Sklearn 中的日志丢失是不是相同?

SKLearn 包装器中 XGBoost 的决策函数

如何使用 XGboost 针对不同的“eval_metric”优化 sklearn 管道?

带有 XGBoost 的 Sklearn GridSearchCV - 可能不使用参数 cv

使用 sklearn xgboost gridsearchcv 的多个评分指标

调用 XGBoost .fit 后的 Python sklearn NotFittedError