Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

classification_report X confusion_matrix: os valores não batem? (machine learning com python)

Modelo: regressão logística com sklearn.

Resolvi comparar os resultados mostrados no classification_report, calculando-os utilizando a matriz de confusão mas aparentemente os resultados não batem:

classification_report

precision    recall  f1-score   support

          0       0.54      0.94      0.68     56000
          1       0.96      0.62      0.75    119341

avg / total       0.82      0.72      0.73    175341

matriz de confusão gerada:

[[52624  3376]
 [45307 74034]]

Meus cálculos:

Quanto em média o modelo acerta (acurácia)?

 (TP + TN)/total
(74034 + 52624)/(52624 + 74034 +45307 + 74034)*100 = 51%

Qual a precisão do modelo (razão entre o número de TP e e a soma dos TP e FP)?

74034/(74034 + 3376)*100 = 95%

Qual o Recall R do modelo (razão entre o número de TP e a soma de TP e FN)

74034/(74034 + 45307)*100 = 62%

Como podemos ver, recall e precision não batem. O que está errado? Como interpretar os resultados? O que representam f1-score e support?

4 respostas

Bom dia Edson,

Eu arriscaria dizer que o detalhe do cálculo que o report faz está aqui:

The reported averages are a prevalence-weighted macro-average across classes (equivalent to precision_recall_fscore_support with average='weighted').

Olhando a documentação do cálculo dos dois números através da precision_recall_fscore_support:

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html#sklearn.metrics.precision_recall_fscore_support

Voce encontra que a fórmula é a mesma que voce deu, o que me parece dar a entender que a única diferença é como ele calculou a média, faz sentido?

[]s

@Guilherme Silveira: Obrigado! Vou analisar com mais calma!

@Guilherme Silveira: achei um pouco confuso. Poderia, por favor, esclarecer um pouco mais?

solução!

Bom dia Edson,

Se for essa a diferença, o motivo seria a existencia de diversas médias possíveis. O precision_recall_fscore_support suporta um parametro chamado average que pode definir qual voce quiser:

average : string, [None (default), ‘binary’, ‘micro’, ‘macro’, ‘samples’, ‘weighted’]

As definições delas são:

If None, the scores for each class are returned. Otherwise, this determines the type of averaging performed on the data:

'binary':
Only report results for the class specified by pos_label. This is applicable only if targets (y_{true,pred}) are binary.

'micro':
Calculate metrics globally by counting the total true positives, false negatives and false positives.

'macro':
Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.

'weighted':
Calculate metrics for each label, and find their average, weighted by support (the number of true instances for each label). This alters ‘macro’ to account for label imbalance; it can result in an F-score that is not between precision and recall.

'samples':
Calculate metrics for each instance, and find their average (only meaningful for multilabel classification where this differs from accuracy_score).

Repara que no caso de samples a doc cita a possibilidade de diferir de accuracy_score.