У меня есть проблема бинарной классификации, для которой я выбрал 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()
Но есть ли лучший способ сделать это? Кажется, я делаю операции несколько раз для каждой модели. Любая помощь приветствуется.