0

Ich versuche, die f1_score zu berechnen, aber ich bekomme einige Warnungen für einige Fälle, wenn ich die Methode sklearn f1_score verwende.Wie F1-Score für Multilabel-Klassifizierung berechnen?

Ich habe ein Multilabel 5-Klassen-Problem für eine Vorhersage.

import numpy as np 
from sklearn.metrics import f1_score 

y_true = np.zeros((1,5)) 
y_true[0,0] = 1 # => label = [[1, 0, 0, 0, 0]] 

y_pred = np.zeros((1,5)) 
y_pred[:] = 1 # => prediction = [[1, 1, 1, 1, 1]] 

result_1 = f1_score(y_true=y_true, y_pred=y_pred, labels=None, average="weighted") 

print(result_1) # prints 1.0 

result_2 = f1_score(y_true=y_ture, y_pred=y_pred, labels=None, average="weighted") 

print(result_2) # prints: (1.0, 1.0, 1.0, None) for precision/recall/fbeta_score/support 

Wenn ich average="samples" statt "weighted" ich (0,1, 1,0, 0,1818 ..., None). Ist die Option "weighted" nicht für ein Multilabel-Problem geeignet oder wie verwende ich die f1_score-Methode richtig?

ich auch eine Warnung erhalten, wenn average="weighted" mit:

„UndefinedMetricWarning. Recall und F-Score sind schlecht definiert und ohne echten Proben auf 0,0 in Etiketten gesetzt wird“

Antwort

1

Es funktioniert, wenn Sie etwas Daten aufaddieren:

y_true = np.array([[1,0,0,0], [1,1,0,0], [1,1,1,1]]) 
y_pred = np.array([[1,0,0,0], [1,1,1,0], [1,1,1,1]]) 

recall_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 1.0 
precision_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 0.9285714285714286 

f1_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 0.95238095238095244 

Die Daten legen nahe wir keine wahren Positiven nicht verpasst haben und haben keine falsch-negative Ergebnisse vorhergesagt (recall_score gleich 1). Wir haben jedoch ein falsch positives Ergebnis in der zweiten Beobachtung vorhergesagt, das zu precision_score gleich ~ 0,93 führt.

Da sowohl precision_score als auch recall_score nicht 0 sind mit weighted Parameter, existiert f1_score. Ich glaube, dass Ihr Fall aufgrund fehlender Informationen im Beispiel ungültig ist.

+0

hi mein Array mit np.zeros ((1,5)) hat die Form (1,5) Ich habe gerade einen Kommentar geschrieben, um ein Beispiel zu geben, wie eine Probe aussieht, aber es ist tatsächlich die Form wie diese [[1 , 0,0,0,0] ...]. Das Problem ist, dass f1_score mit average = "micro"/"macro" arbeitet, aber nicht mit "weighted". Also meine Frage ist, "gewichtete" Option funktioniert nicht mit Multilabel oder muss ich andere Optionen wie labels/pos_label in f1_score -Funktion setzen. –

+0

Bitte lesen Sie die Antwort. Sie können nicht mit einer Zielvariablen arbeiten, deren Form (1, 5) ist. In diesem Fall funktioniert Ihre 'f1_score' nicht, selbst wenn Sie 'micro' oder 'macro' verwenden. –

+0

Wenn ich ravel verwende, um die Form (5,) zu erhalten, verwendet es einen Wert als eine Probe, so dass es nicht für Multilabel, z.B. Wenn ich diese Form mit durchschnittlich = "Samples" versuche, bekomme ich den Fehler "Sample-basierte Präzision, Rückruf, FScore ist außerhalb der Multilabel-Klassifikation nicht sinnvoll." Ich bekomme Arbeitsergebnisse für die Form (1,5) für Mikro und Makro (und sie sind korrekt) das einzige Problem ist für die Option Durchschnitt = "gewichtet" –