Много классовая классификация с дискретными выходами: какую функцию потерь и активации выбрать?

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

Я работаю над задачей многоклассовой классификации с использованием моделей Keras Sequential. В моем наборе данных выходной класс имеет одно из следующих значений: (1, 2, 3, 4, 5).

Да, я уже пробовал использовать one-hot-кодирование для вывода и применять categorical_crossentropy в качестве функции потерь, а также softmax на выходном слое.

Тем не менее, я не считаю, что softmax и категориальная кросс-энтропия — это правильный выбор в моем случае. В моем наборе данных выходные классы имеют определенную “дискретность” (или шкалу). Класс 1 является “худшим”, а класс 5 — “лучшим”.

Допустим, если на конкретный вход модель предсказывает 2, а истинный класс — 1, это гораздо лучшее предсказание, чем когда модель предсказывает класс 5, а истинный класс — 1.

Мне бы хотелось, чтобы функция потерь учитывала эти “незначительные ошибки” и не обрабатывала все ошибки одинаково.

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

ОБНОВЛЕНИЕ: Я теперь попробовал использовать mse в качестве функции потерь и заменил мой выходной слой на следующий:

model.add(Dense(1, activation='linear'))

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

Вы могли бы попробовать функцию потерь Quadratic Kappa Metric. Это краткое описание того, что она делает.

Взвешенный Kappa — это метрика, используемая для расчета степени
сходства между прогнозами и реальными значениями. Идеальный балл 1.0
присваивается, когда прогнозы и реальные значения совпадают. В то время как
минимально возможный балл -1 присуждается, когда прогнозы
наиболее далеки от реальных значений. В нашем случае, если считать, что все реальные значения равны 0, а все прогнозы равны 4, это приведет к оценке QWKP -1.
Цель состоит в том, чтобы максимально приблизиться к 1. Обычно балл 0.6+
считается действительно хорошим результатом.

Подробное объяснение можно найти здесь: https://www.kaggle.com/aroraaman/quadratic-kappa-metric-explained-in-5-simple-steps

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

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

1. Обоснование выбора метода

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

2. Альтернативные функции потерь

a. MSE (Mean Squared Error)

Использование mean squared error (MSE) в качестве функции потерь, как вы уже попробовали, может оказаться хорошим началом. Это позволяет модели воспринимать «ближе» предсказанные значения к реальным более благожелательно. Однако MSE может стремиться к некоторым проблемам, связанным с предсказанием классов, которые находятся далеко от реальных значений.

b. Кастомная функция потерь

Вы также можете рассмотреть возможность создания кастомной функции потерь, которая будет более явно учитывать разницу между предсказанным и истинным классом:

import keras.backend as K

def custom_loss(y_true, y_pred):
    return K.mean(K.square(y_true - y_pred) * K.constant([1, 0.5, 0.2, 0.1, 0.05]))  # Применение веса к ошибкам

Здесь можно установить веса для разных классов в зависимости от важности, что позволит вашему обучению более эффективно разбираться с «малозначительными» ошибками.

c. Квадратичная каппа

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

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

3. Активация на выходном слое

Для окончательного слоя выходов:

  • Вам подойдет использование линейной активации (activation='linear') для модели, которая использует MSE или кастомную функцию потерь.

В этом случае выходной слой у вас может выглядеть так:

model.add(Dense(1, activation='linear'))

Заключение

Подводя итог, стоит рассмотреть различные подходы в зависимости от ваших нужд:

  1. Используйте MSE с линейной активацией для простоты.
  2. Попробуйте кастомную функцию потерь, чтобы акцентироваться на важности разных классов.
  3. Рассмотрите квадратичную каппу для более точной оценки согласия между предсказанными и фактическими классами.

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

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

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