Zmienne współliniowe w szkoleniu Multlass LDA

16

Trenuję wieloklasowy klasyfikator LDA z 8 klasami danych.

Podczas treningu otrzymuję ostrzeżenie: „ Zmienne są współliniowe

Dostaję dokładność szkolenia ponad 90% .

Korzystam z biblioteki scikits-learn w Pythonie do trenowania i testowania danych Multi-class.

Dostaję też przyzwoitą dokładność testowania (około 85% -95% ).

Nie rozumiem, co oznacza błąd / ostrzeżenie. Proszę pomóż mi.

garak
źródło

Odpowiedzi:

29

Wielokoliniowość oznacza, że ​​twoje predyktory są skorelowane. Dlaczego to takie złe?

Ponieważ LDA, podobnie jak techniki regresji, wymaga obliczenia inwersji macierzy, co jest niedokładne, jeśli wyznacznik jest bliski 0 ( tj. Dwie lub więcej zmiennych są prawie liniową kombinacją).

Co ważniejsze, uniemożliwia interpretację szacowanych współczynników. Jeśli wzrost , powiedzmy, jest związana ze spadkiem X 2 i oboje wzrost zmiennej Y , każda zmiana w X 1, zostaną zrekompensowane przez zmianę X 2 i można nie doceniać wpływu X 1 na Y . W LDA nie doceniłbyś wpływu X 1 na klasyfikację.X1X2YX1X2X1YX1

Jeśli wszystko czego dbają o to klasyfikacja per se , a po treningu swój model na połowie danych i testowanie go na drugą połowę można uzyskać 85-95% dokładność powiedziałbym, że jest w porządku.

gui11aume
źródło
Czy mogę to zinterpretować jako, że cecha X1 w wektorze cech nie jest dobrym wyborem w przypadku niskiej dokładności testowania?
garak
1
Myślę, że jeśli dokładność testowania jest niska, nie ma dobrego wyboru.
gui11aume
Co ciekawe, mam ten problem z LDA, ale nie kiedy używam QDA. Zastanawiam się, co tam jest innego?
garak
1
+1 za odpowiedź, ale „obliczenie inwersji macierzy” może być niedokładne. Nigdy go nie komputerowo jawnie, stosowane są metody bezpośrednie, takie jak LU, QR lub metody iteracyjne.
Haitao Du
@ hxd1011 Prawidłowo! Dla przypomnienia, czy możesz podać kilka słów o tym, co dzieje się w LU / QR itp., Gdy matryca jest „prawie pojedyncza”, czy może wskazać dokument, który to wyjaśnia?
gui11aume
12

Ponieważ wydaje mi się, że gui11aume dał ci świetną odpowiedź, chcę dać przykład z nieco innej perspektywy, która może być pouczająca. Weź pod uwagę, że zmienna towarzysząca funkcji dyskryminacyjnej wygląda następująco:

X1=5X2+3X3X4

Załóżmy, że najlepsza LDA ma następującą granicę liniową:

X1+2X2+X32X4=5

5X2+3X3X4X1

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

lub

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. But in practice the collinearity is approximate. This makes things worse because the noise allows for a unique answer. Very slight perturbations of the data will cause the coefficients to change drastically. But for prediction you are okay because each equation defines almost the same boundary and so LDA will result in nearly identical predictions.

Michael R. Chernick
źródło
1

While the answer that was marked here is correct, I think you were looking for a different explanation to find out what happened in your code. I had the exact same issue running through a model.

Here's whats going on: You're training your model with the predicted variable as part of your data set. Here's an example of what was occurring to me without even noticing it:

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

In this code, I want to predict the value of 'COL3'... but, if you look at train_X, I'm telling it to retrieve every column except the last one, so its inputting COL1 COL2 and COL3, not COL4, and trying to predict COL3 which is part of train_X.

I corrected this by just moving the columns, manually moved COL3 in Excel to be the last column in my data set (now taking place of COL4), and then:

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

If you don't want to move it in Excel, and want to just do it by code then:

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

Note now how I declared train_X, to include all columns except COL3, which is part of train_Y.

I hope that helps.

nukalov
źródło