Cálculo da pontuação F1 no sklearn

1. Conceitos relacionados

Existem as seguintes 4 situações para resultados de testes de dados:
Verdadeiro Positivo (TP): Previsto como positivo, real também é positivo Falso
Positivo (FP): Previsto como positivo, real é negativo
Falso Negativo (FN): Previsto como negativo , real é positivo
Verdadeiro Negativo (TN): Previsto como negativo, real negativo

 

Precisão (P)  :  TP/(TP+FP) 

Recuperar (R)  :  TP (TP + FN)

Pontuação F1  :  2 (P R)/(P+R

Protótipo f1_score:

sklearn.metrics.f1_score(y_true, 
                 y_pred,
                 labels=None, 
                 pos_label=1, 
                 average=’binary’, 
                 sample_weight=None)

Explicação detalhada dos parâmetros

    1. y_true: Valores alvo verdadeiros (corretos).

    2. y_pred: Rótulo de classificação do classificador Alvos estimados conforme retornados por um classificador.

    3. média: [Nenhum, 'binário' (padrão), 'micro', 'macro', 'amostras', 'ponderado'] 
            Este parâmetro é necessário para destinos multiclasse/multi-rótulo. O padrão é 'binário', ou seja, duas categorias
    
    4. rótulos: rótulos de categoria, opcionais

 

2. Análise de exemplo

1. Dados

Dados reais: 1, 2, 3, 4, 5, 6, 7, 8, 9 

Classe verdadeira: A, A, A, A, B, B, B, C, C
Classe prevista: A, A, B, C, B, B, C, B, C

Então o verdadeiro e falso positivo e negativo de cada categoria:

        A B C Total

TP 2 2 1 5
FP 0 2 2 4
FN 2 1 1 4 

 

2. Taxa de precisão, taxa de recall e pontuação F1 de cada categoria


Taxa de precisão da categoria A: PA = 2/(2+0)= 1
Taxa de recall da categoria A: RA = 2/(2+2)= 0,5
Pontuação F1 da categoria A: FA = 2*(1*0,5) /(1+0,5) = 0,667

Taxa de precisão da categoria B: PB = 2/(2+2) = 0,5
Taxa de recall da categoria B: RB = 2/(2+1) = 0,667
Pontuação F1 da categoria B: FB = 2*(0,5*0,667) /(0,5+0,667) = 0,572

Taxa de precisão da categoria C: PC = 1/(1+2) = 0,333
Taxa de recall da categoria C: RC = 1/(1+1) = 0,5
Pontuação F1 da categoria C: FC = 2*(0,333*0,5) /(0,333+0,5) = 0,39976

 

 

3. Pontuação F1

Pontuação F1 de todos os dados:
Existem dois métodos.
O primeiro método é calcular todos os TP, FP e FN nos dados e, em seguida, calcular a pontuação F1, que é micro; o segundo método
é calcular o TP, FP de cada categoria separadamente. FN, em seguida, calcule a pontuação F1 de cada classe e, em seguida, calcule a média da pontuação F, que é macro.

micro:
P = 5/(5+4) = 0,556
R = 5/(5+4) = 0,556
Pontuação F1 = 2*(0,556*0,556)/(0,556+0,556) = 0,556

macro:
pontuação F1 = (0,667+0,572+0,39976)/3 = 0,5462

 

4. Use sklearn para calcular a pontuação f1

1. pontuação_f1

Para usar a interface sklearn, use 1 para representar a categoria A, 2 para representar a categoria B e 3 para representar a categoria C. Então a
categoria verdadeira y_true: 1, 1, 1, 1, 2, 2, 2, 3, 3 a
categoria prevista y_pred: 1 , 1, 2, 3, 2, 2, 3, 2, 3

from sklearn.metrics import f1_score

y_true = [1, 1, 1, 1, 2, 2, 2, 3, 3]
y_pred = [1, 1, 2, 3, 2, 2, 3, 2, 3]

f1_micro = f1_score(y_true,y_pred,average='micro')
f1_macro = f1_score(y_true,y_pred,average='macro')


print('f1_micro: {0}'.format(f1_micro))
print('f1_macro: {0}'.format(f1_macro))

A saída é:

f1_micro: 0.5555555555555556
f1_macro: 0.546031746031746

Percebe-se que o resultado é igual ao cálculo manual

Por exemplo, Precision_recall_fscore_support

Você também pode usar o sklearn para calcular a precisão de recuperação de cada categoria, etc.

# 计算各个类别的准确率,召回率,与F1-score
from sklearn.metrics import precision_recall_fscore_support

y_true = [1, 1, 1, 1, 2, 2, 2, 3, 3]
y_pred = [1, 1, 2, 3, 2, 2, 3, 2, 3]

p_class, r_class, f_class, support_micro = precision_recall_fscore_support(y_true,y_pred,labels=[1,2,3])

print(p_class)
print(r_class)
print(f_class)
print(support_micro)

Resultado de saída:

[1.         0.5        0.33333333]
[0.5        0.66666667 0.5       ]
[0.66666667 0.57142857 0.4       ]
[4 3 2]

O mesmo que calculado manualmente.

Observação:

Precision_recall_fscore_support retorna a precisão, recall e pontuação f1 de cada categoria. Em cada indicador, a ordem de cada categoria é a mesma que a ordem dos rótulos dos parâmetros, por exemplo:

p_class = [1. 0,5 0,33333333]

rótulos=[1,2,3]

mas

A precisão da categoria 1 é 1

A precisão da categoria 2 é 0,5

A precisão da categoria 3 é 0,3333333

Guess you like

Origin blog.csdn.net/bailixuance/article/details/94627078