Acest articol discută despre Dummy Variable Trap care rezultă din problema multicoliniarității

Krishna Kumar Mahto

8 iul.2019 · 11 min de citire

Până acum, fiecare subiect nou din învățarea automată pe care l-am preluat avea ceva ce nu mai văzusem până acum. Dar nu doar subiectele nevăzute, ci subiectele prin care trecusem odinioară aveau ceva care îmi alunecase din cap. Dummy Variable Trap este unul dintre astfel de detalii pe care uitasem complet că există până când m-am întors la realizarea unui clasificator cu 3-4 luni înainte.

capcană

Înainte de a începe cu conținutul exact al Dummy Variable Trap, iată câțiva termeni cu care trebuie să fim familiarizați. Definițiile formale pot fi googulate, așa că voi prezenta o descriere informală care ar trebui să fie suficientă pentru contextul acestui articol.

Variabile categorice

Variabilele categorice sunt cele care pot lua valori dintr-un set finit. Pentru astfel de variabile, valorile pe care le iau pot avea o ordonare intrinsecă (de exemplu, viteza:). Astfel de variabile sunt numite variabile categorice ordinale. Pe de altă parte, este posibil ca unele variabile categorice să nu aibă nicio ordonare intrinsecă (de exemplu, gen:). Astfel de variabile categorice sunt numite variabile categorice nominale.

Dacă sunteți conștient de practica obișnuită de codificare a variabilelor categorice în numere, știți că adesea este sugerat să le obțineți codificate One-hot-coded. Există două motive pentru aceasta:

  1. Majoritatea algoritmilor de învățare automată nu pot funcționa direct cu variabile categorice, trebuie să fie convertiți în numere.
  2. Chiar dacă găsim o modalitate de a lucra direct cu variabile categorice fără a le converti în numere, modelul nostru va fi părtinitor față de limbajul pe care îl folosim. De exemplu, într-o sarcină de clasificare a animalelor, dacă etichetele sunt, atunci folosirea unei astfel de metode de etichetare ar antrena modelul nostru să prezică etichetele numai în limba engleză, ceea ce ar pune o restricție lingvistică asupra posibilelor aplicații ale modelului.

Pentru a le ocoli, putem codifica valorile variabilei categorice la numere după cum urmează:

Cazul 1:

Variabila categorică ordinală Viteză (așa cum este citat mai sus) poate fi codificată ca:

Cazul 2:

Pentru sarcina de clasificare a animalelor (citată mai sus), variabila etichetă, care este o variabilă categorică nominală, poate fi codificată ca:

Există o problemă majoră cu acest lucru - etichetele din problema clasificării animalelor nu ar trebui codificate în numere întregi (așa cum am făcut mai sus), deoarece aceasta ar impune o ordonare naturală aparent incorectă a: „șobolanul” înțelege intuitiv acest lucru. Dacă introducem aceste numere direct într-un model, este probabil ca funcția cost/pierdere să fie afectată de aceste valori. Trebuie să modelăm matematic această înțelegere a noastră. One-hot-coding este modul în care o facem.

Viteza este o variabilă ordinală. Putem argumenta că relația: „scăzut” scăzut ”,„ mediu ”și„ înalt ”au. Nu este nimic special în utilizarea 1, 2 și 3. Cu alte cuvinte, nu știm cât de mare este o viteză de „medie” decât viteza de „mică” și cât de mică este comparată cu o viteză „mare”. Diferența dintre aceste etichete poate afecta potențial modelul pe care îl antrenăm. Așadar, s-ar putea să dorim să codificăm singura variabila „viteză”.

În acest moment, sper să înțelegem despre ce variabile categorice sunt vorba și de ce am dori să le codificăm cu o singură dată.

Multicoliniaritate

Multicoliniaritatea apare atunci când două sau mai multe variabile independente (alias caracteristici) din setul de date sunt corelate între ele. Există mai multe metode prin care putem măsura gradul și direcția de corelație pentru cazurile bivariate (mai multe informații despre măsurile de corelație), în timp ce multicolinearitatea este în general măsurată folosind factorul de inflație a variației (mai multe informații despre măsurile de multicoliniaritate). Pe scurt, se spune că multicoliniaritatea există într-un set de date atunci când variabilele independente sunt (aproape) legate liniar între ele.

Cazuri precum cele prezentate în Fig. 1. se numesc Multicoliniaritate perfectă. La fel, avem și cazuri de multicoliniaritate imperfectă, în care una sau mai multe relații foarte liniare pot fi preocuparea noastră. Acestea au un impact direct asupra analizei de regresie liniară (consultați aceste note de curs pentru mai multe informații despre aceasta). Cu toate acestea, vom discuta impactul acestora din punctul de vedere al oricărui algoritm general de învățare automată.

În acest moment, sper să înțelegem ce este multicoliniaritatea.

OneHotEncoding în Python

Înainte de a trece la ultima parte a acestui articol, să aruncăm o privire asupra modului în care putem codifica variabile categorice.

One-hot-encoder returnează un vector pentru fiecare valoare unică a coloanei categorice. Fiecare astfel de vector conține doar un „1”, în timp ce toate celelalte valori din vector sunt „0” (găsiți fig. 4 de mai jos), deci numele one-hot-encoder.

Probabil, ar trebui să existe și pachete în limba aleasă de dvs., dar din moment ce am folosit Python pentru toate lucrurile legate de învățarea automată și știința datelor, includ doar fragmente din consola Python. În următoarea discuție, voi cita biblioteca pandelor Python după porecla populară, „pd” și numpy ca „np”.

Folosesc un obiect pd.DataFrame realizat de sine, care arată ca:

„Viteza” este o variabilă categorică, în timp ce coloana „numerică” este o coloană necategorică.

Să presupunem că lucrăm la un proiect și decidem să codificăm cu o singură dată coloana „viteză”.

Metoda 1: pd.get_dummies

pd.get_dummies (documentație) returnează un nou cadru de date care conține coloane codificate la cald. Putem observa că nu toate coloanele au fost codificate. Acest lucru se datorează faptului că, dacă nu sunt trecute coloane către pd.get_dummies, astfel încât să se spună ce coloane să fie codificate cu un singur fierbinte, implicit ia coloanele cu „obiect” de tip date. Apoi le codifică și returnează un nou cadru de date cu coloane noi care înlocuiesc vechea coloană categorică. În fig. 3, putem vedea că coloana „viteză” este de tip „obiect”. FIG. 4. arată că această coloană nu mai există în cadrul de date returnat și a fost înlocuită cu coloane noi. De asemenea, putem observa că „scăzut” a fost mapat la un vector: scăzut -> [0, 1, 0] și, în mod similar, mediu -> [0, 0, 1] și ridicat -> [1, 0, 0] . Observați că fiecare vector are un singur „1” în el. De asemenea, observați că fiecare vector este tridimensional. Acest lucru se datorează faptului că „viteza” are trei valori unice. De fapt, numărul de dimensiuni ale vectorilor one-hot este egal cu numărul de valori unice pe care coloana categorică le ia în setul de date. Aici, codificarea a fost făcută astfel încât 1 în primul rând al unui vector înseamnă „viteză = mare”, 1 în al doilea loc înseamnă „viteză = scăzut” și așa mai departe.

Metoda 2: sclearn.preprocessing.OneHotEncoder

Prefer să folosesc sklearn.preprocessing.OneHotEncoder în loc de pd.get_dummies Acest lucru se datorează faptului că sklearn.preprocessing.OneHotEncoder returnează un obiect din clasa sklearn.preprocessing.OneHotEncoder. Putem încadra acest obiect pe setul de antrenament și apoi putem folosi același obiect pentru a transforma setul de testare. Pe de altă parte, pd.get_dummies returnează un cadru de date cu codificări bazat pe valorile din cadrul de date pe care i-l transmitem. Acest lucru ar putea fi bun pentru o analiză rapidă, dar pentru un proiect extins de construcție de modele în care vă instruiți pe un set de antrenament și veți testa ulterior pe un set de testare, aș sugera utilizarea sklearn.preprocessing.OneHotEncoder.

Utilizarea sklearn.preprocessing.OneHotEncoder nu este la fel de simplă ca utilizarea pd.get_dummies. Putem vedea acest lucru în fig. 5 de mai jos.

Este posibil să fi observat că am făcut mai întâi codificarea în întregime a coloanei categorice folosind LabelEncoder. Acest lucru se datorează faptului că OneHotEncoder necesită coloanelor categorice să conțină etichete numerice. Potrivirea, precum și metodele de transformare necesită trecerea obiectelor np.array cu formă (m, n). În cele din urmă, metoda de ajustare returnează un obiect OneHotEncoder care este montat pe datele transmise acestuia. Procesul este lung, dar ajungeți la un obiect montat, care poate fi utilizat ulterior pe setul de testare. Scikit-learn vine cu o versiune combinată pentru metodele fit și transform- fit_transform care ajută la reducerea unei linii sau două din codul dvs. (consultați documentația).

Capcană variabilă fictivă

Capcana variabilă falsă se manifestă direct dintr-o codare la cald aplicată pe variabile categorice. După cum s-a discutat mai devreme, dimensiunea vectorilor one-hot este egală cu numărul de valori unice pe care le ia o coloană categorică și fiecare astfel de vector conține exact un ‘1’ în el. Acest lucru ingerează multicoliniaritatea în setul nostru de date. Din setul de date codificat din fig. 4 (care este echivalent cu setul de date codificat din fig. 5), putem observa următoarea relație liniară (fig. 6):

FIG. 6 este un caz de multicoliniaritate perfectă. Vectorii pe care îi folosim pentru a codifica coloanele categorice se numesc „Variabile manechine”. Am intenționat să rezolvăm problema utilizării variabilelor categorice, dar am fost prinși de problema multicoliniarității. Aceasta se numește Capcană Variabilă Dummy.

Așa cum am menționat anterior, acest lucru are un impact direct asupra analizei de regresie liniară, deoarece regresia liniară presupune inexistența multicoliniarității în setul de date. Cu toate acestea, pune și alte probleme în sarcinile de învățare automată. Să spunem, pregătim un model de regresie logistică pe setul de date. Ne-am aștepta ca modelul nostru să învețe greutăți pentru următoarea ecuație:

În special, pentru caracteristicile pe care le avem în setul nostru de date, următoarele sunt ponderile pe care le-ar învăța regresia logistică:

Și vectorul de caracteristici X este:

În mod clar, puterea funcției exponențiale în numitorul funcției sigmoide este cea care afectează de fapt valoarea y_hat și conține greutăți antrenabile. Această expresie se extinde de fapt la:

Din relația din fig. 6, putem exprima oricare dintre cele trei variabile independente în termeni de celelalte două, să luăm speed_low în LHS și să o exprimăm în termeni de speed_medium și speed_high:

După cum am discutat mai devreme, acest lucru are o implicație directă asupra unei probleme de regresie liniară. Ceea ce urmează este, prin urmare, un rezumat al problemelor care este general pentru toți algoritmii.

Întrucât codarea cu o singură pornire induce direct multicoliniaritatea perfectă, renunțăm la una dintre coloane din caracteristicile codificate. De exemplu, putem alege să renunțăm la speed_medium în acest caz, dar alegerea este complet arbitrară.

Următorul este modul în care putem gestiona acest lucru (renunțând la una dintre coloanele codificate):

  1. Când folosim pd.get_dummies, putem trece un argument suplimentar, drop_first = True (documentare) pentru a renunța la prima nouă coloană pe care o obținem după codificare (alias, prima variabilă fictivă) (fig. 7):

Comparați cadrul de date returnat în fig. 7 cu ieșirea pe care am obținut-o în fig. 4. Vedem că speed_high este scăzut din cadrul de date codificat. Dacă nu utilizați drop_first = Adevărat, sklearn va folosi atribuirea implicită pentru acest parametru, care este False.

2. Când folosim sklearn.preprocessing.OneHotEncoder și dorim să renunțăm la una dintre noile coloane, trecem argumentul drop = ‘first’ constructor al clasei OneHotEncoder (documentație). Cu toate acestea, acest lucru nu pare să accepte toate versiunile de sklearn (am primit o eroare deoarece versiunea mea de sklearn.preprocessing.OneHotEncoder nu acceptă parametrul „drop”), deci este posibil să trebuiască să actualizați pachetul Python înainte de al putea folosi pe sistemul dvs.. Deși puteți renunța manual la una dintre variabilele false, scriind manual o linie sau două (fig. 8), poate fi dificil să urmăriți modificările aduse cadrului dvs. de date în cazurile în care aveți mai multe coloane categorice și prea multe categorii din fiecare coloană categorică cu care să lucrați.

Cadrul de date returnat prin transformare (sau, fit_transform) adaugă noile coloane înainte de toate celelalte coloane (fig. 8). Deci, pentru a renunța la prima coloană, putem folosi matrițarea așa cum se arată în fig. 8. Totuși, a face acest lucru poate deveni neîndemânatic, așa cum am menționat deja.

Concluzie

Sper că acest articol a fost capabil să ofere o descriere cuprinzătoare a multicoliniarității, codificării cu o singură temperatură și capcanei variabile fictive. Articolul se bazează în întregime pe experiența mea personală cu fapte preluate din surse fiabile (link-uri deja menționate alături de fiecare astfel de concept). Deci, comentați mai jos dacă găsiți discrepanțe în articol. Feedback-ul dvs. m-ar ajuta să scriu și să descriu mai bine. Așteptăm cu nerăbdare să auzim vești de la dumneavoastră.