Eu tenho uma rede neural configurada para prever algo em que a variável de saída é ordinal. Descreverei abaixo usando três saídas possíveis A <B <C.
É bastante óbvio como usar uma rede neural para gerar dados categóricos: a saída é apenas um softmax da última camada (geralmente totalmente conectada), uma por categoria, e a categoria prevista é a que possui o maior valor de saída (isso é o padrão em muitos modelos populares). Eu tenho usado a mesma configuração para valores ordinais. No entanto, nesse caso, as saídas geralmente não fazem sentido; por exemplo, as saídas de rede para A e C são altas, mas B é baixa: isso não é plausível para valores ordinais.
Eu tenho uma idéia para isso, que é calcular a perda com base na comparação das saídas com 1 0 0 para A, 1 1 0 para B e 1 1 1 para C. Os limites exatos podem ser ajustados posteriormente usando outro classificador (por exemplo, Bayesiano). ), mas isso parece capturar a ideia essencial de uma ordem de entradas, sem prescrever nenhuma escala de intervalo específica.
Qual é a maneira padrão de resolver esse problema? Existe alguma pesquisa ou referência que descreva os prós e contras de diferentes abordagens?
fonte
Respostas:
Acredito que o que a maioria das pessoas faz é simplesmente tratar a classificação ordinal como uma classificação multi-classe genérica. Portanto, se eles tiverem classes , terão saídas K e simplesmente usarão uma função de ativação sigmóide (não a softmax obviamente) e a entropia cruzada binária como perda.K K
Mas algumas pessoas conseguiram inventar uma codificação inteligente para suas classes ordinais (consulte esta resposta do stackoverflow ). É uma espécie de codificação one-hot,
classe 1 é representada como [0 0 0 0 ...]
classe 2 é representada como [1 0 0 0 ...]
classe 3 é representada como [1 1 0 0 ...]
ou seja, cada neurónio é prever a probabilidade . Você ainda precisa usar um sigmóide como função de ativação, mas acho que isso ajuda a rede a entender alguma continuidade entre as classes, não sei. Depois, você faz um pós-processamento ( ) para converter a saída binária em suas classes.P( y^< k )
np.sum
Essa estratégia se assemelha ao conjunto de Frank e Hall , e acho que esta é a primeira publicação de tais.
fonte