У меня есть набор данных из 140000 примеров и 30 функций, для которых я готовлю несколько классификаторов для двоичной классификации (SVM, логистическая регрессия, случайный лес и т. Д.)
Во многих случаях настройка гиперпараметра для всего набора данных с использованием поиска по сетке или случайному поиску слишком затратна по времени.
Я начал использовать следующую технику
- Подвыборка моего набора данных
- Используйте полученную дробь для настройки гиперпараметров на
- Используйте полученные параметры для обучения модели с использованием всего набора данных
Для оценки каждого набора параметров на втором шаге я использую 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.
Мои опасения:
Я ограничиваю свою точность классификации? Избегаю ли я использовать все возможности прогнозирования, которые может предложить мой набор данных, настраивая только на подмножество? Если такой вред производительности происходит, это как-то ограничено каким-то фактором?