Fehler bei der Verwendung von sklearn.metrics: ValueError: Target is multiclass but average='binary'.

使用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 averageden 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

Guess you like

Origin blog.csdn.net/daydayup858/article/details/130111894