Показатели множественной оценки с помощью sklearn xgboost gridsearchcv - PullRequest
0 голосов
/ 26 мая 2018

Как запустить поиск по сетке с помощью 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: значение оценки должнолибо быть вызываемым, строкой или None.{'AUC': 'roc_auc', 'Accuracy': make_scorer (precision_score), 'Precision': make_scorer (precision_score), 'Recall': make_scorer (all_score)} пройдено

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Сначала проверьте версию 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, которое вы указали в своих требованиях.

0 голосов
/ 27 мая 2018

Как предполагает ошибка, и как указано в документации v0.18.2:

скоринг: строка, вызываемый или нет, по умолчанию = нет

нельзяпредоставил несколько метрик в аргумент scoring (в этой версии scikit-learn).

PS Все функции, которые вы пытались включить в make_scorer, уже предопределены как стандартные счетчики, поэтому вы можете использовать их строковые имена: см. Документы

Отредактировано: удален комментарий об использовании нескольких метрик после критики Vivek

...