Почему мой классификатор случайных лесов работает лучше по данным тестирования и проверки, чем по данным обучения? - PullRequest
1 голос
/ 26 февраля 2020

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

Мой вопрос

Я делаю что-то явно не так, и есть ли у вас какие-либо советы о том, как мне улучшить свой подход, потому что я просто не могу поверить, что я делаю это правильно, когда моя модель предсказывает значительно лучшие результаты по невидимым данным, чем по данным обучения!

Данные

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

Обычно это означает, что я в конечном итоге с обучающим набором данных из примерно 100 тыс. строк и 20 объектов (ранее я изучал выбор объектов и нашел набор из 7 функций, которые, кажется, работают лучше всего, поэтому я использовал их в последнее время). Мой набор прогнозов обычно содержит около 50 тыс. Строк.

Мой набор данных сильно несбалансирован (примерно 2% частоты появления целевой функции), поэтому я использую методы передискретизации - подробнее об этом ниже.

Метод

Я много искал в Интернете, и это привело меня к следующему подходу:

  • Использование масштабируемых (непрерывных) функций в данных обучения и стандартизировать их (в настоящее время с помощью sklearn StandardScaler)
  • Возьмите категориальные функции и закодируйте их в отдельные двоичные столбцы (в горячем виде), используя функцию Pandas get_dummies
  • Удалите 10% обучающих данных в сформировать набор проверки (в настоящее время я использую случайное начальное число в этом процессе для сопоставимости, в то время как я изменяю разные вещи, такие как гиперпараметры в модели)
  • Возьмите оставшиеся 90% обучающих данных и выполните поиск по сетке через несколько параметров RandomForestClassifier () (в настоящее время min_samples_split, max_depth, n_estimators и max_ функции)
  • Внутри каждой комбинации гиперпараметров из сетки я выполняю проверку kfold с 5-кратным сгибом и используя случайное состояние
  • В каждом сгибе я перебираю свой класс меньшинства только для обучающих данных (иногда используя imbalanced- изучите RandomOverSampler () и иногда используя SMOTE () из того же пакета), обучите модель на данных обучения, а затем примените модель к k-й кратности и запишите метрики производительности (точность, отзыв, F1 и AU C)
  • Как только я прошел через 5 сгибов по каждой комбинации гиперпараметров, я нахожу лучший результат F1 (и лучшую точность, если две комбинации связаны на счет F1) и переобучаю случайный лес на всех 90% тренировочных данных, используя эти гиперпараметры. , На этом шаге я использую ту же технику передискретизации, что и в процессе kfold
  • Затем я использую эту модель для прогнозирования 10% обучающих данных, которые я отложил ранее в качестве проверочного набора, оценивая то же самое показатели, как указано выше
  • Наконец, у меня есть набор тестов, который фактически основан на данных другого месяца, к которым я применяю уже обученную модель и оцениваю те же показатели

Результат

В данный момент я обнаружил, что мой тренировочный набор достигает показателя F1 около 30%, набор проверки достоверно немного выше, чем этот, около 36% (в основном из-за лучшая точность, чем у обучающих данных, например, 60% против 30%), а затем тестовый набор получает оценку F1 от 45% до 50%, что опять-таки определяется лучшей точностью (около 65%)

Примечания

Пожалуйста, спросите о любых деталях, которые я не упомянул; Я застрял в этом в течение нескольких недель, и поэтому, несомненно, пропустил некоторые детали

  • Я кратко рассмотрел (не систематизированный c анализ) стабильность метрик между сгибами при проверке kfold, и кажется, что они не сильно меняются, поэтому я вполне доволен стабильность модели здесь
  • Я на самом деле выполняю поиск по сетке, а не использую Python конвейер, потому что, как ни старайся, я не смог заставить функцию Pipeline imbalanced-learn работать с функциями передискретизации и поэтому я запускаю al oop с комбинациями гиперпараметров, но я уверен, что это не влияет на результаты, о которых я говорил выше, неблагоприятным образом
  • Когда я применяю окончательную модель к прогнозу данные (и получаю оценку F1 около 45%). Я также применяю их обратно к самим тренировочным данным из интереса и получаю оценки F1 около 90% - 100%. Я предполагаю, что этого следовало ожидать, поскольку модель обучена и предсказывает почти те же самые данные (кроме 10% -ного проверочного набора)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...