Балансировка классов в обучающем датасете

Балансировка классов является критически важным этапом подготовки данных для обучения моделей машинного обучения. В контексте библиотеки ml5.js это особенно актуально при использовании классификаторов, таких как ImageClassifier или KNNClassifier, где дисбаланс может существенно влиять на точность предсказаний.

Проблема несбалансированных классов

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

Последствия несбалансированного датасета:

  • Смещение модели: предсказания будут смещены в сторону более частого класса.
  • Плохое качество обучения: редкие классы могут почти не учитываться, что снижает общую обобщающую способность модели.
  • Искажение метрик: стандартные метрики точности могут давать ложное впечатление о хорошем качестве модели.

Методы балансировки

  1. Увеличение данных (Data Augmentation)

    Этот метод особенно полезен для работы с изображениями. В ml5.js можно комбинировать увеличение данных на этапе подготовки изображений до их передачи в ImageClassifier. Ключевые техники:

    • Повороты и отражения: горизонтальное/вертикальное отражение, вращение на случайный угол.
    • Масштабирование и обрезка: случайное увеличение или уменьшение области изображения, обрезка с сохранением объекта.
    • Изменение цвета и яркости: небольшие вариации цвета, контраста, яркости.

    Увеличение данных помогает искусственно создать больше примеров для редких классов.

  2. Сэмплирование данных (Resampling)

    • Oversampling — увеличение числа примеров редких классов. В ml5.js можно вручную добавлять одни и те же примеры с небольшими модификациями или копировать их несколько раз.
    • Undersampling — сокращение числа примеров доминирующих классов. Используется осторожно, чтобы не потерять важную информацию.

    Пример в ml5.js с KNNClassifier:

    const knn = ml5.KNNClassifier();
    const features = ...; // вектор признаков для изображений
    
    // Добавление повторяющихся примеров для редкого класса
    for (let i = 0; i < 5; i++) {
        knn.addExample(features, 'редкий_класс');
    }
  3. Взвешивание классов (Class Weights)

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

  4. Генеративное расширение (Synthetic Data Generation)

    В случае изображений можно использовать генеративные модели (например, GAN) для создания новых примеров редких классов. В ml5.js доступен GAN модуль, позволяющий синтезировать изображения. Это помогает сбалансировать набор данных без прямого копирования существующих изображений.

Практические рекомендации

  • Мониторинг количества примеров: вести учет числа примеров каждого класса и проверять дисбаланс перед обучением.
  • Использование кросс-валидации: при несбалансированных данных важна проверка на нескольких разбиениях, чтобы убедиться, что редкие классы корректно распознаются.
  • Комбинация методов: на практике лучше сочетать увеличение данных и сэмплирование, чем полагаться на один метод.
  • Анализ метрик: использовать не только точность, но и метрики, чувствительные к дисбалансу — F1-score, precision, recall для каждого класса.

Балансировка в ml5.js: практическая схема

  1. Собрать все изображения и классифицировать их по классам.

  2. Определить число примеров каждого класса и выявить дисбаланс.

  3. Для редких классов выполнить:

    • Data augmentation
    • Повторение примеров (oversampling)
    • Генерация синтетических примеров при необходимости
  4. Для частых классов можно выполнить undersampling, если это не критично для объема данных.

  5. Добавить все примеры в классификатор ml5.js (ImageClassifier или KNNClassifier).

  6. Проверить результаты на валидационной выборке, анализируя F1-score для каждого класса.

Балансировка классов — неотъемлемая часть подготовки данных для ml5.js. Она позволяет создать устойчивую модель, которая одинаково хорошо распознаёт все категории, а не только наиболее представленные.