使用sklearn.metrics时报错:ValueError: Ziel ist mehrklassig, aber average='binary'. Bitte wählen Sie eine andere Durchschnittseinstellung, eine von [Keine, 'Mikro', 'Makro', 'Gewichtet'].
lösen:
from sklearn.metrics import f1_score, recall_score, precision_score
# 对于多分类任务
f1 = f1_score(gt_label_list, pd_score_list)
recall = recall_score(gt_label_list, pd_score_list)
precision = precision_score(gt_label_list, pd_score_list)
# 改为
f1 = f1_score(gt_label_list, pd_score_list, average='macro')
recall = recall_score(gt_label_list, pd_score_list, average='macro')
precision = precision_score(gt_label_list, pd_score_list, average='macro')
Der F1-Score kann als harmonischer Durchschnitt von Precision und Recall interpretiert werden, wobei der F1-Score den besten Wert bei 1 und den schlechtesten Wert bei 0 erreicht. Die Formel zur Berechnung des F1-Scores lautet:
F1 = 2 * (Präzision * Rückruf) / (Präzision + Rückruf)
Im Fall von Multi-Class und Multi-Label ist der F1-Score der Durchschnittswert von F1 für jede Klasse, und seine Gewichtung hängt von average
den Parametern ab (Recall und Precision sind ähnlich).
Durchschnitt {'micro', 'macro', 'samples', 'weighted', 'binary'} oder None, default='binary'
'binary'
: geeignet für binäre Klassifikation'micro'
: Der Indikator wird global berechnet, indem die Gesamtzahl der richtig positiven, falsch negativen und falsch positiven Ergebnisse gezählt wird;'macro'
: Berechnet die Metriken für jedes Label und findet ihren ungewichteten Durchschnitt, unabhängig von Label-Ungleichgewicht;'weighted'
: Berechnen Sie die Metriken für jedes Label und finden Sie ihren Durchschnitt, gewichtet mit der Anzahl der realen Instanzen jedes Labels, unter Berücksichtigung des Ungleichgewichts der Labels; es kann dazu führen, dass der F-Score nicht zwischen Genauigkeit und Erinnerung liegt;'samples'
: Berechnen Sie den Index jeder Instanz und finden Sie seinen Durchschnittswert. Im Gegensatz zu precision_score ist dies nur bei der Multi-Label-Klassifizierung sinnvoll;
# Example
>>> from sklearn.metrics import f1_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> f1_score(y_true, y_pred, average='macro')
0.26...
>>> f1_score(y_true, y_pred, average='micro')
0.33...
>>> f1_score(y_true, y_pred, average='weighted')
0.26...
>>> f1_score(y_true, y_pred, average=None)
array([0.8, 0. , 0. ])
>>> y_true = [0, 0, 0, 0, 0, 0]
>>> y_pred = [0, 0, 0, 0, 0, 0]
>>> f1_score(y_true, y_pred, zero_division=1)
1.0...
>>> # multilabel classification
>>> y_true = [[0, 0, 0], [1, 1, 1], [0, 1, 1]]
>>> y_pred = [[0, 0, 0], [1, 1, 1], [1, 1, 0]]
>>> f1_score(y_true, y_pred, average=None)
array([0.66666667, 1. , 0.66666667])
Referenz:
sklearn.metrics.f1_score Offizielle Dokumentation: sklearn.metrics.f1_score – scikit-learn 1.2.2 Dokumentation