de Avishek Nag (expert în învățare automată)

Clasificare multi-clasă cu Sci-kit learn & XGBoost: un studiu de caz folosind date Brainwave

O comparație a acurateței și performanței diferitelor clasificatoare pentru date de înaltă dimensiune

Clasificare multi clasa cu Sci kit learn XGBoost un studiu de
Credit foto: Pixabay

În învățarea automată, problemele de clasificare cu date de înaltă dimensiune sunt cu adevărat provocatoare. Uneori, problemele foarte simple devin extrem de complexe datorită acestei probleme a „blestemului dimensionalității”.

În acest articol, vom vedea cum variază acuratețea și performanța între diferiți clasificatori. Vom vedea, de asemenea, cum, atunci când nu avem libertatea de a alege un clasificator independent, putem face inginerie de caracteristici pentru a face ca un clasificator slab să funcționeze bine.

Înțelegerea „sursei de date” și formularea problemei

Pentru acest articol, vom folosi „EEG Brainwave Dataset” din Kaggle. Acest set de date conține semnale electronice de undă cerebrală de la o cască EEG și este în format temporal. La momentul scrierii acestui articol, nimeni nu a creat niciun „Kernel” pe acest set de date – adică, deocamdată, nu a fost dată nicio soluție în Kaggle.

Deci, pentru început, să citim mai întâi datele pentru a vedea ce este acolo.

ad-banner
Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Există 2549 coloane în setul de date și „etichetă” este coloana țintă pentru problema noastră de clasificare. Toate celelalte coloane precum „mean_d_1_a”, „mean_d2_a” etc. descriu caracteristicile citirilor semnalului undelor cerebrale. Coloanele care încep cu prefixul „fft” sunt cel mai probabil „transformate Fourier rapide” ale semnalelor originale. „Eticheta” coloanei noastre țintă descrie gradul sentimentului emoțional.

Conform Kaggle, iată provocarea: „Putem prezice sentimentul emoțional din lecturile de undă cerebrală?”

Să înțelegem mai întâi distribuțiile clasei din coloana „etichetă”:

1611530949 838 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de
Fig 1

Deci, există trei clase, „POZITIV”, „NEGATIV” și „NEUTRU”, pentru sentimentul emoțional. Din graficul cu bare, este clar că distribuția clasei nu este înclinată și este o problemă de „clasificare multi-clasă” cu variabila țintă „etichetă”. Vom încerca cu diferiți clasificatori și vom vedea nivelurile de precizie.

Înainte de a aplica orice clasificator, coloana „etichetă” trebuie separată de alte coloane de caracteristici („mean_d_1_a”, „mean_d2_a” etc. sunt caracteristici).

label_df = brainwave_df['label']brainwave_df.drop('label', axis = 1, inplace=True)brainwave_df.head()

Deoarece este o problemă de „clasificare”, vom respecta convențiile de mai jos pentru fiecare „clasificator” care trebuie încercat:

  1. Vom folosi o „validare încrucișată” (în cazul nostru vom folosi o validare încrucișată de 10 ori) asupra setului de date și vom lua o precizie medie. Acest lucru ne va oferi o imagine holistică a acurateței clasificatorului.
  2. Vom folosi o abordare bazată pe „Pipeline” pentru a combina toate procesele de pre-procesare și clasificarea principală. O „conductă” ML înfășoară toate etapele de procesare într-o singură unitate și acționează ca un „clasificator” în sine. Prin aceasta, toate etapele devin reutilizabile și pot fi introduse și în formarea altor „conducte”.
  3. Vom urmări timpul total în construcție și testare pentru fiecare abordare. Vom numi acest „timp luat”.

Pentru cele de mai sus, vom folosi în primul rând pachetul scikit-learn de la Python. Deoarece numărul de caracteristici de aici este destul de mare, va începe cu un clasificator care funcționează bine pe date de înaltă dimensiune.

Clasificator RandomForest

„RandomForest” este un clasificator de ansamblu bazat pe abordarea arborelui și a bagajelor. Acesta va reduce automat numărul de caracteristici prin abordarea sa probabilistică de calcul al entropiei. Să vedem că:

1611530949 940 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Precizia este foarte bună la 97,7%, iar „timpul total luat” este destul de scurt (doar 3,29 secunde).

Pentru acest clasificator, nu sunt necesare etape de pre-procesare, cum ar fi scalarea sau eliminarea zgomotului, deoarece este complet bazat pe probabilitate și nu este deloc afectat de factorii de scară.

Clasificator de regresie logistică

„Regresia logistică” este un clasificator liniar și funcționează la fel ca regresia liniară.

1611530950 33 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Putem vedea că precizia (93,19%) este mai mică decât „RandomForest” și „timpul necesar” este mai mare (2 min 7s).

„Regresia logistică” este puternic afectată de diferite intervale de valori între variabilele dependente, forțând astfel „scalarea caracteristicilor”. De aceea, „StandardScaler” din scikit-learn a fost adăugat ca etapă de preprocesare. Scalează automat caracteristicile în funcție de o distribuție Gaussiană cu varianță zero medie și unitate, și astfel valorile pentru toate variabilele variază de la -1 la +1.

Motivul timpului ridicat este dimensiunea ridicată și timpul de scalare necesar. Există 2549 de variabile în setul de date și coeficientul fiecăreia ar trebui optimizat conform procesului de regresie logistică. De asemenea, există o chestiune de multi-co-liniaritate. Aceasta înseamnă că variabilele corelate liniar ar trebui grupate în loc să le ia în considerare separat.

Prezența liniarității multi-col afectează precizia. Deci, acum întrebarea devine: „Putem reduce numărul de variabile, să reducem multi-co-liniaritatea și să îmbunătățim timpul necesar?”

Analiza componentelor principale (PCA)

PCA poate transforma variabilele originale de nivel scăzut într-un spațiu dimensional mai mare și astfel poate reduce numărul de variabile necesare. Toate variabilele co-liniare se îmbină. Să facem un PCA al datelor și să vedem care sunt principalele PC-uri:

1611530950 801 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Am mapat 2549 de variabile la 20 de componente principale. Din rezultatul de mai sus, este clar că primele 10 computere sunt o chestiune importantă. Procentul total al raportului de varianță explicat de primele 10 calculatoare este de aproximativ 0,737 (0,36 + 0,095 + .. + 0,012). Sau se poate spune că primele 10 computere explică o variație de 73,7% a întregului set de date.

Deci, cu aceasta putem reduce 2549 variabile la 10 variabile. E o schimbare dramatică, nu-i așa? În teorie, componentele principale sunt variabile virtuale generate de maparea matematică. Din punct de vedere al afacerii, nu este posibil să se indice ce aspect fizic al datelor este acoperit de acestea. Asta înseamnă, din punct de vedere fizic, că componentele principale nu există. Dar putem folosi cu ușurință aceste PC-uri ca variabile cantitative de intrare pentru orice algoritm ML și pentru a obține rezultate foarte bune.

Pentru vizualizare, să luăm primele două computere și să vedem cum putem distinge diferite clase de date folosind un „scatterplot”.

plt.figure(figsize=(25,8))sns.scatterplot(x=pca_vectors[:, 0], y=pca_vectors[:, 1], hue=label_df)plt.title('Principal Components vs Class distribution', fontsize=16)plt.ylabel('Principal Component 2', fontsize=16)plt.xlabel('Principal Component 1', fontsize=16)plt.xticks(rotation='vertical');
1611530951 13 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de
Fig. 2

În graficul de mai sus, trei clase sunt prezentate în culori diferite. Deci, dacă folosim același clasificator de „regresie logistică” cu aceste două PC-uri, atunci din graficul de mai sus putem spune probabil că primul clasificator va separa cazurile „NEUTRE” de alte două cazuri și al doilea clasificator va separa „POZITIV Cazuri „&„ NEGATIVE ”(deoarece vor exista două clasificatoare logistice interne pentru problema de 3 clase). Să încercăm să vedem acuratețea.

1611530951 423 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Timpul necesar (3,34 s) a fost redus, dar precizia (77%) a scăzut.

Acum, să luăm toate cele 10 computere și să rulăm:

1611530951 816 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Vedem o îmbunătățire a preciziei (86%) comparativ cu 2 cazuri PC, cu o creștere marginală a „timpului luat”.

Deci, în ambele cazuri am observat o precizie scăzută în comparație cu regresia logistică normală, dar o îmbunătățire semnificativă a „timpului necesar”.

Acuratețea poate fi testată în continuare cu un alt parametru „solver” și „max_iter”. Am folosit „saga” ca „solver” cu penalizare L1 și 200 ca „max_iter”. Aceste valori pot fi modificate pentru a obține un efect variabil asupra preciziei.

Deși „Regresia logistică” oferă o precizie redusă, există situații în care ar putea fi necesară în special cu PCA. În seturile de date cu un spațiu dimensional foarte mare, PCA devine alegerea evidentă pentru „clasificatori liniari”.

În unele cazuri, în care un punct de referință pentru aplicațiile ML este deja definit și sunt disponibile doar opțiuni limitate ale unor „clasificatori liniari”, această analiză ar fi utilă. Este foarte frecvent să se vadă astfel de situații în organizațiile mari în care standardele sunt deja definite și nu este posibil să se depășească acestea.

Clasificator de rețea neuronală artificială (ANN)

Un clasificator ANN este neliniar cu tehnici de inginerie automată a caracteristicilor și tehnici de reducere dimensională. „MLPClassifier” în scikit-learn funcționează ca ANN. Dar și aici este necesară scalarea de bază pentru date. Să vedem cum funcționează:

1611530952 877 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Precizia (97,5%) este foarte bună, deși timpul de funcționare este ridicat (5 minute).

Motivul pentru „timpul necesar” ridicat este timpul de antrenament riguros necesar pentru rețelele neuronale și, de asemenea, cu un număr mare de dimensiuni.

Este o convenție generală să începeți cu o dimensiune a stratului ascuns de 50% din dimensiunea totală a datelor, iar straturile ulterioare vor fi 50% din precedentul. În cazul nostru acestea sunt (1275 = 2549/2, 637 = 1275/2). Numărul de straturi ascunse poate fi luat ca hiper-parametru și poate fi reglat pentru o precizie mai bună. În cazul nostru este 2.

Clasificator de mașini vectoriale de asistență liniară (SVM)

Vom aplica acum „Linear SVM” pe date și vom vedea cum vine precizia. Aici este necesară și scalarea ca etapă de preprocesare.

1611530952 427 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Precizia se ridică la 96,4%, ceea ce este puțin mai mic decât „RandomForest” sau „ANN”. „timpul necesar” este de 55 s, ceea ce este mult mai bun decât „ANN”.

Clasificator de creștere a gradientului extrem (XGBoost)

XGBoost este un clasificator de ansamblu bazat pe arbore. La fel ca „RandomForest”, va reduce automat setul de caracteristici. Pentru aceasta trebuie să folosim o bibliotecă separată „xgboost” care nu vine cu scikit-learn. Să vedem cum funcționează:

1611530952 837 Clasificare multi clasa cu Sci kit learn XGBoost un studiu de

Precizia (99,4%) este excepțional de bună, dar „timpul necesar” (15 minute) este destul de ridicat. În zilele noastre, pentru probleme complicate, XGBoost devine o alegere implicită pentru Data Scientists pentru rezultatele sale exacte. Are un timp de funcționare ridicat datorită structurii interne a modelului de ansamblu. Cu toate acestea, XGBoost funcționează bine pe mașinile GPU.

Concluzie

Din toți clasificatorii, este clar că pentru acuratețe câștigă „XGBoost”. Dar dacă luăm „timp luat” împreună cu „acuratețe”, atunci „RandomForest” este o alegere perfectă. Dar am văzut și cum să folosim un clasificator liniar simplu, cum ar fi „regresia logistică”, cu o inginerie adecvată a caracteristicilor, pentru a oferi o precizie mai bună. Alți clasificatori nu au nevoie de atât de mult efort de inginerie.

Depinde de cerințe, caz de utilizare și mediu de inginerie a datelor disponibile pentru a alege un „clasificator” perfect.

Întregul proiect de pe Jupyter NoteBook poate fi găsit aici.

Referințe:

[1] Documentație XGBoost – https://xgboost.readthedocs.io/en/latest/

[2] Lucrări RandomForest – http://dataaspirant.com/2017/05/22/random-forest-algorithm-machine-learing/

[3] Analiza componentelor principale – https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c

[4] Regresie logistică – http://ufldl.stanford.edu/tutorial/supervised/LogisticRegression/

[5] Suport pentru mașini vectoriale – https://towardsdatascience.com/support-vector-machine-introduction-to-machine-learning-algorithms-934a444fca47