Încorporarea în învățarea automată: simplificarea datelor complexe

Publicat: 2022-03-11

Lucrul cu date non-numerice poate fi dificil, chiar și pentru oamenii de știință de date cu experiență. Un model tipic de învățare automată se așteaptă ca caracteristicile sale să fie numere, nu cuvinte, e-mailuri, pagini de site-uri web, liste, grafice sau distribuții de probabilitate. Pentru a fi utile, datele trebuie mai întâi transformate într-un spațiu vectorial. Dar cum?

O abordare populară ar fi tratarea unei trăsături nenumerice ca fiind categorială . Acest lucru ar putea funcționa bine dacă numărul de categorii este mic (de exemplu, dacă datele indică o profesie sau o țară). Cu toate acestea, dacă încercăm să aplicăm această metodă e-mail-urilor, probabil că vom obține atâtea categorii câte mostre există. Nu există două e-mailuri exact la fel, prin urmare această abordare nu ar fi de niciun folos.

O altă abordare ar fi definirea unei distanțe între eșantioanele de date , o funcție care ne spune cât de aproape sunt două mostre. Sau am putea defini o măsură de similaritate , care ne-ar oferi aceleași informații, cu excepția faptului că distanța dintre două eșantioane apropiate este mică, în timp ce asemănarea este mare. Calcularea distanței (similarității) între toate eșantioanele de date ne-ar oferi o matrice de distanță (sau similaritate). Acestea sunt date numerice pe care le-am putea folosi.

Cu toate acestea, aceste date ar avea atâtea dimensiuni câte mostre există, ceea ce de obicei nu este grozav dacă vrem să le folosim ca o caracteristică (vezi blestemul dimensionalității) sau să o vizualizăm (în timp ce o parcelă poate gestiona chiar și 6D, am încă pentru a vedea un complot 100D). Am putea reduce numărul de dimensiuni la o sumă rezonabilă?

Raspunsul este da! Pentru asta avem embedding -uri.

Ce este o încorporare și de ce să o folosești?

O încorporare este o reprezentare cu dimensiuni reduse a datelor cu dimensiuni mari. De obicei, o încorporare nu va capta toate informațiile conținute în datele originale. O încorporare bună, totuși, va captura suficient pentru a rezolva problema în cauză.

Există multe înglobări adaptate pentru o anumită structură de date. De exemplu, s-ar putea să fi auzit de word2vec pentru datele text sau de descriptori Fourier pentru datele de imagine de formă. În schimb, vom discuta despre cum să aplicăm înglobări oricăror date în care putem defini o distanță sau o măsură de similitudine. Atâta timp cât putem calcula o matrice de distanță, natura datelor este complet irelevantă. Va funcționa la fel, fie că este vorba de e-mailuri, liste, arbori sau pagini web.

În acest articol, vă vom prezenta diferite tipuri de încorporare și vom discuta cum funcționează unele înglobări populare și cum am putea folosi încorporarea pentru a rezolva probleme din lumea reală care implică date complexe. Vom parcurge și argumentele pro și contra acestei metode, precum și câteva alternative. Da, unele probleme pot fi rezolvate mai bine prin alte mijloace, dar, din păcate, nu există un glonț de argint în învățarea automată.

Să începem.

Cum funcționează înglobările

Toate înglobările încearcă să reducă dimensionalitatea datelor, păstrând în același timp informații „esențiale” în date, dar fiecare încorporare o face în felul său. Aici, vom trece prin câteva înglobări populare care pot fi aplicate unei matrice de distanță sau similaritate.

Nici măcar nu vom încerca să acoperim toate înglobările de acolo. Există cel puțin o duzină de înglobări bine-cunoscute care pot face asta și multe alte înglobări mai puțin cunoscute și variațiile acestora. Fiecare dintre ele are propria abordare, avantaje și dezavantaje.

Dacă doriți să vedeți ce alte înglobări există, puteți începe aici:

  • Ghidul utilizatorului Scikit-learn
  • Elementele învățării statistice (ediția a doua), capitolul 14

Matricea distanței

Să atingem pe scurt matricele de distanță. Găsirea unei distanțe adecvate pentru date necesită o bună înțelegere a problemei, unele cunoștințe de matematică și uneori pur noroc . În abordarea descrisă în acest articol, acesta ar putea fi cel mai important factor care contribuie la succesul sau eșecul general al proiectului dumneavoastră.

De asemenea, ar trebui să țineți cont de câteva detalii tehnice. Mulți algoritmi de încorporare vor presupune că o matrice de distanță (sau disimilaritate ) $\textbf{D}$ are zerouri pe diagonala sa și este simetrică. Dacă nu este simetric, putem folosi în schimb $(\textbf{D} + \textbf{D}^T) / 2$. Algoritmii care folosesc trucul nucleului vor presupune, de asemenea, că o distanță este o metrică, ceea ce înseamnă că inegalitatea triunghiului este valabilă:

\[\forall a, b, c \;\; d(a,c) \leq d(a,b) + d(b,c)\]

De asemenea, dacă un algoritm necesită o matrice de similaritate, am putea aplica orice funcție monotonă descrescătoare pentru a transforma o matrice de distanță într-o matrice de similaritate: de exemplu, $\exp -x$.

Analiza componentelor principale (PCA)

Analiza componentelor principale, sau PCA, este probabil cea mai utilizată încorporare până în prezent. Ideea este simplă: găsiți o transformare liniară a caracteristicilor care maximizează varianța capturată sau (echivalent) minimizează eroarea de reconstrucție pătratică .

În mod specific, să fie caracteristicile un exemplu de matrice $\textbf{X} \in \mathbb{R}^{n \times p}$ au $n$ caracteristici și $p$ dimensiuni. Pentru simplitate, să presupunem că media eșantionului de date este zero. Putem reduce numărul de dimensiuni de la $p$ la $q$ prin înmulțirea $\textbf{X}$ cu o matrice ortonormală $\textbf{V}_q \in \mathbb{R}^{p \times q}$ :

\[\hat{\textbf{X}} = \textbf{X} \textbf{V}_q\]

Apoi, $\hat{\textbf{X}} \in \mathbb{R}^{n \times q}$ va fi noul set de caracteristici. Pentru a mapa noile caracteristici înapoi la spațiul original (această operație se numește reconstrucție ), trebuie pur și simplu să o înmulțim din nou cu $\textbf{V}_q^T$.

Acum, trebuie să găsim matricea $\textbf{V}_q$ care minimizează eroarea de reconstrucție:

\[\min_{\textbf{V}_q} ||\textbf{X}\textbf{V}_q\textbf{V}_q^T - \textbf{X}||^2\]

Coloanele matricei $\textbf{V}_q$ sunt numite direcții ale componentelor principale, iar coloanele $\hat{\textbf{X}}$ sunt numite componente principale. Din punct de vedere numeric, putem găsi $\textbf{V}_q$ aplicând descompunerea SVD la $\textbf{X}$, deși există alte modalități la fel de valide de a face acest lucru.

PCA poate fi aplicat direct la caracteristicile numerice. Sau, dacă trăsăturile noastre sunt nenumerice, le putem aplica la o matrice de distanță sau similaritate.

Dacă utilizați Python, PCA este implementat în scikit-learn.

Avantajul acestei metode este că este rapid de calculat și destul de robust la zgomot în date.

Dezavantajul ar fi că poate capta doar structuri liniare, astfel încât informațiile neliniare conținute în datele originale este probabil să se piardă.

Kernel PCA

Kernel PCA este o versiune neliniară a PCA. Ideea este să folosiți kernel trick , despre care probabil ați auzit dacă sunteți familiarizat cu Support Vector Machines SVM.

Mai exact, există câteva moduri diferite de a calcula PCA. Una dintre ele este de a calcula propria compoziție a versiunii dublu-centrate a matricei gram $\textbf{X} \textbf{X}^T \in \mathbb{R}^{n \times n}$. Acum, dacă calculăm o matrice kernel $\textbf{K} \in \mathbb{R}^{n \times n}$ pentru datele noastre, Kernel PCA o va trata ca pe o matrice gram pentru a găsi componentele principale.

Fie $x_i$, $i \in {1,..,n}$ mostre de caracteristici. Matricea nucleului este definită de o funcție kernel $K(x_i,x_j)=\langle \phi(x_i),\phi(x_j) \rangle$.

O alegere populară este un nucleu radial:

\[K(x_i,x_j)=\exp -\gamma \cdot d(x_i,x_j)\]

unde $d$ este o funcție de distanță.

Kernel PCA ne-a cerut să specificăm o distanță. De exemplu, pentru caracteristicile numerice, am putea folosi distanța euclidiană: $d(x_i,x_j)=\vert\vert x_i-x_j \vert \vert ^2$.

Pentru caracteristicile non-numerice, poate fi necesar să fim creativi. Un lucru de reținut este că acest algoritm presupune că distanța noastră este o metrică.

Dacă utilizați Python, Kernel PCA este implementat în scikit-learn.

Avantajul metodei Kernel PCA este că poate capta structuri de date neliniare.

Dezavantajul este că este sensibil la zgomot din date și că alegerea distanței și a funcțiilor nucleului va afecta foarte mult rezultatele.

Scalare multidimensională (MDS)

Scalare multidimensională (MDS) încearcă să păstreze distanțele dintre eșantioane la nivel global. Ideea este destul de intuitivă și funcționează bine cu matrice de distanță.

Mai exact, având în vedere mostre de caracteristici $x_i$, $i \in {1,..,n}$ și o funcție de distanță $d$, calculăm noi eșantioane de caracteristici $z_i \in \mathbb{R}^{q}$, $i \in {1,..,n}$ prin minimizarea unei funcții de stres :

\[\min_{z_1,..,z_n} \sum_{1 \leq i < j \leq n} (d(x_i, x_j) - ||z_i - z_j||)^2\]

Dacă utilizați Python, MDS este implementat în scikit-learn. Cu toate acestea, scikit-learn nu acceptă transformarea punctelor din afara eșantionului, ceea ce ar putea fi incomod dacă dorim să folosim o încorporare împreună cu un model de regresie sau clasificare. În principiu, însă, este posibil.

Avantajul MDS este că ideea sa se potrivește perfect cu cadrul nostru și că nu este foarte afectat de zgomotul din date.

Dezavantajul este că implementarea sa în scikit-learn este destul de lentă și nu acceptă transformarea în afara eșantionului.

Caz de utilizare: Urmărirea expedierii

Câteva așezări de pe o mică insulă tropicală au dezvoltat servicii de transport de colete pentru a satisface industria turismului local. Un comerciant dintr-una dintre aceste așezări a decis să ia măsuri pentru a câștiga un avantaj față de concurență, așa că a înființat un sistem de supraveghere prin satelit care urmărește toate transporturile de pachete de pe insulă. Odată culese datele, comerciantul a chemat un data scientist (asta suntem noi!) pentru a-l ajuta să răspundă la următoarea întrebare: Putem prezice destinația unui pachet care se află în prezent pe drum?

Setul de date conține informații despre 200 de expedieri urmărite. Pentru fiecare expediere urmărită, există o listă de coordonate (x,y) ale tuturor locațiilor în care a fost observat pachetul, care este de obicei între 20 și 50 de observații. Graficul de mai jos arată cum arată aceste date.

Caz de utilizare: Urmărirea expedierii

Aceste date par probleme — de fapt, două tipuri diferite de probleme.

Prima problemă este că datele cu care avem de-a face sunt cu dimensiuni mari. De exemplu, dacă fiecare pachet ar fi observat în 50 de locații, datele noastre ar avea 100 de dimensiuni — sună mult, în comparație cu cele 200 de eșantioane la care aveți la dispoziție.

A doua problemă: Rutele de expediere diferite au de fapt un număr diferit de observații, așa că nu putem pur și simplu să stivuim listele cu coordonate pentru a reprezenta datele într-o formă tabelară (și chiar dacă ar avea, asta nu ar avea sens).

Comerciantul bate nerăbdător la masă cu degetele, iar cercetătorul se străduiește din răsputeri să nu dea semne de panică.

Aici vor fi utile matricele de distanță și înglobările. Trebuie doar să găsim o modalitate de a compara două rute de expediere. Distanța Frechet pare a fi o alegere rezonabilă. Cu o distanță, putem calcula o matrice de distanțe.

Notă: acest pas poate dura ceva timp. Trebuie să calculăm $O(n^2)$ distanțe cu fiecare distanță având $O(k^2)$ iterații, unde $n$ este numărul de eșantioane și $k$ este numărul de observații dintr-un eșantion. Scrierea eficientă a unei funcții de distanță este cheia. De exemplu, în Python, puteți folosi numba pentru a accelera acest calcul de mai multe ori.

Vizualizarea înglobărilor

Acum, putem folosi o încorporare pentru a reduce numărul de dimensiuni de la 200 la doar câteva. Putem vedea clar că există doar câteva rute comerciale, așa că putem spera să găsim o reprezentare bună a datelor chiar și în două sau trei dimensiuni. Vom folosi înglobări despre care am discutat mai devreme: PCA, Kernel PCA și MDS.

Pe diagramele de mai jos, puteți vedea datele de traseu etichetate (date de dragul demonstrației) și reprezentarea lor printr-o încorporare în 2D și 3D (de la stânga la dreapta). Datele etichetate marchează patru posturi comerciale conectate prin șase rute comerciale. Două dintre cele șase rute comerciale sunt bidirecționale, ceea ce face opt grupuri de expediere în total (6+2). După cum puteți vedea, avem o separare destul de clară a tuturor celor opt grupuri de expediere cu încorporare 3D.

Vizualizarea înglobărilor

Acesta este un început bun.

Încorporarea într-o conductă de model

Acum, suntem gata să antrenăm o încorporare. Deși MDS a arătat cele mai bune rezultate, este destul de lent; de asemenea, implementarea scikit-learn nu acceptă transformarea în afara eșantionului. Nu este o problemă pentru cercetare, dar poate fi pentru producție, așa că vom folosi Kernel PCA în schimb. Pentru Kernel PCA, nu ar trebui să uităm să aplicăm în prealabil un nucleu radial la matricea de distanțe.

Cum selectați numărul de dimensiuni de ieșire? Analiza a arătat că chiar și 3D funcționează bine. Doar pentru a fi în siguranță și pentru a nu omite nicio informație importantă, să setăm ieșirea de încorporare la 10D. Pentru cea mai bună performanță, numărul de dimensiuni de ieșire poate fi setat ca hiper-parametru al modelului și apoi reglat prin validare încrucișată.

Deci, vom avea 10 caracteristici numerice pe care le putem folosi ca intrare pentru aproape orice model de clasificare. Ce zici de un model liniar și unul neliniar: să zicem, regresia logistică și creșterea gradului? Pentru comparație, să folosim și aceste două modele cu o matrice de distanță completă ca intrare. Pe deasupra, să testăm și SVM (SVM este proiectat să funcționeze direct cu o matrice de distanță, deci nu ar fi necesară încorporarea).

Precizia modelului pe setul de testare este prezentată mai jos (au fost generate 10 seturi de date de tren și de testare, astfel încât să putem estima varianța modelului):

  • Gradient Boosting asociat cu o încorporare (KernelPCA+GB) ocupă primul loc. A depășit gradul de creștere fără încorporare (GB). Aici, Kernel PCA sa dovedit a fi util.
  • Regresia logistică a făcut bine. Ceea ce este interesant este că regresia logistică fără încorporare (LR) s-a descurcat mai bine decât cu o încorporare (KernelPCA+LR). Acest lucru nu este complet neașteptat. Modelele liniare nu sunt foarte flexibile, dar relativ greu de supraadaptat. Aici, pierderea de informații cauzată de o încorporare pare să depășească beneficiul unei dimensionalități mai mici de intrare.
  • Nu în ultimul rând, și SVM a funcționat bine, deși varianța acestui model este destul de semnificativă.

Precizia modelului

Precizia modelului

Codul Python pentru acest caz de utilizare este disponibil la GitHub.

Concluzie

Am explicat ce sunt înglobările și am demonstrat cum pot fi utilizate împreună cu matrice de distanță pentru a rezolva probleme din lumea reală. E timpul pentru verdict:

Sunt încorporarea ceva pe care un cercetător de date ar trebui să îl folosească? Să aruncăm o privire la ambele părți ale poveștii.

Avantaje și dezavantaje ale utilizării înglobărilor

Pro:

  • Această abordare ne permite să lucrăm cu structuri de date neobișnuite sau complexe, atâta timp cât puteți defini o distanță, ceea ce, cu un anumit grad de cunoaștere, imaginație și noroc, o puteți face de obicei.
  • Rezultatele sunt date numerice cu dimensiuni reduse, pe care le puteți analiza, grupa sau utiliza cu ușurință ca caracteristici de model pentru aproape orice model de învățare automată.

Contra:

  • Folosind această abordare, vom pierde în mod necesar unele informații:

    • În primul pas, când înlocuim datele originale cu matrice de similaritate
    • În timpul celui de-al doilea pas, când reducem dimensionalitatea folosind o încorporare
  • În funcție de date și de funcția de distanță, calculul unei matrice de distanță poate consuma timp. Acest lucru poate fi atenuat de o funcție de distanță scrisă eficient.
  • Unele înglobări sunt foarte sensibile la zgomotul din date. Acest lucru poate fi atenuat de curățarea suplimentară a datelor.
  • Unele înglobări sunt sensibile la alegerea hiper-parametrilor săi. Acest lucru poate fi atenuat de o analiză atentă sau de reglarea hiper-parametrică.

Alternative: De ce să nu folosiți...?

  • De ce să nu folosiți o încorporare direct pe date, mai degrabă decât o matrice de distanță?
    Dacă cunoașteți o încorporare care vă poate codifica în mod eficient datele în mod direct, prin toate mijloacele, utilizați-o. Problema este că nu există întotdeauna.
  • De ce să nu folosiți doar clusterizarea pe o matrice de distanță?
    Dacă singurul tău obiectiv este să segmentezi setul de date, ar fi absolut în regulă să faci asta. Unele metode de clusterizare folosesc și înglobările (de exemplu, Spectral Clustering). Dacă doriți să aflați mai multe, iată un tutorial despre clusterizare.
  • De ce să nu folosiți o matrice de distanță ca caracteristici?
    Dimensiunea unei matrice de distanțe este $(n_{eșantioane}, n_{probe})$. Nu toate modelele pot face față eficient - unele se pot supraadapta, unele pot fi lenți să se potrivească, altele nu se potrivesc cu totul. Modelele cu varianță scăzută ar fi o alegere bună aici, cum ar fi modelele liniare și/sau regularizate.
  • De ce să nu folosiți SVM doar cu o matrice de distanță?
    SVM este un model grozav, care a funcționat bine în cazul nostru de utilizare. Cu toate acestea, există câteva avertismente. În primul rând, dacă dorim să adăugăm alte caracteristici (ar putea fi doar numere numerice simple), nu vom putea face acest lucru direct. Ar trebui să le încorporăm în matricea noastră de similitudini și, eventual, să pierdem câteva informații valoroase. În al doilea rând, oricât de bun este SVM, un alt model poate funcționa mai bine pentru problema dvs.
  • De ce să nu folosiți doar învățarea profundă?
    Este adevărat, pentru orice problemă, poți găsi o rețea neuronală potrivită dacă cauți suficient de mult. Rețineți, totuși, că procesul de găsire, antrenare, validare și implementare a acestei rețele neuronale nu va fi neapărat unul simplu. Deci, ca întotdeauna, folosește-ți cea mai bună judecată.

Într-o propoziție

Înglobarile în combinație cu matricele de distanță sunt un instrument incredibil de util dacă se întâmplă să lucrați cu date nenumerice complexe, mai ales atunci când nu vă puteți transforma datele într-un spațiu vectorial direct și ați prefera să aveți o intrare de dimensiuni reduse pentru modelul dvs.