Ich habe google gesucht und den stackoverflow-Beitrag zu diesem Fehler angezeigt. Sie sind nicht meine Fälle.
Ich benutze Keras, um ein einfaches neuronales Netzwerk zu trainieren und eine Vorbedingung für den geteilten Testdatensatz zu stellen. Aber wenn roc_auc_score
verwendet wird, um auc zu berechnen, habe ich "ValueError: Nur eine Klasse in y_true. ROC AUC Score ist in diesem Fall nicht definiert.".
Ich überprüfe die Zielmarkenverteilung und sie sind sehr unausgeglichen. Einige Labels (in den insgesamt 29 Labels) haben nur 1 Instanz. Es ist daher wahrscheinlich, dass sie keine positive Label-Instanz auf dem Testlabel haben werden. Also hat die roc_auc_score
-Funktion von sklearn das einzige Klassenproblem gemeldet. Das ist vernünftig.
Aber ich bin neugierig, denn wenn ich sklearns Funktion cross_val_score
verwende, kann sie die AUC-Berechnung ohne Fehler verarbeiten.
Ich frage mich, was in cross_val_score
passiert ist, weil die cross_val_score
eine geschichtete Kreuzvalidierungs-Datenaufteilung verwenden?
== UPDATE ==
Ich fuhr fort zu graben, aber immer noch nicht den Unterschied dahinter.Ich sehe, dass cross_val_score Aufruf check_scoring(estimator, scoring=None, allow_none=False)
, um einen Scorer, und die check_scoring
ruft get_scorer(scoring)
, die scorer=SCORERS[scoring]
Und das SCORERS['roc_auc']
ist roc_auc_scorer
;
Der roc_auc_scorer
wird von
Also, es benutzt immer noch die roc_auc_score-Funktion. Ich verstehe nicht, warum sich cross_val_score anders verhält, als direkt roc_auc_score aufzurufen.
Ich denke, deine Vermutung ist richtig. Die AUC (Fläche unter der ROC-Kurve) benötigt eine ausreichende Anzahl von Klassen, um Sinn zu ergeben.
Standardmäßig berechnet cross_val_score
die Leistungsmetrik jeweils separat. Eine andere Möglichkeit wäre, cross_val_predict
zu verwenden und die AUC über alle zusammengefassten Falten zu berechnen.
Sie könnten etwas tun wie:
%Vor%Tags und Links scikit-learn