(sau: cum să utilizați corect xgboost din R)

R are codificare „one-hot” ascunsă în majoritatea căilor sale de modelare. Întrebarea unui utilizator R unde se utilizează o codificare la cald este ca și cum ai întreba un pește unde este apă; ei nu pot indica acest lucru așa cum este peste tot.

codificarea

De exemplu, putem vedea dovezi ale unei codificări one-hot în numele variabilelor alese printr-o regresie liniară:

O mare parte din codificarea în R se bazează în esență pe „contraste” implementate în statistici: model.matrix () Notă: nu utilizați base: data.matrix () sau utilizați hashing înainte de modelare - s-ar putea să scăpați de ele (în special cu metode bazate pe arbori), dar nu sunt în general o tehnică bună așa cum arătăm mai jos:

stats: model.matrix () nu stochează planul său one-hot într-un mod convenabil (poate fi dedus prin tragerea atributului „contraste” plus examinarea numelor coloanelor primei codificări, dar nivelurile identificate nu sunt reprezentate convenabil ). Când aplicați direct statistici: model.matrix () nu puteți presupune în siguranță aceeași formulă aplicată la două seturi de date diferite (de exemplu tren și aplicație sau test) utilizează aceeași codificare! Demonstrăm acest lucru mai jos:

Codarea defectuoasă de mai sus poate fi un defect critic atunci când construiți un model și apoi îl utilizați ulterior pe date noi (fie date de validare încrucișată, date de testare sau date de aplicație viitoare). Mulți utilizatori R nu sunt familiarizați cu problema de mai sus, deoarece codificarea este ascunsă în formarea modelului, iar modul de codificare a datelor noi este stocat ca parte a modelului. Utilizatorii Python scikit-learn care vin la R întreabă deseori „unde este codificatorul one-hot” (întrucât nu se discută atât de mult în R cât și în scikit-learn) și chiar furnizează un număr de (de calitate scăzută) one- off packages "portarea unei codificări one-hot în R."

Locul principal în care un utilizator R are nevoie de un codificator adecvat (și anume este un codificator care își stochează planul de codificare într-o formă reutilizabilă convenabil, pe care multe dintre pachetele „purtate unic din Python” nu reușesc să le facă) o implementare de învățare automată care nu este complet centrică pe R. Un astfel de sistem este xgboost care necesită (așa cum este tipic învățarea automată în scikit-learn) datele să fie deja codificate ca o matrice numerică (în loc de o structură eterogenă, cum ar fi un cadru de date). Acest lucru necesită o conversie explicită din partea utilizatorului R și mulți utilizatori R greșesc (nu reușesc să stocheze planul de codificare undeva). Pentru a face acest lucru concret, să lucrăm un exemplu simplu.

Să încercăm setul de date Titanic pentru a vedea codificarea în acțiune. Notă: nu lucrăm din greu la acest exemplu (cum ar fi adăugarea de variabile suplimentare derivate din aspectul cabinei, comunitatea numelor și alte transformări sofisticate ale caracteristicilor) - doar conectarea variabilei evidente la xgboost. Așa cum am spus: xgboost necesită o matrice numerică pentru intrarea sa, așa că, spre deosebire de multe metode de modelare R, trebuie să gestionăm singuri datele care codifică (în loc să lăsăm asta la R, care adesea ascunde planul de codificare în modelul instruit). De asemenea, rețineți: diferențele observate în performanță care sunt sub nivelul de zgomot de eșantionare nu ar trebui să fie considerate semnificative (de exemplu, toate metodele prezentate aici au fost realizate aproximativ la fel).

Aducem datele noastre:

Și proiectați experimentul nostru de modelare validat încrucișat:

Modul nostru preferat de a codifica date este să folosim pachetul vtreat în modul „fără variabile” prezentat mai jos (diferind de modurile puternice „conștientizate de y” pe care le predăm de obicei).

Modelul matrice poate efectua o codificare similară atunci când avem doar un singur set de date.

Pachetul Caret furnizează, de asemenea, o funcționalitate de codificare împărțită în mod corespunzător între antrenament (caret: dummyVars ()) și aplicație (numită predict ()).

De obicei, uităm să învățăm vtreat: designTreatmentsZ () deoarece este adesea dominat de metodele mai puternice conștientizate de y pentru vtreat (deși nu pentru acest exemplu simplu). vtreat: designTreatmentsZ are o serie de proprietăți utile:

  • Nu analizează valorile rezultatelor, deci nu necesită o atenție suplimentară în validarea încrucișată.
  • Salvează codarea acestuia, deci poate fi utilizat corect pe date noi.

Cele două proprietăți de mai sus sunt partajate cu caret: dummyVars (). Caracteristicile suplimentare ale vtreat: designTreatmentsZ (care diferă de opțiunile caret: dummyVars ()) includ:

  • Nu sunt trecute valori NA prin vtreat: prepare () .
  • Prezența NA este adăugată ca o coloană informativă suplimentară.
  • Câteva coloane derivate (cum ar fi punerea în comun a nivelurilor rare sunt puse la dispoziție).
  • Variabilele rare fictive sunt tăiate (sub un prag controlat de utilizator) pentru a preveni explozia de codificare.
  • Niveluri noi (niveluri care apar în timpul testului sau aplicării, dar nu în timpul antrenamentului) sunt trecute în mod deliberat ca „fără nivel de antrenament activat” de vtreat: prepare () (caret: dummyVars () consideră că este o eroare).

Metodele vtreat conștiente de y includ o modelare adecvată imbricată și reducerea dimensiunii conștiente de y.

vtreat este conceput „să funcționeze întotdeauna” (returnează întotdeauna un cadru de date numeric pur, fără valori lipsă). De asemenea, excelează în situațiile de „date mari” în care statisticile pe care le poate colecta asupra variabilelor categorice cu cardinalitate ridicată pot avea un impact pozitiv imens în modelarea performanței. În multe cazuri, vtreat funcționează în jurul problemelor care elimină analiza conductelor (cum ar fi descoperirea de noi niveluri variabile în timpul testului sau aplicării). Învățăm vtreat sore de „bimodal” atât în ​​modul „foc și uită”, cât și în modul „toate detaliile de pe punte” (potrivit pentru citarea formală). Oricum, vtreat vă poate face procedurile de modelare mai puternice, mai fiabile și mai ușoare.

Toate codurile pentru acest articol pot fi găsite aici.