Kollineare Variablen im Multiclass-LDA-Training

16

Ich trainiere einen LDA-Klassifikator für mehrere Klassen mit 8 Datenklassen.

Während des Trainings bekomme ich eine Warnung von: " Variablen sind kollinear "

Ich erhalte eine Trainingsgenauigkeit von über 90% .

Ich verwende eine Scikits-Lernbibliothek in Python , um die Daten für mehrere Klassen zu trainieren und zu testen.

Ich bekomme auch eine ordentliche Testgenauigkeit (ca. 85% -95% ).

Ich verstehe nicht, was der Fehler / die Warnung bedeutet. Bitte hilf mir.

Garak
quelle

Antworten:

29

Multikollinearität bedeutet, dass Ihre Prädiktoren korreliert sind. Warum ist das so schlimm?

Weil LDA wie Regressionstechniken die Berechnung einer Matrixinversion beinhaltet, die ungenau ist, wenn die Determinante nahe bei 0 liegt ( dh zwei oder mehr Variablen sind fast eine lineare Kombination voneinander).

Noch wichtiger ist, dass die geschätzten Koeffizienten nicht interpretiert werden können. Wenn eine Zunahme von mit einer Abnahme von und beide die Variable erhöhen , wird jede Änderung von durch eine Änderung von kompensiert, und Sie werden die Auswirkung von auf . In LDA würden Sie die Auswirkung von auf die Klassifizierung unterschätzen.X 2 Y X 1 X 2 X 1 Y X 1X1X2YX1X2X1YX1

Wenn Sie sich nur für die Klassifizierung an sich interessieren und wenn Sie Ihr Modell auf die Hälfte der Daten trainiert und auf der anderen Hälfte getestet haben, erhalten Sie eine Genauigkeit von 85-95%. Ich würde sagen, dass dies in Ordnung ist.

gui11aume
quelle
Kann ich das so interpretieren, dass ein Merkmal X1 im Merkmalsvektor keine gute Wahl ist, wenn die Testgenauigkeit gering ist?
Garak
1
Ich denke, wenn die Testgenauigkeit niedrig ist, gibt es keine gute Wahl.
gui11aume
Interessant ist, dass ich dieses Problem mit LDA habe, aber nicht, wenn ich QDA verwende. Ich frage mich, was da drin anders ist.
Garak
1
+1 für die Antwort, aber "Berechnen einer Matrixinversion" ist möglicherweise nicht genau. Wir rechnen niemals explizit damit, direkte Methoden wie LU, QR oder iterative Methoden werden verwendet.
Haitao Du
@ hxd1011 Richtig! Könnten Sie für die Aufzeichnung ein paar Worte darüber sagen, was in LU / QR usw. passiert, wenn die Matrix "fast singulär" ist, oder vielleicht auf ein Dokument verweisen, das dies erklärt?
gui11aume
12

Da ich denke, dass gui11aume Ihnen eine großartige Antwort gegeben hat, möchte ich ein Beispiel aus einem etwas anderen Blickwinkel geben, das vielleicht aufschlussreich ist. Bedenken Sie, dass eine Kovariate in Ihrer Diskriminanzfunktion wie folgt aussieht:

X1=5X2+3X3-X4

Angenommen, die beste LDA hat die folgende lineare Grenze:

X1+2X2+X3-2X4=5

5X2+3X3-X4X1

5X2+3X3-X4+2X2+X3-2X4=5

oder

7X2+4X3-3X4=5

1,2,1,-2X1X2X3X40,7,3,-1

Die Koeffizienten sind also sehr unterschiedlich, aber die beiden Gleichungen ergeben die gleiche Grenze und die gleiche Vorhersageregel. Wenn eine Form gut ist, ist es auch die andere. Aber jetzt können Sie sehen, warum gui11ame sagt, dass die Koeffizienten nicht interpretierbar sind.

X20X3X4

Michael R. Chernick
quelle
1

Obwohl die hier markierte Antwort korrekt ist, haben Sie nach einer anderen Erklärung gesucht, um herauszufinden, was in Ihrem Code passiert ist. Ich hatte genau das gleiche Problem beim Durchlaufen eines Modells.

Folgendes ist los: Sie trainieren Ihr Modell mit der vorhergesagten Variablen als Teil Ihres Datensatzes. Hier ist ein Beispiel von dem, was mir einfiel, ohne es überhaupt zu bemerken:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns[:-1]]

In diesem Code möchte ich den Wert von 'COL3' vorhersagen ... aber wenn Sie sich train_X ansehen, sage ich, dass jede Spalte außer der letzten abgerufen werden soll, sodass COL1 COL2 und COL3 eingegeben werden und nicht COL4. und versuchen, COL3 vorherzusagen, das Teil von train_X ist.

Ich habe dies korrigiert, indem ich nur die Spalten verschoben habe, COL3 manuell in Excel als letzte Spalte in meinem Datensatz verschoben habe (jetzt statt COL4) und dann:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL4']
train_X = train[train.columns[:-1]]

Wenn Sie es nicht in Excel verschieben möchten und es einfach per Code ausführen möchten, gehen Sie wie folgt vor:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns['COL1','COL2','COL4']]

Beachten Sie nun, wie ich train_X deklariert habe, um alle Spalten mit Ausnahme von COL3 einzuschließen, das Teil von train_Y ist.

Ich hoffe das hilft.

Nukalov
quelle