У мене є набір даних 140000 прикладів і 30 функцій, для яких я навчаю декілька класифікаторів для двійкової класифікації (SVM, Logistic Regression, Random Forest тощо)
У багатьох випадках налаштування гіперпараметрів у всьому наборі даних за допомогою Grid або Random пошуку занадто дорого за часом.
Я почав використовувати наступну техніку
- Sub вибірки мого набору даних
- Використовуйте отриману фракцію, щоб настроїти гіперпараметри
- Використовуйте отримані параметри для підготовки моделі, використовуючи весь набір даних
Для оцінки кожного набору параметрів на другому кроці я використовую sklearn
s GridSearchCV
cv = 10. Для оцінки кінцевої моделі, яку я створюю на третьому кроці, використовую sklearn
s cross_val_predict
. У цьому сенсі я оцінюю свої моделі, залишаючи 10% відсотків даних, тренуюсь на решті і вимірюю точність прогнозування на 10%, ітеративно 10 разів, а потім беру в середньому бали.
Мене хвилювало те, що точність прогнозування, яку я отримую під час навчання на всьому наборі даних, насправді близька до оцінки, яку я отримую, коли налаштовує параметри для найкращого набору параметрів (кожен тестований набір параметрів видає бал, отриманий в результаті усереднення 10- результати перевірки складного перехресного перегляду).
У більшості випадків точність, яка cross_val_predict
вимірюється за допомогою усіх навчальних прикладів (цілий набір даних), трохи вище, ніж повертається оцінка найкращих параметрів.
Для ілюстрації цього є оцінка набору параметрів (на меншому наборі даних, ніж те, що я описав вище, але ефект такий же)
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
А ось усереднені бали (від cross_val_predict
), які я отримав під час тренінгу на цілому наборі даних, використовуючи найкращі параметри
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
Як ви бачите, тренування на всьому наборі даних покращує результати. Я також підтвердив, що погано налаштована модель (наприклад, використання значень за замовчуванням або випадкових значень для C
та gamma
) призводить до набагато гіршої точності прогнозування.
В цілому, я вважаю, що налаштування гіперпараметрів на підмножині не є ідеальним, але потенційно може призвести до відносно хороших результатів, не вимагаючи занадто довго чекати. Я, наприклад, перед тим, як використовувати цей підхід, використовував optunity
пакет для настройки гіперпараметра на весь набір даних. Ця процедура зайняла б 3-5 днів, і вона дала б результати, які або мали дуже гарну точність, або дуже хороший відклик, але не обидва, тому хоча для кожного класу точність або відкликання була дійсно високою (вище, ніж будь-який інший мій інший класифікатори досягли) вимірювання f1 було дійсно низьким. Навпаки, використання пізнішого підходу призводить до декількох годин тренувань та кращого вимірювання f1.
Мої проблеми:
Чи слід обмежувати точність класифікації? Чи уникаю я використовувати всю потужність передбачення, яку може запропонувати мій набір даних, налаштовуючи лише на підмножину? Якщо така шкода ефективності відбувається, чи якимось чином обмежений якимось фактором?