Pitanje:
Kolinearne varijable u Multiclass LDA treningu
garak
2012-05-29 18:57:14 UTC
view on stackexchange narkive permalink

Vježbam višerazredni LDA klasifikator s 8 klasa podataka.

Tijekom izvođenja treninga dobivam upozorenje na: " Varijable su kolinearne "

Dobivam točnost obuke preko 90 %

Koristim scikits-learn knjižnica u Python -u trenira i testira podatke više klasa.

Dobivam i pristojnu točnost testiranja (otprilike 85%-95% ).

Ne razumijem što pogreška / sredstvo upozorenja. Molim vas, pomozite mi.

Tri odgovori:
gui11aume
2012-05-29 19:15:19 UTC
view on stackexchange narkive permalink

Multikolinearnost znači da su vaši prediktori povezani. Zašto je ovo loše?

Budući da LDA, poput tehnika regresije, uključuje izračunavanje inverzije matrice, što je netočno ako je odrednica blizu 0 ( tj. dvije ili više varijabli gotovo su međusobne linearne kombinacije).

Što je još važnije, čini procijenjene koeficijente nemogućim za tumačenje. Ako je, recimo, povećanje u $ X_1 $ povezano sa smanjenjem u $ X_2 $ i oboje povećaju varijablu $ Y $, svaka promjena u $ X_1 $ nadoknadit će se promjenom u $ X_2 $, a vi ćete podcijeniti učinak od $ X_1 $ na $ Y $. U LDA-u biste podcijenili učinak $ X_1 $ na klasifikaciju.

Ako vam je važna samo klasifikacija sama po sebi, i to nakon treninga vašeg modela na polovici podaci i testirajući ih na drugoj polovici dobivate 85-95% točnosti. Rekao bih da je u redu.

Pa mogu li to protumačiti kao, značajka X1 u vektoru značajke nije dobar odabir u slučaju da je točnost testiranja niska?
Pretpostavljam da ako je točnost testiranja niska, nema dobrog izbora.
Zanimljivo je da imam ovaj problem s LDA, ali ne i kada koristim QDA. Pitam se što je tamo drugačije?
+1 za odgovor, ali "izračunavanje inverzije matrice" možda nije točno.Nikada to ne računamo eksplicitno, koriste se izravne metode poput LU, QR ili iterativne metode.
@hxd1011 Ispravno!Za zapisnik, možete li dati nekoliko riječi o onome što se događa u LU / QR itd. Kada je matrica "gotovo jednina" ili možda uputiti na dokument koji to objašnjava?
Michael R. Chernick
2012-05-29 20:43:36 UTC
view on stackexchange narkive permalink

Kako mislim da vam je gui11aume dao sjajan odgovor, želim dati primjer iz malo drugačijeg kuta koji bi mogao biti osvjetljavajući. Uzmite u obzir da kovarijat u vašoj diskriminacijskoj funkciji izgleda na sljedeći način:

$ X_1 = 5X_2 + 3X_3 -X_4 $.

Pretpostavimo da najbolji LDA ima sljedeću linearnu granicu:

$ X_1 + 2X_2 + X_3-2X_4 = 5 $

Tada možemo zamijeniti $ 5X_2 + 3X_3 -X_4 $ za $ X_1 $ n jednadžbe granice LDA, pa:

$ 5X_2 + 3X_3-X_4 + 2X_2 + X_3-2X_4 = 5 $

ili

7X_2 USD + 4X_3-3X_4 = 5 $.

Ove dvije granice su identične, ali prva ima koeficijente $ 1, 2, 1, -2 $ za $ X_1 $, $ X_2 $, $ X_3 $ i $ X_4 $, respektivno, dok druga ima koeficijenti 0, 7, 3, -1 $.

Dakle, koeficijent se prilično razlikuje, ali dvije jednadžbe daju istu granicu i identično pravilo predviđanja. Ako je jedan oblik dobar, drugi je također. Ali sada možete vidjeti zašto gui11ame kaže da su koeficijenti nerazumljivi.

Postoji nekoliko drugih načina da se izrazi i ova granica zamjenom za $ X_2 $ dajući mu $ 0 $ koeficijent, a isto bi se moglo učiniti za $ X_3 $ ili $ X_4 $. Ali u praksi je kolinearnost približna. To stvari pogoršava jer buka omogućuje jedinstveni odgovor. Vrlo mala poremećaja podataka uzrokovat će drastične promjene koeficijenata. Ali s predviđanjem ste u redu jer svaka jednadžba definira gotovo istu granicu pa će LDA rezultirati gotovo identičnim predviđanjima.

nukalov
2018-03-20 22:52:40 UTC
view on stackexchange narkive permalink

Iako je odgovor koji je ovdje označen točan, mislim da ste tražili drugačije objašnjenje kako biste saznali što se dogodilo u vašem kodu. Imao sam potpuno isti problem prilikom prolaska kroz model.

Evo što se događa: Trenirate svoj model s predviđenom varijablom kao dijelom vašeg skupa podataka. Evo primjera onoga što mi se događalo, a da to nisam ni primijetio:

  df = pd.read_csv ('file.csv')
df.columns = ['COL1', 'COL2', 'COL3', 'COL4']
vlak_Y = vlak ['COL3']
vlak_X = vlak [vlak.kolone [: - 1]]
 

U ovom kodu želim predvidjeti vrijednost 'COL3' ... ali, ako pogledate train_X, kažem mu da dohvati svaki stupac osim zadnjeg, tako da njegovo unošenje COL1 COL2 i COL3, ne COL4, i pokušava predvidjeti COL3 koji je dio train_X.

To sam ispravio samo premještanjem stupaca, ručnim premještanjem COL3 u Excelu kako bi bio posljednji stupac u mom skupu podataka (koji se sada odvija u COL4), a zatim:

  df = pd.read_csv ('file.csv')
df.columns = ['COL1', 'COL2', 'COL3', 'COL4']
vlak_Y = vlak ['COL4']
vlak_X = vlak [vlak.kolone [: - 1]]
 

Ako ga ne želite premjestiti u Excel i želite to učiniti samo pomoću koda:

  df = pd.read_csv ('file.csv')
df.columns = ['COL1', 'COL2', 'COL3', 'COL4']
vlak_Y = vlak ['COL3']
vlak_X = vlak [vlak.columns ['COL1', 'COL2', 'COL4']]
 

Primijetite sada kako sam proglasio train_X, da uključim sve stupce osim COL3, koji je dio train_Y.

Nadam se da to pomaže.



Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...