Variabili collineari nella formazione Multiclass LDA


16

Sto addestrando un classificatore LDA multi-classe con 8 classi di dati.

Durante l'allenamento, ricevo un avviso di: "Le variabili sono collineari "

Sto ottenendo una precisione di allenamento superiore al 90% .

Sto usando la libreria scikits-learn in Python per addestrare e testare i dati multi-classe.

Ottengo anche una discreta precisione di test (circa l' 85% -95% ).

Non capisco cosa significhi l'errore / avviso. Per favore aiutatemi.

Risposte:


29

Multicollinearità significa che i tuoi predittori sono correlati. Perché è così male?

Perché LDA, come le tecniche di regressione, comporta il calcolo di un'inversione di matrice, che è inaccurata se il determinante è vicino a 0 ( ovvero due o più variabili sono quasi una combinazione lineare l'una dell'altra).

Ancora più importante, rende impossibile interpretare i coefficienti stimati. Se un aumento di , per esempio, è associato ad una diminuzione nel X 2 ed entrambi aumento variabile Y , ogni cambio di X 1 sarà compensata da un cambiamento di X 2 e si sottovaluti l'effetto di X 1 su Y . In LDA, sottovaluteresti l'effetto di X 1 sulla classificazione.X1X2YX1X2X1YX1

Se tutto ciò che ti interessa è la classificazione in e che dopo aver allenato il tuo modello su metà dei dati e averlo testato sull'altra metà, ottieni una precisione dell'85-95%, direi che va bene.


Quindi posso interpretarlo come, una caratteristica X1 nel vettore di caratteristiche non è una buona scelta nel caso in cui la precisione del test sia bassa?
Garak,

1
Immagino che se la precisione del test è bassa non c'è una buona scelta.
gui11aume,

La cosa interessante è che ho questo problema con LDA ma non quando uso QDA. Mi chiedo che cosa c'è di diverso lì dentro?
garak,

1
+1 per la risposta, ma "calcolare un'inversione di matrice" potrebbe non essere preciso. Non lo elaboriamo mai esplicitamente, vengono utilizzati metodi diretti come LU, QR o metodi iterativi.
Haitao Du

@ hxd1011 Corretto! Per la cronaca, potresti dare qualche parola su cosa succede in LU / QR ecc. Quando la matrice è "quasi singolare", o forse indicare un documento che lo spiega?
gui11aume,

12

Siccome penso che gui11aume ti abbia dato un'ottima risposta, voglio fare un esempio da un'angolazione leggermente diversa che potrebbe essere illuminante. Considera che una covariata nella tua funzione discriminante ha il seguente aspetto:

X1=5X2+3X3X4.

Suppose the best LDA has the following linear boundary:

X1+2X2+X32X4=5

Then we can substitute 5X2+3X3X4 for X1 n the LDA boundary equation, so:

5X2+3X3X4+2X2+X32X4=5

or

7X2+4X33X4=5.

These two boundaries are identical but the first one has coefficients 1,2,1,2 for X1, X2, X3, and X4 respectively, while the other has coefficients 0,7,3,1.

So the coefficient are quite different but the two equations give the same boundary and identical prediction rule. If one form is good the other is also. But now you can see why gui11ame says the coefficients are uninterpretable.

There are several other ways to express this boundary as well by substituting for X2 to give it the 0 coefficient and the same could be done for X3 or X4. Ma in pratica la collinearità è approssimativa. Ciò peggiora le cose perché il rumore consente una risposta unica. Lievissime perturbazioni dei dati faranno cambiare drasticamente i coefficienti. Ma per la previsione stai bene perché ogni equazione definisce quasi lo stesso limite e quindi LDA si tradurrà in previsioni quasi identiche.


1

Mentre la risposta che è stata contrassegnata qui è corretta, penso che stavi cercando una spiegazione diversa per scoprire cosa è successo nel tuo codice. Ho avuto lo stesso identico problema nell'esecuzione di un modello.

Ecco cosa sta succedendo: stai addestrando il tuo modello con la variabile prevista come parte del tuo set di dati. Ecco un esempio di ciò che mi stava accadendo senza nemmeno accorgermene:

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

In questo codice, voglio prevedere il valore di "COL3" ... ma, se guardi train_X, gli dico di recuperare ogni colonna tranne l'ultima, quindi sta introducendo COL1 COL2 e COL3, non COL4, e cercando di prevedere COL3 che fa parte di train_X.

Ho corretto questo semplicemente spostando le colonne, spostando manualmente COL3 in Excel per essere l'ultima colonna nel mio set di dati (ora in corso di COL4), quindi:

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

Se non vuoi spostarlo in Excel e vuoi farlo semplicemente per codice, allora:

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

Nota ora come ho dichiarato train_X, per includere tutte le colonne tranne COL3, che fa parte di train_Y.

Spero che aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.