Як використовувати вихід GridSearch?


23

В даний час я працюю з Python та Scikit, які навчаються для цілей класифікації, і читаючи GridSearch, я подумав, що це чудовий спосіб оптимізації моїх параметрів оцінювача для отримання найкращих результатів.

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

  1. Розділити мої дані на навчання / тест.
  2. Використовуйте GridSearch з 5-кратною перехресною валідацією для підготовки та тестування моїх оцінювачів (Random Forest, Gradient Boost, SVC серед інших), щоб отримати найкращі оцінки з оптимальним поєднанням гіпер-параметрів.
  3. Потім я обчислюю показники для кожного з моїх оцінювачів, таких як Precision, Recall, FMeasure та Matthews Correlation Coefficient, використовуючи свій тестовий набір для прогнозування класифікацій та порівняння їх із фактичними мітками класів.

Саме на цьому етапі я бачу дивну поведінку і не знаю, як далі діяти. Чи беру я .best_estimator_ з GridSearch і використовую це як "оптимальний" вихід із пошуку в сітці та виконую прогнозування за допомогою цього оцінювача? Якщо я це роблю, я виявляю, що показники 3-го етапу зазвичай набагато нижчі, ніж якщо я просто тренуюсь на всіх даних тренувань і тестую на тестовому наборі. Або я просто приймаю вихідний об'єкт GridSearchCV як новий оцінювач ? Якщо я це роблю, я отримую кращі результати для моїх показників 3 стадії, але це здається дивним за допомогою об’єкта GridSearchCV замість призначеного класифікатора (наприклад, випадковий ліс) ...

EDIT: Отже, моє запитання полягає в тому, яка різниця між поверненим об’єктом GridSearchCV та атрибутом .best_estimator_? Яку з них слід використовувати для обчислення подальших показників? Чи можу я використовувати цей вихід як звичайний класифікатор (наприклад, використовуючи передбачення), або як я можу його використовувати?

Відповіді:


27

Вирішив піти і знайти відповіді, які б задовольнили моє запитання, і напишіть їх сюди для всіх, хто цікавиться.

Атрибут .best_estimator_ - це екземпляр зазначеного типу моделі, який має "найкраще" поєднання заданих параметрів з парам_гріду. Чи корисний цей примірник чи ні, залежить від того, чи встановлено параметр 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не вийде з найкращим класифікатором?
Poete Maudit

@PoeteMaudit Параметр refit вказує функції GridSearchCV взяти найкращі знайдені параметри та перевчити модель за допомогою цих параметрів у цілому наборі даних. Якщо refit = False, то best_estimator недоступний, згідно документації: scikit-learn.org/stable/modules/generated/…
Dan Carter

0

GridSearchCV дозволяє комбінувати оцінювач із преамбулою сітки пошуку для налаштування гіперпараметрів. Метод вибирає оптимальний параметр із пошуку в сітці та використовує його з оцінкою, обраним користувачем. GridSearchCV успадковує методи від класифікатора, тому так, ви можете використовувати .score, .predict і т.д. .. методами безпосередньо через інтерфейс GridSearchCV. Якщо ви бажаєте отримати найкращі гіпер-параметри, ідентифіковані за допомогою пошуку в сітці, ви можете використовувати .best_params_, і це поверне найкращий гіпер-параметр. Потім ви можете передавати цей гіпер-параметр своєму оціночку окремо.

Використання .predict безпосередньо дасть ті самі результати, що і отримання найкращого гіпер-параметра через .best_param_, а потім його використання у вашій моделі. Розуміючи підкреслені роботи пошуку в сітці, ми можемо зрозуміти, чому це так.


Пошук сітки

Ця методика використовується для пошуку оптимальних параметрів для використання з алгоритмом. Це НЕ ваги або модель, вони вивчаються за допомогою даних. Це, очевидно, досить заплутано, тому я буду розрізняти ці параметри, називаючи один гіперпараметр.

Гіперпараметри такі, як k у k-Найближчих сусідів (k-NN). k-NN вимагає від користувача вибору, якого сусіда слід врахувати під час обчислення відстані. Потім алгоритм налаштовує параметр, поріг, щоб побачити, чи потрапляє новий приклад до засвоєного розподілу, це робиться з даними.

Як ми обираємо k?

Деякі люди просто звертаються до рекомендацій, заснованих на минулих дослідженнях типу даних. Інші користуються пошуком сітки. Цей метод зможе найкращим чином визначити, який k є оптимальним для використання ваших даних.

Як це працює?

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

Це суперечить принципам невикористання тестових даних !!

ннн-1н

Вибране значення гіпер-параметра - це те, що досягає найвищої середньої продуктивності в n-складках. Після того, як ви будете задоволені своїм алгоритмом, ви можете протестувати його на тестовому наборі. Якщо ви переходите прямо до набору для тестування, тоді ви ризикуєте надмірно підійти.


Привіт Джа, це хороша відповідь, але я все ще не мудріший у відповіді на моє запитання. Я оновив назву питання та саме питання, щоб спробувати зробити щось більш зрозумілим.
Dan Carter

Напишіть власний пошук по сітці. Це буквально зробити масив, а потім додати цикл навколо своєї моделі. Потім в кінці вашого циклу записуйте отриману продуктивність в масив. Після того як ви пройшли всі можливі значення у вашій сітці, подивіться на масиви виступів і виберіть найкраще. Це оптимальне значення для вашого гіпер-параметра. Покладатися на вбудовані функції для основ дуже не рекомендується для наукових даних. Дані змінюються настільки дико, і найкраще, щоб ви мали контроль!
JahKnows

Це було б гарною пропозицією, якби у мене був лише один гіперпараметр для оптимізації, але якщо у мене є 4? 5? 4/5 разів вкладений цикл є некрасивим, і я не бачу необхідності винаходити колесо тут, це було б марною тратою часу, і це тому, що такі пакети існують.
Дан Картер

GridSearchCV дозволяє комбінувати оцінювач із налаштуванням GridSearchCV. Отже, це саме те, що ми обговорювали. Потім він вибирає оптимальний параметр і використовує його з обраним вами оцінювачем. GridSearchCV успадковує методи від класифікатора, так що так, ви можете використовувати методи .score, .predict тощо. Безпосередньо через інтерфейс GridSearchCV. Я не рекомендую робити це, однак, більш прості інструменти означають менший контроль. Для чогось такого простого, як пошук по сітці, просто кодуйте це самостійно.
JahKnows

1
Ця відповідь не стосується питання, що стосується використання GridSearchCV.
Гоббс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.