Как использовать вывод GridSearch?

23

В настоящее время я работаю с Python и Scikit для целей классификации, и немного изучаю GridSearch. Я подумал, что это отличный способ оптимизировать параметры моей оценки, чтобы получить наилучшие результаты.

Моя методология такая:

  1. Разделить мои данные на обучение / тестирование.
  2. Используйте GridSearch с 5Fold Cross валидацией для обучения и проверки моих оценок (случайный лес, повышение градиента, SVC и др.), Чтобы получить лучшие оценки с оптимальной комбинацией гиперпараметров.
  3. Затем я вычисляю метрики для каждого из моих оценщиков, таких как Precision, Recall, FMeasure и Matthews Correlation Coe factor, используя свой набор тестов для прогнозирования классификаций и сравнения их с фактическими метками классов.

Именно на этом этапе я вижу странное поведение и не знаю, как поступить. Должен ли я взять .best_estimator_ из GridSearch и использовать его в качестве «оптимального» результата поиска по сетке , и выполнить прогнозирование с помощью этого оценщика? Если я сделаю это, то обнаружу, что показатели этапа 3 обычно намного ниже, чем если бы я просто тренировался по всем данным обучения и тестировал на тестовом наборе. Или мне просто взять выходной объект GridSearchCV в качестве нового оценщика ? Если я сделаю это, я получу лучшие оценки для моих показателей 3-го этапа, но это кажется странным, если использовать объект GridSearchCV вместо намеченного классификатора (например, случайный лес) ...

РЕДАКТИРОВАТЬ: Итак, мой вопрос, в чем разница между возвращенным объектом GridSearchCV и атрибутом .best_estimator_? Какой из них я должен использовать для расчета дальнейших показателей? Могу ли я использовать этот вывод как обычный классификатор (например, с использованием предиката), или как мне его использовать?

Дэн Картер
источник

Ответы:

27

Решил уйти и найти ответы, которые удовлетворили бы мой вопрос, и написать их здесь для всех, кто интересуется.

Атрибут .best_estimator_ является экземпляром указанного типа модели, который имеет «наилучшую» комбинацию заданных параметров из param_grid. Полезность этого экземпляра зависит от того, задан ли для параметра refit значение True (по умолчанию). Например:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

Вернет RandomForestClassifier. Это все довольно ясно из документации . Что не ясно из документации, так это то, почему большинство примеров специально не используют .best_estimator_ и вместо этого делают это:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

Этот второй подход возвращает экземпляр GridSearchCV со всеми наворотами GridSearchCV, такими как .best_estimator_, .best_params и т. Д., Который сам по себе может использоваться как обученный классификатор, потому что:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

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

Дэн Картер
источник
Спасибо за ваш пост @Dan, это очень полезно. Я хотел попросить у вас одного разъяснения. В последнем случае, если у меня есть, refit=Falseто clf.fitне будет сделано с лучшим классификатором?
Поэт Модит
@PoeteMaudit Параметр refit сообщает функции GridSearchCV, чтобы она выбрала лучшие из найденных параметров и переобучила модель, используя эти параметры во всем наборе данных. Если refit = False, то best_estimator недоступен, согласно документации: scikit-learn.org/stable/modules/generated/…
Дэн Картер,
0

GridSearchCV позволяет комбинировать оценщик с преамбулой поиска в сетке для настройки гиперпараметров. Метод выбирает оптимальный параметр из сетки поиска и использует его с оценкой, выбранной пользователем. GridSearchCV наследует методы от классификатора, поэтому да, вы можете использовать методы .score, .predict и т. Д. Непосредственно через интерфейс GridSearchCV. Если вы хотите извлечь лучшие гиперпараметры, определенные в поиске по сетке, вы можете использовать .best_params_, и это вернет лучший гиперпараметр. Затем вы можете передать этот гиперпараметр своему оценщику отдельно.

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


Grid Search

Этот метод используется, чтобы найти оптимальные параметры для использования с алгоритмом. Это НЕ веса или модель, они изучаются с использованием данных. Это, очевидно, довольно запутанно, поэтому я буду различать эти параметры, вызывая один гиперпараметр.

Гиперпараметры похожи на k в k-ближайших соседях (k-NN). k-NN требует от пользователя выбора соседа, который необходимо учитывать при расчете расстояния. Затем алгоритм настраивает параметр, порог, чтобы увидеть, попадает ли новый пример в изученное распределение, это делается с данными.

Как мы выбираем k?

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

Как это работает?

[1,2,3,,,,,10]

Это противоречит принципам не использовать тестовые данные!

NNN-1N

Выбранное значение гиперпараметра - это то, которое достигает наивысшей средней производительности по n-кратным показателям. Как только вы довольны своим алгоритмом, вы можете проверить его на тестовом наборе. Если вы идете прямо к испытательному комплексу, то вы рискуете перегрузить.

JahKnows
источник
Привет, Джа, это хороший ответ, но я все еще не знаю, как ответить на мой вопрос. Я обновил название вопроса и сам вопрос, чтобы попытаться прояснить ситуацию.
Дэн Картер
Напишите свой собственный поиск по сетке. Это в буквальном смысле сделать массив, а затем добавить цикл для вашей модели. Затем в конце цикла for запишите результирующую производительность в массив. После того, как вы прошли все возможные значения в вашей сетке, посмотрите на массивы выступлений и выберите лучшее. Это оптимальное значение для вашего гиперпараметра. Полагаться на встроенные функции для основ настоятельно не рекомендуется для науки о данных. Данные настолько разнятся, и вам лучше иметь контроль!
JahKnows
Это было бы хорошим предложением, если бы у меня был только один гиперпараметр для оптимизации, но если у меня было 4? 5? Вложенный в цикл цикл 4/5 раз уродлив, и я не вижу необходимости изобретать колесо здесь, это было бы пустой тратой времени, и именно поэтому существуют такие пакеты.
Дэн Картер
GridSearchCV позволяет объединить оценщик с настройкой GridSearchCV. Так что это именно то, что мы только что обсудили. Затем он выбирает оптимальный параметр и использует его с выбранной оценщиком. GridSearchCV наследует методы от классификатора, поэтому да, вы можете использовать методы .score, .predict и т. Д. Непосредственно через интерфейс GridSearchCV. Я не рекомендую делать это, однако, более простые инструменты означают меньший контроль. Для чего-то такого простого, как поиск по сетке, просто закодируйте его самостоятельно.
JahKnows
1
Этот ответ не касается вопроса, касающегося использования GridSearchCV.
Гоббс