Как рассчитывается атрибут best_score_ для RandomizedSearchCV? - PullRequest
0 голосов
/ 01 апреля 2020

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

Я просто запустил RandomizedSearchCV и получил best_score_=0.05325203252032521. Затем я попытался вычислить это значение вручную на основе информации, содержащейся в объекте RandomizedSearchCV. То, что я сделал, было:

print(best_model_idx)

results_in_splits = []

for k, v in cv.cv_results_.items():
    if 'split' in k:
        print('\t->', k)
        results_in_splits.append(v[best_model_idx])
    else:
        print(k)

print('\n')
print(sum(results_in_splits) / len(results_in_splits))
print(cv.best_score_)

Это дало следующий вывод:

0
mean_fit_time
std_fit_time
mean_score_time
std_score_time
param_subsample
param_n_estimators
param_min_child_weight
param_max_depth
param_gamma
param_colsample_bytree
params
    -> split0_test_score
    -> split1_test_score
    -> split2_test_score
    -> split3_test_score
    -> split4_test_score
    -> split5_test_score
    -> split6_test_score
    -> split7_test_score
    -> split8_test_score
    -> split9_test_score
    -> split10_test_score
    -> split11_test_score
    -> split12_test_score
mean_test_score
std_test_score
rank_test_score

Как вы можете видеть, мы получаем другой результат (0,046 против 0,053), а в некоторых других экспериментах этот изменения еще более драматичны c.

Может кто-нибудь помочь мне разобраться? Буду очень признателен!

Спасибо.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

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

Затем проверяет наивысшую среднюю перекрестную оценку и возвращает лучшие параметры и лучший результат для вашей модели.

В итоге:

  • Он пытается N различную комбинацию параметров в вашем наборе данных.
  • Для каждого параметра комбинация, она обучает модель с перекрестной проверкой.
  • Затем она берет среднее значение каждого сгиба при перекрестной проверке, а затем присваивает этот показатель соответствующей комбинации параметров.
  • Затем просматривает все результаты и выбирает самый высокий.
  • Наконец, возвращается, лучший результат, лучшая модель, лучшие параметры и т. д. c ..
0 голосов
/ 01 апреля 2020

ОБНОВЛЕНИЕ : В соответствии с комментарием ОП ниже, обновление scikit-learn с v0.21.3 до v0.22.2 решило проблему.


Как я уже упоминал в комментариях, Я не смог воспроизвести вашу проблему, либо с данными iris, либо с фиктивными данными из нескольких конфигураций make_classification.

Выполнение Scikit-learn. весь сценарий (код + данные), который вы разместили на Pastebin , не меняет этого; Вот последние строки вашего собственного кода:

results_in_splits = []

for k, v in cv.cv_results_.items():
    if 'split' in k:
        print('\t->', k)
        results_in_splits.append(v[best_model_idx])
    else:
        print(k)

print('\n')
print(sum(results_in_splits) / len(results_in_splits))
print(cv.best_score_)

вывод:

mean_fit_time
std_fit_time
mean_score_time
std_score_time
param_subsample
param_n_estimators
param_min_child_weight
param_max_depth
param_gamma
param_colsample_bytree
params
    -> split0_test_score
    -> split1_test_score
    -> split2_test_score
    -> split3_test_score
    -> split4_test_score
    -> split5_test_score
    -> split6_test_score
    -> split7_test_score
    -> split8_test_score
    -> split9_test_score
    -> split10_test_score
    -> split11_test_score
    -> split12_test_score
mean_test_score
std_test_score
rank_test_score


0.8926320979964705
0.8926320979964705

т.е., очевидно, две оценки идентичны, как и должно быть.

Почти идентичные оценки в ваших CV-расщеплениях, которые обсуждались в комментариях к другому ответу здесь, также не являются ошибкой или чем-то еще, просто артефактом неудачной ситуации: слишком маленький набор данных (678 выборок) в сочетании со слишком большим количеством разбивок CV ( 13) приводит к тому, что ваши проверочные образцы составляют только 13-14 для каждого разделения; Любые статистические данные c, рассчитанные для стольких выборок, являются ложными и на них не следует полагаться.

Но это последнее наблюдение на самом деле не имеет отношения к вашему основному вопросу: то, что вы сообщаете, не воспроизводимо в различных ситуациях, включая сценарий и данные, предоставленные вами.

...