Вопрос или проблема
В своем стремлении узнать немного больше о науке о данных, я извлек из интернета некоторые размеченные данные и пытаюсь классифицировать примеры на один из трех классов. Я сталкиваюсь с проблемой, что независимо от того, какую модель я пробую, моя валидационная потеря выравнивается, в то время как моя обучающая потеря продолжает уменьшаться (см. график ниже).
Несколько потенциально важных замечаний:
- У меня есть около 15,000 (3,000) обучающих (валидационных) примеров.
- Метки примерно равномерно распределены и стратифицированы для обучающего и валидационного наборов (класс 1: 35%, класс 2: 34%, класс 3: 31%).
- У меня есть 73 признака, состоящих из: 10 числовых признаков, 8 категориальных признаков, которые преобразуются в 43 одноразовых кодированных признака, и 20-мерное текстовое встраивание.
- Я получаю аналогичные результаты, если применяю PCA к этим 73 признакам (ещё 99% дисперсии сокращает число признаков до 22).
- График, показанный здесь, использует XGBoost.XGBClassifier с метрикой ‘mlogloss’, с следующими параметрами после RandomizedSearchCV: ‘alpha’: 7.13, ‘lambda’: 5.46, ‘learning_rate’: 0.11, ‘max_depth’: 7, ‘n_estimators’: 221
- Я получаю аналогичные результаты, используя базовую нейронную сеть с плотными и Dropout слоями.
- Лучшая модель, которой я достиг, получает только около 66% точности на моем валидационном наборе данных при классификации примеров (и 99% на моих обучающих примерах).
- Признаю, что мое текстовое встраивание может быть не великолепным (используя gensim’s fasttext), но это также наиболее важный признак, когда я использую функцию plot_importance Xxgboost. Однако я сталкивался с аналогичной проблемой даже до того, как добавил текстовое встраивание.
Это совершенно нормально и отражает фундаментальное явление в науке о данных: переобучение. Когда валидационная потеря перестает уменьшаться, в то время как обучающая потеря продолжает уменьшаться, ваша модель начинает переобучаться. Это означает, что модель начинает слишком сильно привязываться к обучающему набору и теряет свою способность к обобщению. Например, модель может научиться распознавать шум, присутствующий в обучающем наборе, как если бы это был релевантный признак.
Когда вы обучаете свою модель, вы должны следить за валидационной потерей и останавливать обучение, когда валидационная потеря перестает существенно уменьшаться. Также именно за валидационной потерей следует следить при настройке гиперпараметров или сравнении различных стратегий предварительной обработки.
Наблюдаемые из графика:
(1) Обе потери высоки, что указывает на то, что модель не многому научилась из данных.
Возможные причины:
(1) модель либо слишком большая, либо маленькая (2) плохое качество данных (например, слишком сложные данные, слишком много шума, данные мусорного качества) (3) обучение и тестирование имеют разные распределения.
Я бы начал с обучения на большем количестве эпох, чтобы увидеть, не выравнивается ли обучающая потеря на высоком уровне или нет. (A) Если обучающая потеря остается высокой, это указывает на проблему смеси высокого смещения и дисперсии => Попробуйте увеличить сложность модели, что может снизить валидационную потерю. Затем улучшите качество признаков для уменьшения обеих потерь. (B) Если обучающая потеря низкая, это переобучение => Попробуйте уменьшить размер модели и повысить качество данных. (В глубинном обучении я видел сценарии, когда обучающая потеря сначала падает, в то время как валидационная остается на одном уровне в течение многих эпох, прежде чем начнет уменьшаться. Однако я не видел такого образца в моделях XGBoost.)
Инженерия признаков:
Я бы поэкспериментировал с использованием DNN для встраивания данных и XGBoost для остального (параллельно или стек). И провел бы больше работы с признаками в табличных данных.
Надеюсь, это поможет.
Ответ или решение
Ваша проблема, когда валидационная потеря перестает уменьшаться, а тренировочная потеря продолжает снижаться, часто встречается в области машинного обучения и указывает на феномен, известный как переобучение (overfitting). Разберем эту проблему с использованием TEA (Theory, Example, Application) подхода.
Теория
Переобучение происходит, когда модель слишком хорошо обучается на тренировочных данных, включая их шум и специфические свойства, которые не обязательно присутствуют в данных для валидации или в новых примерах, которые модель должна будет классифицировать в будущем. Это приводит к снижению обобщающей способности модели, ведь она начинает "запоминать" специфические детали тренировочного набора данных без адекватного понимания их общей структуры.
Пример
В вашем случае, вы пытаетесь классифицировать данные на три класса. На графике видно, что ваша тренировочная потеря продолжает уменьшаться, тогда как валидационная потеря остается на одном уровне. Это явный признак того, что ваша модель не способна эффективно обобщать на новые данные, и концентрация идет на тренировочные примеры. Поскольку даже разные модели (XGBoost и простая нейронная сеть) показывают схожую картину, это указывает на проблемы либо с моделью, либо с данными.
Применение
-
Анализ модели: Возможно, ваша модель либо слишком сложна и склонна к переобучению, либо слишком проста и не способна учесть все возможные сценарии данных. Попробуйте сбалансировать сложность вашей модели, изменяя ее гиперпараметры, такие как глубина деревьев в XGBoost или количество слоев в нейронной сети.
-
Качество данных: Проверьте качество данных. Возможна, ваши данные содержат шум или незначимые переменные, которые мешают обучению. Проведите более детальное исследование данных, исключите выбросы, или используйте методы очистки данных и нормализации.
-
Переосмысление особенностей: Вы упомянули о важных текстовых эмбеддингах. Попробуйте улучшить их качество, используя более мощные модели эмбединга, такие как BERT. Кроме того, аналитика важности функций в XGBoost может помочь определить, какие из них действительно содействуют обучению модели. Это может стать основой для более продвинутого инженерии признаков.
-
Унификация распределений: Проверьте, чтобы распределения данных в тренировочном и валидационном наборах были однотипными и не создавали удивительных моментов для модели.
-
Использование методов регуляризации: Для борьбы с переобучением применяйте методы регуляризации. В XGBoost это может быть альфа или лямбда параметры. В нейронных сетях – Dropout или L2-регуляризация.
Эти шаги должны помочь вам справиться с уменьшением валидационной потери и повысить обобщающую способность вашей модели.