У меня есть нейронная сеть, настроенная для предсказания чего-то, где выходная переменная является порядковой. Я опишу ниже, используя три возможных выхода A <B <C.
Совершенно очевидно, как использовать нейронную сеть для вывода категориальных данных: выходные данные - это просто максимальное значение последнего (обычно полностью подключенного) слоя, по одному на категорию, а прогнозируемая категория - та, которая имеет наибольшее выходное значение (это по умолчанию во многих популярных моделях). Я использовал ту же настройку для порядковых значений. Однако в этом случае выходы часто не имеют смысла, например, сетевые выходы для A и C высоки, а B низки: это невозможно для порядковых значений.
У меня есть одна идея для этого, которая заключается в том, чтобы рассчитать потери на основе сравнения выходных данных с 1 0 0 для A, 1 1 0 для B и 1 1 1 для C. Точные пороговые значения можно настроить позже, используя другой классификатор (например, байесовский ) но это, кажется, отражает основную идею упорядочения входных данных без указания какой-либо конкретной шкалы интервалов.
Каков стандартный способ решения этой проблемы? Есть ли какие-либо исследования или ссылки, которые описывают плюсы и минусы различных подходов?
источник
Ответы:
Я полагаю, что большинство людей просто рассматривает порядковую классификацию как общую многоклассовую классификацию. Таким образом, если у них есть классов, у них будет выходов, и они просто используют функцию активации сигмоида (очевидно, не softmax) и двоичную кросс-энтропию в качестве потерь.К К
Но некоторым людям удалось изобрести умную кодировку для ваших порядковых классов (см. Этот ответ на стекопотоки ). Это своего рода горячая кодировка,
класс 1 представлен как [0 0 0 0 ...]
класс 2 представлен как [1 0 0 0 ...]
класс 3 представлен как [1 1 0 0 ...]
т.е. каждый нейрон предсказывает вероятность . Вы все еще должны использовать сигмоид в качестве функции активации, но я думаю, что это помогает сети понять некоторую преемственность между классами, я не знаю. После этого вы выполняете постобработку ( ) для преобразования двоичного вывода в ваши классы.п( у^< к )
np.sum
Эта стратегия напоминает ансамбль Фрэнка и Холла , и я думаю, что это первая публикация такого рода.
источник