Convertiți o variabilă categorică în număr pentru construirea modelului de învățare automată

Baijayanta Roy

16 iulie 2019 · 13 min citit

Ultima actualizare: 12 februarie 2020

totul

Majoritatea algoritmilor de învățare automată nu pot gestiona variabilele categorice decât dacă le convertim în valori numerice. Performanțele multor algoritmi variază în funcție de modul în care sunt codificate variabilele categorice.

Variabilele categorice pot fi împărțite în două categorii: Nominală (fără ordine specială) și Ordinală (unele ordonate).

Câteva exemple ca mai jos pentru variabila nominală:

  • Roșu, galben, roz, albastru
  • Singapore, Japonia, SUA, India, Coreea
  • Vaca, câine, pisică, șarpe

Exemplu de variabile ordinale:

  • Înalt, mediu, scăzut
  • „Sunt de acord”, sunt de acord, neutru, nu sunt de acord și „nu sunt de acord”.
  • Excelent, bine, rău

Există multe modalități prin care putem codifica aceste variabile categorice ca numere și le putem utiliza într-un algoritm. Pe cele mai multe le voi acoperi de la cele de bază la cele mai avansate în această postare. Voi cuprinde aceste codificări:

1) O codare la cald
2) Codificare etichetă
3) Codificare ordinală
4) Codificare Helmert
5) Codare binară
6) Codificare de frecvență
7) Codificare medie
8) Greutatea codificării dovezilor
9) Codificarea raportului de probabilitate
10) Codare Hashing
11) Codificare diferență inversă
12) Lăsați codificarea One Out
13) Codificare James-Stein
14) Codificare M-estimator

15) Codificator termometru (Se actualizează)

Pentru planificarea e x, voi folosi acest cadru de date, care are două variabile sau caracteristici independente (temperatură și culoare) și o etichetă (țintă). De asemenea, are Rec-No, care este un număr de ordine al înregistrării. Există un total de 10 înregistrări în acest cadru de date. Codul Python ar arăta ca mai jos.

Vom folosi Pandas și Scikit-learn și category_encoders (biblioteca de contribuții Scikit-learn) pentru a afișa diferite metode de codificare în Python.

În această metodă, mapăm fiecare categorie la un vector care conține 1 și 0 denotând prezența sau absența caracteristicii. Numărul de vectori depinde de numărul de categorii pentru caracteristici. Această metodă produce o mulțime de coloane care încetinesc semnificativ învățarea dacă numărul categoriei este foarte mare pentru caracteristică. Pandas are get_dummies funcție, care este destul de ușor de utilizat. Pentru eșantionul cadrului de date ar fi după cum urmează:

Scikit-learn are OneHotEncoder în acest scop, dar nu creează o coloană de caracteristici suplimentare (este necesar un alt cod, așa cum se arată în exemplul de cod de mai jos).

O codare la cald este foarte populară. Putem reprezenta toate categoriile prin N-1 (N = nr de categorie), deoarece este suficient pentru a codifica pe cea care nu este inclusă. De obicei, pentru Regresie, folosim N-1 (aruncați prima sau ultima coloană a unei caracteristici noi codate la cald), dar pentru clasificare, recomandarea este să utilizați toate cele N coloane, deoarece majoritatea algoritmului bazat pe arbori construiește un arbore bazat pe toate variabilele disponibile. O reglare la cald cu variabile binare N-1 ar trebui utilizată în regresie liniară, pentru a asigura numărul corect de grade de libertate (N-1). Regresia liniară are acces la toate caracteristicile pe măsură ce este antrenată și, prin urmare, examinează întregul set de variabile fictive. Aceasta înseamnă că variabilele binare N-1 oferă informații complete despre (reprezintă complet) variabila categorică originală regresiei liniare. Această abordare poate fi adoptată pentru orice algoritm de învățare automată care privește TOATE caracteristicile în același timp în timpul antrenamentului. De exemplu, susțineți mașini vectoriale și rețele neuronale, precum și algoritmi de grupare.

În metodele bazate pe copaci, nu vom lua în considerare niciodată eticheta suplimentară dacă renunțăm. Astfel, dacă folosim variabilele categorice într-un algoritm de învățare bazat pe copaci, este o bună practică pentru a-l codifica în N variabile binare și nu renunțați.

În această codificare, fiecărei categorii i se atribuie o valoare de la 1 la N (aici N este numărul de categorii pentru caracteristică. O problemă majoră cu această abordare este că nu există nicio relație sau ordine între aceste clase, dar algoritmul le-ar putea considera ca fiind o anumită ordine sau există o relație. În exemplul de mai jos poate arăta ca (Cold

Panda factorizează îndeplinește, de asemenea, aceeași funcție.

Facem codificare ordinală pentru a ne asigura că codificarea variabilelor păstrează natura ordinală a variabilei. Acest lucru este rezonabil numai pentru variabilele ordinale, așa cum am menționat la începutul acestui articol. Această codificare arată aproape similară cu codificarea etichetei, dar ușor diferită, deoarece codificarea etichetei nu ar lua în considerare dacă variabila este ordinală sau nu și va atribui secvența de numere întregi

  • conform ordinii datelor (Pandele atribuite Hot (0), Cold (1), „Very Hot” (2) și Warm (3)) sau
  • conform ordinii ordonate alfabetic (scikit-learn atribuit Cold (0), Hot (1), „Very Hot” (2) și Warm (3)).

Dacă considerăm în scala de temperatură ca ordine, atunci valoarea ordinală ar trebui de la rece la „Foarte fierbinte. „Codificarea ordinală va atribui valori ca (Rece (1)

Deși este foarte simplu, necesită codificare pentru a spune valorile ordinale și care este cartarea reală de la text la un număr întreg conform ordinii.

În această codificare, media variabilei dependente pentru un nivel este comparată cu media variabilei dependente pentru toate nivelurile anterioare.

Versiunea din categoria_encodere este uneori denumită Reverse Helmert Coding. Media variabilei dependente pentru un nivel este comparată cu media variabilei dependente pentru toate nivelurile anterioare. Prin urmare, numele „invers” este folosit pentru a diferenția de codarea Helmert directă.

Codificarea binară convertește o categorie în cifre binare. Fiecare cifră binară creează o coloană de caracteristici. Dacă există n categorii unice, atunci codarea binară are ca rezultat singurele caracteristici jurnal (baza 2) ⁿ. În acest exemplu, avem patru caracteristici; astfel, numărul total de caracteristici codate binare va fi de trei caracteristici. Comparativ cu One Hot Coding, acest lucru va necesita mai puține coloane de caracteristici (pentru 100 de categorii One Hot Encoding va avea 100 de caracteristici, în timp ce pentru codarea binară, vom avea nevoie de doar șapte caracteristici).

Pentru codificarea binară, trebuie să urmați pașii următori:

  • Categoriile sunt mai întâi convertite în ordine numerică începând de la 1 (ordinea este creată pe măsură ce categoriile apar într-un set de date și nu înseamnă nicio natură ordinală)
  • Apoi, acei numere întregi sunt convertite în cod binar, deci de exemplu 3 devine 011, 4 devine 100
  • Apoi cifrele numărului binar formează coloane separate.

Consultați diagrama de mai jos pentru o mai bună intuiție.

Pentru aceasta vom folosi pachetul category_encoders, iar numele funcției este BinaryEncoder.

Este o modalitate de a utiliza frecvența categoriilor ca etichete. În cazurile în care frecvența este oarecum legată de variabila țintă, ajută modelul să înțeleagă și să atribuie ponderea în proporție directă și inversă, în funcție de natura datelor. Trei etape pentru aceasta:

  • Selectați o variabilă categorică pe care doriți să o transformați
  • Grupați după variabila categorică și obțineți numărătoarele fiecărei categorii
  • Alăturați-l din nou cu setul de date de antrenament

Codul panda poate fi construit după cum urmează:

Codificarea medie sau codificarea țintă este o abordare de codificare virală urmată de Kagglers. Există multe variante ale acestui lucru. Aici voi acoperi versiunea de bază și versiunea de netezire. Codificarea medie este similară cu codificarea etichetelor, cu excepția cazului în care etichetele sunt corelate direct cu ținta. De exemplu, în codificarea țintă medie pentru fiecare categorie din eticheta caracteristică se decide cu valoarea medie a variabilei țintă pe date de antrenament. Această metodă de codificare scoate în evidență relația dintre categorii similare, dar conexiunile sunt delimitate în cadrul categoriilor și vizează în sine. Avantajele codificării țintă medii sunt că nu afectează volumul datelor și ajută la învățarea mai rapidă. De obicei, codificarea medie este notorie pentru supra-montare; astfel, o regularizare cu validare încrucișată sau o altă abordare este o necesitate în majoritatea cazurilor. Abordarea medie de codificare este următoarea:

  1. Selectați o variabilă categorică pe care doriți să o transformați

2. Grupați după variabila categorică și obțineți suma cumulată peste variabila „Țintă”. (numărul total de 1 pentru fiecare categorie din „Temperatură”)

3. Grupați după variabila categorică și obțineți un număr agregat peste variabila „Țintă”

4. Împărțiți rezultatele pasului 2/pasului 3 și uniți-l înapoi cu trenul.

Exemplu de cod pentru cadrul de date:

Codificarea medie poate încorpora ținta în etichetă, în timp ce codificarea etichetei nu se corelează cu ținta. În cazul unui număr mare de caracteristici, codificarea medie ar putea fi o alternativă mult mai simplă. Codificarea medie tinde să grupeze clasele, în timp ce gruparea este aleatorie în cazul codificării etichetelor.

Există multe variante ale acestei codificări țintă în practică, cum ar fi netezirea. Netezirea poate fi implementată după cum urmează:

Greutatea dovezilor (WoE) este o măsură a „puterii” a unei tehnici de grupare pentru a separa binele și răul. Această metodă a fost dezvoltată în primul rând pentru a construi un model predictiv pentru a evalua riscul de neîndeplinire a creditelor în industria creditelor și financiară. Ponderea dovezilor (WOE) este o măsură a valorii probelor susține sau subminează o ipoteză.

Se calculează după cum urmează:

WoE va fi 0 dacă P (Bunuri)/P (Bads) = 1. Asta dacă rezultatul este aleatoriu pentru grupul respectiv. Dacă P (Bads)> P (Goods) raportul de cote va fi P (Bads) într-un grup, atunci WoE> 0.

WoE este potrivit pentru regresia logistică, deoarece transformarea Logit este pur și simplu jurnalul cotelor, adică ln (P (Bunuri)/P (Bads)). Prin urmare, prin utilizarea predictorilor codați WoE în regresia logistică, predictorii sunt toți pregătiți și codificați la aceeași scară. Parametrii din ecuația de regresie logistică liniară pot fi comparați direct.

Transformarea WoE are (cel puțin) trei avantaje:
1) Poate transforma o variabilă independentă astfel încât să stabilească o relație monotonă cu variabila dependentă. Face mai mult decât atât - pentru a asigura o relație monotonă ar fi suficient să o „recodăm” la orice măsură ordonată (de exemplu 1,2,3,4 ...), dar transformarea WoE ordonă categoriile pe o scară „logistică” care este firesc pentru regresia logistică
2) Pentru variabilele cu prea multe valori discrete (slab populate), acestea pot fi grupate în categorii (dens populate), iar WoE poate fi utilizat pentru a exprima informații pentru întreaga categorie
3) Efectul (univariat) al fiecărei categorii asupra variabilei dependente poate fi comparat între categorii și variabile, deoarece WoE este o valoare standardizată (de exemplu, puteți compara WoE a persoanelor căsătorite cu WoE a lucrătorilor manuali)

De asemenea, are (cel puțin) trei dezavantaje:
1) Pierderea de informații (variație) din cauza binningului la câteva categorii
2) Este o măsură „univariantă”, deci nu ia în considerare corelația dintre variabilele independente
3) Este ușor de manipulat (supra-ajustat) efectul variabilelor în funcție de modul în care sunt create categoriile

Sub cod, fragmente explică modul în care se poate construi cod pentru a calcula WoE.

Odată ce calculăm WoE pentru fiecare grup, îl putem înregistra pe acest cadru de date.