使用sklearn xgboost gridsearchcv进行多项评分指标

时间:2018-05-25 22:38:12

标签: python scikit-learn cross-validation xgboost

如何使用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),   '精确':make_scorer(precision_score),'召回':   make_scorer(recall_score)}已通过

2 个答案:

答案 0 :(得分: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 param。在多度量设置中,您需要对其进行设置,以便最终模型可以适应该模型,因为模型的最佳超参数将仅基于单个度量来决定。

如果您不想要最终模型并且只希望模型在数据和不同参数上的表现,或者将其设置为您拥有的False中的任何一个,则可以将其设置为key你的得分词。

答案 1 :(得分:-1)

正如错误所示,并且正如v0.18.2的文档所述:

  

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

无法在scoring参数中提供多个指标(在此scikit-learn版本中)。

P.S。您尝试包装到make_scorer的所有功能都已预先定义为标准记分员,因此您可以使用其字符串名称:see docs

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