Низкая точность на тестовом наборе

Вопрос или проблема

У меня есть набор данных с 16 признаками и 32 метками классов, который демонстрирует следующее поведение:

  1. Классификация нейронной сетью: высокая точность на обучающих данных 100%, но низкая точность на тестовом наборе 3% (почти как случайная классификация). Если я сделаю сеть менее гибкой (уменьшу количество нейронов или скрытых слоев), тогда точность на обучающих и тестовых данных будет около 10%.

  2. Классификация с использованием градиентного бустинга деревьев: точно такое же поведение. Гибкая модель приводит к 100% точности на обучающих данных, но случайная точность на тестовом наборе. Если я уменьшаю гибкость, точность на обучающих и тестовых данных будет очень низкой, примерно 10%.

Какова может быть причина? Как я могу это исправить? Есть ли другие алгоритмы, которые я могу попробовать?

Вот распределение целевых данных:

введите описание изображения здесь

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

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

У вас, похоже, серьезное переобучение как у нейронной сети, так и у классификатора градиентного бустинга. Точность может не быть лучшей метрикой; есть несколько других метрик производительности, которые могут дать вам лучшее понимание того, как ваша модель на самом деле функционирует, таких как AUC, точность, полнота, Brier score и др. Попробуйте использовать эти метрики или другие для оценки вашей модели.

Существует несколько способов попытаться решить эту проблему, чтобы снизить переобучение и улучшить прогностическую производительность вашей модели:

  • Вы можете попробовать более простые модели, такие как логистическая регрессия или случайный лес, чтобы выяснить, как они себя проявят.
  • Вы можете попробовать регуляризацию, такую как L1, L2 или дроп-аут (для вашей нейронной сети).
  • Если вы этого еще не делаете, попробуйте масштабировать числовые признаки, кодировать категориальные признаки и делать другие предварительные обработки.
  • Эффективным методом для улучшения производительности ваших моделей было бы провести настройку гиперпараметров с использованием кросс-валидации. В Python RandomizedSearchCV будет хорошим выбором, например.
  • Вы можете попытаться получить больше данных. Обучение модели на большем количестве данных может помочь улучшить производительность.

Также рекомендуется выполнять все в потоке, чтобы избежать утечек данных. В Python потоки от sklearn или imblearn будут хорошим выбором.

Ответ или решение

Низкая точность на тестовом наборе данных: причины и пути решения

Проблема

Ваша ситуация с моделью машинного обучения, которая показывает 100% точности на обучающем наборе данных и 3% на тестовом, является классическим примером переобучения (overfitting). Это означает, что модель слишком хорошо подстраивается под тренировочные данные, но не может обобщать информацию на новых, незнакомых ей данных, что приводит к почти случайной классификации.

Возможные причины

  1. Сложность модели: Вы используете модели с высокой гибкостью (нейронные сети и градиентный бустинг), которые могут подстраиваться под шум в данных, если они не имеют достаточного количества примеров для каждого класса.

  2. Нехватка данных: При 32 классах и ограниченном количестве наблюдений для каждого класса возможно, что ваши обучающие данные недостаточны для надежного обучения более сложных моделей. Если классы сильно несбалансированы, это также может привести к плохой обобщающей способности моделей.

  3. Метрики оценки: Обычная точность может не давать полной картины, особенно в несбалансированных наборах данных. Возможно, другие метрики (такие как AUC, F1, точность, полнота) дадут лучшее представление о производительности.

Рекомендации по улучшению

Чтобы улучшить производительность модели и уменьшить переобучение, вы можете рассмотреть следующие стратегии:

  1. Простые модели: Начните с простых моделей, таких как логистическая регрессия или случайный лес (random forest). Они могут лучше адаптироваться к небольшому количеству данных и чаще всего дают хорошее качество.

  2. Регуляризация: Для нейронных сетей можно использовать методы регуляризации, такие как L1 и L2, или dropout для снижения переобучения. Это позволит модели более устойчиво обучаться, сохраняя при этом способность обобщения.

  3. Обработка данных: Проверьте, все ли признаки нормализованы, и правильно ли закодированы категориальные переменные. Неправильная обработка данных может существенно снизить качество модели.

  4. Гиперпараметрическая настройка: Используйте кросс-валидацию для настройки гиперпараметров модели. Это может помочь в нахождении привлекательного баланса между переобучением и недообучением. Например, используйте RandomizedSearchCV для моделей и убедитесь, что вы разбиваете данные на тренировочную и тестовую выборки корректным образом.

  5. Увеличение объема данных: Если возможно, попытайтесь собрать больше данных для обучения модели. Большее количество наблюдений особенно полезно для классов с недостаточным количеством примеров.

  6. Избегание утечек данных: Убедитесь, что вы правильно используете пайплайны (например, с помощью Pipeline из библиотеки sklearn), чтобы избежать утечек из тестовых данных во время обучения модели.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...