Нахождение точности, точности и отзыва модели после настройки гиперпараметра в sklearn - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть проблема бинарной классификации, для которой я выбрал 3 алгоритма, Логистическая регрессия, SVM и Adaboost. Я использую grid-поиск и k-кратную перекрестную проверку для каждого из них, чтобы найти оптимальный набор гиперпараметров. Теперь, исходя из точности, аккуратности и отзыва, мне нужно выбрать лучшую модель. Но проблема в том, что я не могу найти подходящий способ получить эту информацию. Мой код указан ниже:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics.scorer import make_scorer
from sklearn import cross_validation

# TODO: Initialize the classifier
clfr_A = LogisticRegression(random_state=128)
clfr_B = SVC(random_state=128)
clfr_C = AdaBoostClassifier(random_state=128)

lr_param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000] }
svc_param_grid = {'C': [0.001, 0.01, 0.1, 1, 10], 'gamma' : [0.001, 0.01, 0.1, 1]}
adb_param_grid = {'n_estimators' : [50,100,150,200,250,500],'learning_rate' : [.5,.75,1.0,1.25,1.5,1.75,2.0]}

# TODO: Make an fbeta_score scoring object using make_scorer()
scorer = make_scorer(fbeta_score, beta = 0.5)

# TODO: Perform grid search on the classifier using 'scorer' as the scoring method using GridSearchCV()
clfrs = [clfr_A, clfr_B, clfr_C]
params = [lr_param_grid, svc_param_grid, adb_param_grid]

for clfr, param in zip(clfrs, params):
    grid_obj = GridSearchCV(clfr, param, cv=3, scoring=scorer, refit=True)
    grid_fit = grid_obj.fit(features_raw, target_raw)
    print grid_fit.best_estimator_
    print grid_fit.cv_results_

Проблема в том, что cv_results_ выдает много информации, но я не могу найти ничего релевантного, кроме mean_test_score. Более того, я не вижу там никакой точности, точности или отзыва связанной метрики.

Я могу придумать, как этого добиться. Я могу изменить цикл for, чтобы он выглядел примерно так:

score_params = ["accuracy", "precision", "recall"]
for clfr, param in zip(clfrs, params):
    grid_obj = GridSearchCV(clfr, param, cv=3, scoring=scorer, refit=True)
    grid_fit = grid_obj.fit(features_raw, target_raw)
    best_clf = grid_fit.best_estimator_
    for score in score_params:
        print score,
        print " : ",
        print cross_val_score(best_clf, features_raw, target_raw, scoring=score, cv=3).mean()

Но есть ли лучший способ сделать это? Кажется, я делаю операции несколько раз для каждой модели. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 06 сентября 2018

GridSearchCV делает то, что вы дали. Вы дали f_beta в качестве оценщика, поэтому mean_test_score будет возвращать результаты этого f_beta для каждой комбинации параметров. Если вы хотите получить доступ к другим метрикам, вам нужно явно указать GridSearchCV.

GridSearchCV в более новых версиях scikit-learn, поддерживает мультиметрическую оценку. Таким образом, вы можете передать несколько типов бомбардиров в этом. Как за документацию :

scoring : строка, вызываемая, list / tuple, dict или None, по умолчанию: None

... ...

Для оценки нескольких метрик либо укажите список (уникальный) строки или диктовку с именами в качестве ключей и вызываемыми в качестве значений.

Смотрите этот пример здесь:

  • * ** тысяча двадцать-одина * -learn.org одна тысячи двадцать-два / стабильный / auto_examples / model_selection / plot_multi_metric_evaluation.html # обкатка gridsearchcv-используя-множественную-оценку-метрику * +1023 *

И измените свой scoring параметр на:

scoring = {'Accuracy': 'accuracy', 
           'FBeta': make_scorer(fbeta_score, beta = 0.5),
           # ... Add others here as you want.
           }

Но теперь, когда вы делаете это, вам также нужно изменить параметр refit. Поскольку различные метрики здесь будут давать разные типы оценок для комбинаций параметров, поэтому вам нужно решить, какой из них выбрать при повторной оценке. Так что выберите один из ключей из набора очков для refit

for clfr, param in zip(clfrs, params):
    grid_obj = GridSearchCV(clfr, param, cv=3, scoring=scorer, refit='FBeta')
    ...
    ...
...