Classificação multiclasse e log_loss
Espero poder deixar isso claro com algumas linhas de código / explicação.
Eu tenho uma lista de textos de 16K, rotulados em mais de 30 classes diferentes que foram executadas por classificadores diferentes; minha previsão e a verdade fundamental correspondem em média a 94%.
Estou agora depois de medir algo extra (não tenho certeza do que devo medir em cima de um F1_score mínimo, pois ainda estou aprendendo) e me deparei com o log_loss do sklearn, cujo resultado eu entendo que varia entre 0 e 1. Quando contrariando minha previsão, no entanto, o resultado é 1,48xxx, que na verdade é mais alto.
Tentando entender o que estava errado.
Eu explorei o resultado de ComplementNB.predict_proba que é necessário para log_loss, e o valor corresponde ao de minha matriz de previsão.
Abaixo algum código:
from sklearn.metrics import log_loss
y = ... # This is my array of value that is my source of truth
labels = numpy.unique(y)
label_ary = [idx for gt in y for idx, lbl in enumerate(labels) if gt == lbl]
print(f'The log loss is {log_loss(label_ary, clf.predict_proba(X.toarray()))}')
Quer eu use label_ary ou y, em ambas as circunstâncias estou obtendo o mesmo valor, o que significa que alguma conversão dentro do log_loss já está acontecendo.
Não tenho certeza se estou interpretando mal os resultados ou o específico da função.
O que estou fazendo de errado? Obrigado
Respostas
Interpretabilidade de perda de log
A perda de log não está necessariamente entre o intervalo [0; 1] - espera apenas que a entrada esteja nesta faixa. Dê uma olhada neste exemplo:$$ y_{pred} = 0.1 \\ y_{true} = 1.0 \\ log\_loss = -(log(y_{pred}) * y_{true} + (1 - y_{true}) * log(1 - y_{pred})) = -(log(0.1) * 1.0) = 2.302 $$Em um caso extremo, a perda de log pode até ser igual ao infinito. Portanto, não há nada de errado com o código e também não há muitas coisas interessantes que você possa derivar do fato de que log_loss é menor ou maior que 1. O que você pode fazer com ele é o mesmo que com qualquer função de perda - compare-o com um modelo semelhante com diferentes hiperparâmetros e escolha aquele com a menor perda média como seu melhor modelo (um processo denominado otimização de hiperparâmetros).
Quando usar a perda e quando f1 marcar?
Digamos que você tenha um conjunto de dados e um problema de classificação que deseja resolver. Você sabe que pode criar um modelo estatístico que retorna as probabilidades de uma determinada classe. Você também sabe que existe (hipoteticamente) um algoritmo que classifica com base em algumas heurísticas que não requerem treinamento. Você gostaria de saber qual deles é o melhor para o seu problema. O que você faz, se simplificarmos um pouco, é:
- Divida seu conjunto de dados para treinar, validar e testar conjuntos.
- Use seu conjunto de trem para treinar o modelo
- Durante o treinamento, o modelo calcula a perda de treinamento e validação definida em cada época (se não estiver usando redes neurais profundas, você pode e deve usar a validação cruzada ).
- Plote a perda para o trem e o conjunto de validação e veja se o seu modelo é tendencioso (alta perda de trem e alta perda de validação) ou super ajustado (baixa perda de trem e alta perda de validação). Quanto menor a perda de validação, melhor.
- Faça 3. e 4. várias vezes para diferentes hiperparâmetros e selecione um com a menor perda de conjunto de validação. Agora você tem um modelo estatístico treinado.
- Agora use a pontuação f1 para comparar seu modelo com o algoritmo que você também conhece. Quanto maior a pontuação, melhor. Observe que, supondo que o algoritmo retorne classes e não probabilidades, se estiver incorreto para um exemplo, sua função de perda de log será igual ao infinito. É por isso que não podemos usar a perda de log como uma métrica para comparar esses dois métodos.
Em suma, você deve usar a perda como uma métrica durante o processo de treinamento / validação para otimizar parâmetros e hiperparâmetros e pontuação f1 (e possivelmente muitas outras métricas, por exemplo, Área sob a curva ) durante o processo de teste para selecionar o melhor método para resolver seu problema. Dessa forma, é possível comparar diferentes métodos para resolver o problema - mesmo aqueles que não usam aprendizado de máquina.