使用 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 中的日志丢失是不是相同?
如何使用 XGboost 针对不同的“eval_metric”优化 sklearn 管道?
带有 XGBoost 的 Sklearn GridSearchCV - 可能不使用参数 cv