Python: wie zu normalisieren Verwirrung matrix?
Rechnete ich eine confusion matrix für meine Klassifizierer mit der Methode confusion_matrix() aus der sklearn Paket. Die diagonalen Elemente der confusion matrix darstellen, die Anzahl der Punkte, für die die vorhergesagten label ist gleich der wahr-label, während die off-diagonal-Elemente sind diejenigen, die falsch etikettierten durch die Klassifizierer.
Ich würde gerne zu normalisieren meine Verwirrung matrix, so dass es enthält nur zahlen zwischen 0 und 1. Ich möchte zum Lesen der Prozentsatz der korrekt klassifizierten Proben aus der matrix.
Fand ich mehrere Methoden wie Normalisierung einer matrix (Zeile und Spalte Normalisierung), aber ich weiß nicht viel über Mathe und bin mir nicht sicher, ob dies der richtige Ansatz. Kann mir jemand bitte helfen?
- Es gibt verschiedene Arten der Normalisierung für Matrizen (und eigentlich auch für alles andere), und welche Sie verwenden sollten, hängt von Ihrer Anwendung. Also vielleicht können Sie Bearbeiten Ihre Frage genauer beschreiben: was genau wollen Sie erreichen durch Normalisierung der matrix? Sollte die Summe von etwas 1, zum Beispiel?
- Ich bearbeitet die Frage, um es ein bisschen klarer. Ich möchte im Grunde nur eine Transformation der Anzahl der klassifizierten Proben, Prozentwerte, so dass ich sofort sehen, dass die Anzahl der korrekt klassifizierten Proben auf der diagonalen der matrix zum Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gehe davon aus, dass
M[i,j]
steht fürElement of real class i was classified as j
. Wenn Ihr den anderen Weg um Sie herum gehen zu müssen zur Umsetzung alles, was ich sage. Ich bin auch dabei, verwenden Sie die folgende matrix für konkrete Beispiele:Gibt es im wesentlichen zwei Dinge, die Sie tun können:
Zu finden, wie jede Klasse eingestuft worden
Das erste, was Sie Fragen, ist, was Prozentsatz der Elemente echt Klasse
i
hier eingestuft, wie jede Klasse. Dazu nehmen wir eine Zeile die Festsetzung deri
und teilen sich jedes element als Summe der Elemente in der Zeile. In unserem Beispiel die Objekte der Klasse 2 eingestuft als Klasse 1-4 mal, werden richtig klassifiziert als Klasse 2 5 mal und sind klassifiziert als Klasse 3-6-mal. Finden Sie die Prozentwerte, die wir nur teilen alles durch die Summe 4 + 5 + 6 = 15Zu finden, was Klassen sind verantwortlich für jede Klassifizierung
Die zweite Sache, die Sie tun können, ist zu schauen, jedes Ergebnis von Ihrer Systematik und Fragen, wie viele dieser Ergebnisse stammen aus jeweils echt Klasse. Sein wird, ähnlich wie dem anderen Fall aber mit Spalten statt Zeilen. In unserem Beispiel Klassifizierer gibt "1" 1 Zeitpunkt der ursprünglichen Klasse 1, 4-mal, wenn die ursprüngliche Klasse 2 und 7-mal, wenn die ursprüngliche Klasse 3. Finden Sie die Prozentsätze wir dividieren Sie durch die Summe 1 + 4 + 7 = 12
--
Natürlich auch die Methoden, die ich gab, nur für eine einzige Zeile, Spalte in einer Zeit, und ich bin mir nicht sicher, ob es eine gute Idee wäre, um tatsächlich ändern Ihre Verwirrung matrix in dieser form. Dies sollte jedoch geben die Prozentsätze, die Sie suchen.
Nehme an, dass
Dann, um herauszufinden, wie viele Proben pro Klasse erhalten haben, Ihre richtige Bezeichnung, die Sie benötigen,
Die Diagonale enthält die erforderlichen Werte. Ein anderer Weg, um zu berechnen, diese ist zu erkennen, dass das, was Sie sind-computing ist die recall-pro-Klasse:
Ähnlich, wenn Sie dividieren Sie durch die Summe über
axis=0
erhalten Sie die Präzision (Anteil der Klassek
Vorhersagen, die haben ground truth labelk
):C / C.astype(np.float).sum(axis=1)
nur die diagonalen Elemente sinnvoll sind. Ist es nicht besser, verwendennp.transpose( np.transpose(C) / C.astype(np.float).sum(axis=1) )
so dass die gesamte matrix sinnvolle Werte?keepdims
in Summe wieC / C.astype(np.float).sum(axis=1, keepdims=True)
Den matrix-Ausgang von sklearn ist
confusion_matrix()
ist solche, dieso bekommen Sie die Prozentwerte für jede Klasse (oft als Spezifität und Sensitivität in binäre Klassifikation), die Sie benötigen, um zu normalisieren, indem Sie die Zeile: ersetzen Sie jedes element in einer Zeile, die durch sich selbst dividiert durch die Summe der Elemente der Zeile.
Beachten Sie, dass sklearn hat eine Zusammenfassung Funktion zur Verfügung stellt, berechnet Metriken aus der Verwirrung matrix : classification_report. Es gibt precision und recall eher als Spezifität und Sensitivität, aber diese sind Häufig als mehr informativ im Allgemeinen (vor allem für unsymmetrische multi-class classification.)
Aus der sklearn Dokumentation (Grundstück B.)
wo cm ist die confusion-matrix, wie es von der sklearn.
Es ist eine Bibliothek, die zur Verfügung gestellt von scikit-learn selbst zum Plotten von Graphen. Es basiert auf der matplotlib und sollte es bereits installiert haben, um weiter zu gehen.
Nun, setzen Sie einfach normalisieren parameter wahr: