Incorporamenti nell'apprendimento automatico: semplificare i dati complessi

Pubblicato: 2022-03-11

Lavorare con dati non numerici può essere difficile, anche per esperti di dati. Un tipico modello di machine learning prevede che le sue caratteristiche siano numeri, non parole, e-mail, pagine di siti Web, elenchi, grafici o distribuzioni di probabilità. Per essere utili, i dati devono prima essere trasformati in uno spazio vettoriale. Ma come?

Un approccio popolare sarebbe quello di trattare una caratteristica non numerica come categoriale . Questo potrebbe funzionare bene se il numero di categorie è piccolo (ad esempio, se i dati indicano una professione o un paese). Tuttavia, se proviamo ad applicare questo metodo alle e-mail, probabilmente otterremo tante categorie quanti sono i campioni. Non esistono due e-mail esattamente uguali, quindi questo approccio non sarebbe di alcuna utilità.

Un altro approccio sarebbe definire una distanza tra i campioni di dati , una funzione che ci dice quanto sono vicini due campioni qualsiasi. Oppure potremmo definire una misura di somiglianza , che ci darebbe le stesse informazioni tranne per il fatto che la distanza tra due campioni vicini è piccola mentre la somiglianza è grande. Calcolare la distanza (somiglianza) tra tutti i campioni di dati ci darebbe una matrice di distanza (o somiglianza). Questi sono dati numerici che potremmo usare.

Tuttavia, questi dati avrebbero tante dimensioni quanti sono i campioni, il che di solito non è eccezionale se vogliamo usarlo come caratteristica (vedi maledizione della dimensionalità) o per visualizzarlo (mentre una trama può gestire anche 6D, ho ancora per vedere una trama 100D). Possiamo ridurre il numero di dimensioni a un importo ragionevole?

La risposta è si! È per questo che abbiamo gli incorporamenti .

Che cos'è un incorporamento e perché usarlo?

Un embedding è una rappresentazione a bassa dimensione di dati ad alta dimensione. In genere, un'incorporamento non acquisirà tutte le informazioni contenute nei dati originali. Una buona incorporazione, tuttavia, catturerà abbastanza per risolvere il problema in questione.

Esistono molti incorporamenti su misura per una particolare struttura di dati. Ad esempio, potresti aver sentito parlare di word2vec per i dati di testo o di descrittori di Fourier per i dati di immagini di forma. Discuteremo invece come applicare gli incorporamenti a qualsiasi dato in cui possiamo definire una distanza o una misura di somiglianza. Finché possiamo calcolare una matrice di distanza, la natura dei dati è completamente irrilevante. Funzionerà allo stesso modo, che si tratti di e-mail, elenchi, alberi o pagine Web.

In questo articolo, ti presenteremo diversi tipi di incorporamento e discuteremo come funzionano alcuni incorporamenti popolari e come potremmo utilizzare gli incorporamenti per risolvere problemi del mondo reale che coinvolgono dati complessi. Esamineremo anche i pro ei contro di questo metodo, oltre ad alcune alternative. Sì, alcuni problemi possono essere risolti meglio con altri mezzi, ma sfortunatamente non esiste un proiettile d'argento nell'apprendimento automatico.

Iniziamo.

Come funzionano gli incorporamenti

Tutti gli incorporamenti tentano di ridurre la dimensionalità dei dati preservando le informazioni "essenziali" nei dati, ma ogni incorporamento lo fa a modo suo. Qui, esamineremo alcuni incorporamenti popolari che possono essere applicati a una matrice di distanza o somiglianza.

Non tenteremo nemmeno di coprire tutti gli incorporamenti là fuori. Ci sono almeno una dozzina di incorporamenti noti che possono farlo e molti altri incorporamenti meno conosciuti e le loro variazioni. Ognuno di loro ha il proprio approccio, vantaggi e svantaggi.

Se desideri vedere quali altri incorporamenti sono disponibili, puoi iniziare da qui:

  • Guida per l'utente per l'apprendimento di Scikit
  • Gli elementi dell'apprendimento statistico (seconda edizione), capitolo 14

Matrice di distanza

Tocchiamo brevemente le matrici delle distanze. Trovare una distanza adeguata per i dati richiede una buona comprensione del problema, una certa conoscenza della matematica e talvolta pura fortuna . Nell'approccio descritto in questo articolo, questo potrebbe essere il fattore più importante che contribuisce al successo o al fallimento generale del tuo progetto.

Dovresti anche tenere a mente alcuni dettagli tecnici. Molti algoritmi di incorporamento presuppongono che una matrice di distanza (o dissomiglianza ) $\textbf{D}$ abbia zeri sulla sua diagonale ed è simmetrica. Se non è simmetrico, possiamo usare invece $(\textbf{D} + \textbf{D}^T) / 2$. Gli algoritmi che utilizzano il trucco del kernel presuppongono anche che una distanza sia una metrica, il che significa che vale la disuguaglianza triangolare:

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

Inoltre, se un algoritmo richiede invece una matrice di similarità, potremmo applicare qualsiasi funzione decrescente di monotono per trasformare una matrice di distanza in una matrice di similarità: ad esempio, $\exp -x$.

Analisi dei componenti principali (PCA)

L'analisi dei componenti principali, o PCA, è probabilmente l'incorporamento più utilizzato fino ad oggi. L'idea è semplice: trovare una trasformazione lineare delle caratteristiche che massimizzi la varianza acquisita o (equivalentemente) riduca al minimo l'errore di ricostruzione quadratica .

Specificamente, lascia che le caratteristiche siano una matrice di esempio. $\textbf{X} \in \mathbb{R}^{n \times p}$ hanno caratteristiche $n$ e dimensioni $p$. Per semplicità, assumiamo che la media campionaria dei dati sia zero. Possiamo ridurre il numero di dimensioni da $p$ a $q$ moltiplicando $\textbf{X}$ per una matrice ortonormale $\textbf{V}_q \in \mathbb{R}^{p \times q}$ :

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

Quindi, $\hat{\textbf{X}} \in \mathbb{R}^{n \times q}$ sarà il nuovo set di funzionalità. Per mappare le nuove funzionalità nello spazio originale (questa operazione è chiamata ricostruzione ), dobbiamo semplicemente moltiplicarlo nuovamente per $\textbf{V}_q^T$.

Ora dobbiamo trovare la matrice $\textbf{V}_q$ che minimizza l'errore di ricostruzione:

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

Le colonne della matrice $\textbf{V}_q$ sono dette direzioni dei componenti principali e le colonne di $\hat{\textbf{X}}$ sono dette componenti principali. Numericamente, possiamo trovare $\textbf{V}_q$ applicando la scomposizione SVD a $\textbf{X}$, sebbene ci siano altri modi ugualmente validi per farlo.

PCA può essere applicato direttamente alle caratteristiche numeriche. Oppure, se le nostre caratteristiche non sono numeriche, possiamo applicarle a una matrice di distanza o somiglianza.

Se usi Python, PCA è implementato in scikit-learn.

Il vantaggio di questo metodo è che è veloce da calcolare e abbastanza robusto per il rumore nei dati.

Lo svantaggio sarebbe che può catturare solo strutture lineari, quindi è probabile che le informazioni non lineari contenute nei dati originali vadano perse.

Kernel PCA

Kernel PCA è una versione non lineare di PCA. L'idea è di usare kernel trick , di cui probabilmente avrai sentito parlare se hai familiarità con Support Vector Machines SVM.

In particolare, esistono diversi modi per calcolare la PCA. Uno di questi è calcolare l'autodecomposizione della versione bicentrica della matrice di grammi $\textbf{X} \textbf{X}^T \in \mathbb{R}^{n \times n}$. Ora, se calcoliamo una matrice del kernel $\textbf{K} \in \mathbb{R}^{n \times n}$ per i nostri dati, Kernel PCA la tratterà come una matrice di grammi per trovare i componenti principali.

Siano $x_i$, $i \in {1,..,n}$ gli esempi di funzionalità. La matrice del kernel è definita da una funzione del kernel $K(x_i,x_j)=\langle \phi(x_i),\phi(x_j) \rangle$.

Una scelta popolare è un kernel radiale:

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

dove $d$ è una funzione di distanza.

Kernel PCA ci ha richiesto di specificare una distanza. Ad esempio, per le caratteristiche numeriche, potremmo usare la distanza euclidea: $d(x_i,x_j)=\vert\vert x_i-x_j \vert \vert ^2$.

Per le funzioni non numeriche, potrebbe essere necessario essere creativi. Una cosa da ricordare è che questo algoritmo presume che la nostra distanza sia una metrica.

Se usi Python, Kernel PCA è implementato in scikit-learn.

Il vantaggio del metodo Kernel PCA è che può acquisire strutture di dati non lineari.

Lo svantaggio è che è sensibile al rumore nei dati e che la scelta della distanza e delle funzioni del kernel influenzerà notevolmente i risultati.

Ridimensionamento multidimensionale (MDS)

Il ridimensionamento multidimensionale (MDS) cerca di preservare le distanze tra i campioni a livello globale. L'idea è abbastanza intuitiva e funziona bene con le matrici di distanza.

In particolare, dati campioni di funzionalità $x_i$, $i \in {1,..,n}$ e una funzione di distanza $d$, calcoliamo nuovi campioni di funzionalità $z_i \in \mathbb{R}^{q}$, $i \in {1,..,n}$ minimizzando una funzione di stress :

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

Se usi Python, MDS è implementato in scikit-learn. Tuttavia, scikit-learn non supporta la trasformazione di punti fuori campione, il che potrebbe essere scomodo se si desidera utilizzare un'inclusione insieme a un modello di regressione o classificazione. In linea di principio, tuttavia, è possibile.

Il vantaggio di MDS è che la sua idea si accorda perfettamente con il nostro framework e che non è molto influenzato dal rumore nei dati.

Lo svantaggio è che la sua implementazione in scikit-learn è piuttosto lenta e non supporta la trasformazione fuori dal campione.

Caso d'uso: monitoraggio della spedizione

Alcuni insediamenti su una piccola isola tropicale hanno sviluppato servizi di spedizione di pacchi per soddisfare l'industria turistica locale. Un commerciante in uno di questi insediamenti ha deciso di agire per ottenere un vantaggio sulla concorrenza, quindi ha istituito un sistema di sorveglianza satellitare che traccia tutte le spedizioni di pacchi sull'isola. Una volta raccolti i dati, il commerciante ha chiamato un data scientist (siamo noi!) per aiutarlo a rispondere alla seguente domanda: possiamo prevedere la destinazione di un pacco che è attualmente in viaggio?

Il set di dati contiene informazioni su 200 spedizioni tracciate. Per ogni spedizione tracciata, esiste un elenco di coordinate (x,y) di tutti i luoghi in cui è stato individuato il pacco, che in genere è compreso tra 20 e 50 osservazioni. Il grafico seguente mostra come appaiono questi dati.

Caso d'uso: monitoraggio della spedizione

Questi dati sembrano guai, in realtà due diversi tipi di guai.

Il primo problema è che i dati con cui abbiamo a che fare sono ad alta dimensione. Ad esempio, se ogni pacco fosse individuato in 50 località, i nostri dati avrebbero 100 dimensioni: suona come molte, rispetto ai 200 campioni a tua disposizione.

Il secondo problema: diversi percorsi di spedizione hanno in realtà un numero diverso di osservazioni, quindi non possiamo semplicemente impilare gli elenchi con le coordinate per rappresentare i dati in forma tabellare (e anche se lo fossero, non avrebbe comunque molto senso).

Il commerciante sta tamburellando con impazienza sul tavolo con le dita e il data scientist si sta sforzando di non mostrare alcun segno di panico.

È qui che le matrici di distanza e gli incorporamenti torneranno utili. Dobbiamo solo trovare un modo per confrontare due percorsi di spedizione. La distanza di Frechet sembra essere una scelta ragionevole. Con una distanza, possiamo calcolare una matrice di distanza.

Nota: questo passaggio potrebbe richiedere del tempo. Dobbiamo calcolare $O(n^2)$ distanze con ogni distanza che ha $O(k^2)$ iterazioni, dove $n$ è il numero di campioni e $k$ è il numero di osservazioni in un campione. Scrivere una funzione di distanza in modo efficiente è fondamentale. Ad esempio, in Python, potresti usare numba per accelerare molte volte questo calcolo.

Visualizzazione degli incorporamenti

Ora possiamo utilizzare un'incorporamento per ridurre il numero di dimensioni da 200 a poche. Possiamo vedere chiaramente che ci sono solo poche rotte commerciali, quindi possiamo sperare di trovare una buona rappresentazione dei dati anche in due o tre dimensioni. Utilizzeremo gli incorporamenti di cui abbiamo discusso in precedenza: PCA, Kernel PCA e MDS.

Nei grafici sottostanti, puoi vedere i dati del percorso etichettati (forniti a scopo dimostrativo) e la loro rappresentazione mediante un'inclusione in 2D e 3D (da sinistra a destra). I dati etichettati segnano quattro postazioni commerciali collegate da sei rotte commerciali. Due delle sei rotte commerciali sono bidirezionali, per un totale di otto gruppi di spedizioni (6+2). Come puoi vedere, abbiamo ottenuto una netta separazione di tutti gli otto gruppi di spedizione con incorporamenti 3D.

Visualizzazione degli incorporamenti

Questo è un buon inizio.

Incorporamenti in una pipeline modello

Ora siamo pronti per addestrare un incorporamento. Sebbene MDS abbia mostrato i migliori risultati, è piuttosto lento; inoltre, l'implementazione di scikit-learn non supporta la trasformazione fuori campione. Non è un problema per la ricerca ma può esserlo per la produzione, quindi useremo invece Kernel PCA. Per Kernel PCA, non dobbiamo dimenticare di applicare in anticipo un kernel radiale alla matrice di distanza.

Come si seleziona il numero di dimensioni di output? L'analisi ha mostrato che anche il 3D funziona bene. Giusto per essere al sicuro e non tralasciare alcuna informazione importante, impostiamo l'output di incorporamento su 10D. Per ottenere prestazioni ottimali, il numero di dimensioni di output può essere impostato come iperparametro del modello e quindi ottimizzato mediante convalida incrociata.

Quindi, avremo 10 funzioni numeriche che possiamo utilizzare come input per praticamente qualsiasi modello di classificazione. Che ne dici di un modello lineare e uno non lineare: diciamo, regressione logistica e incremento del gradiente? Per confronto, utilizziamo anche questi due modelli con una matrice a distanza intera come input. Inoltre, testiamo anche SVM (SVM è progettato per funzionare direttamente con una matrice di distanza, quindi non sarebbe necessario l'incorporamento).

L'accuratezza del modello sul set di test è mostrata di seguito (sono stati generati 10 set di dati del treno e del test in modo da poter stimare la varianza del modello):

  • Gradient Boosting abbinato a un embedding (KernelPCA+GB) ottiene il primo posto. Ha sovraperformato il Gradient Boosting senza incorporamento (GB). Qui, Kernel PCA si è rivelato utile.
  • La regressione logistica ha funzionato bene. La cosa interessante è che la regressione logistica senza incorporamento (LR) ha funzionato meglio che con un incorporamento (KernelPCA+LR). Questo non è del tutto inaspettato. I modelli lineari non sono molto flessibili ma relativamente difficili da adattare. Qui, la perdita di informazioni causata da un incorporamento sembra superare il vantaggio di una minore dimensionalità dell'input.
  • Ultimo ma non meno importante, anche SVM si è comportato bene, sebbene la variazione di questo modello sia piuttosto significativa.

Precisione del modello

Precisione del modello

Il codice Python per questo caso d'uso è disponibile su GitHub.

Conclusione

Abbiamo spiegato cosa sono gli incorporamenti e dimostrato come possono essere utilizzati insieme alle matrici di distanza per risolvere problemi del mondo reale. Tempo per il verdetto:

Gli incorporamenti sono qualcosa che un data scientist dovrebbe usare? Diamo un'occhiata a entrambi i lati della storia.

Pro e contro dell'utilizzo degli incorporamenti

Professionisti:

  • Questo approccio ci consente di lavorare con strutture di dati insolite o complesse purché sia ​​possibile definire una distanza, cosa che, con un certo grado di conoscenza, immaginazione e fortuna, di solito è possibile.
  • L'output è costituito da dati numerici a bassa dimensione, che puoi facilmente analizzare, raggruppare o utilizzare come funzionalità del modello praticamente per qualsiasi modello di machine learning disponibile.

Contro:

  • Utilizzando questo approccio, perderemo necessariamente alcune informazioni:

    • Durante il primo passaggio, quando sostituiamo i dati originali con la matrice di similarità
    • Durante la seconda fase, quando riduciamo la dimensionalità usando un'incorporamento
  • A seconda dei dati e della funzione di distanza, il calcolo di una matrice di distanza può richiedere molto tempo. Questo può essere mitigato da una funzione di distanza scritta in modo efficiente.
  • Alcuni incorporamenti sono molto sensibili al rumore nei dati. Questo può essere mitigato da un'ulteriore pulizia dei dati.
  • Alcuni incorporamenti sono sensibili alla scelta dei suoi iperparametri. Ciò può essere mitigato da un'analisi attenta o dall'ottimizzazione degli iperparametri.

Alternative: perché non usare...?

  • Perché non utilizzare semplicemente un'incorporamento direttamente sui dati, piuttosto che una matrice di distanza?
    Se conosci un incorporamento in grado di codificare direttamente i tuoi dati in modo efficiente, utilizzalo con tutti i mezzi. Il problema è che non sempre esiste.
  • Perché non usare semplicemente la clusterizzazione su una matrice di distanza?
    Se il tuo unico obiettivo è segmentare il tuo set di dati, sarebbe assolutamente corretto farlo. Alcuni metodi di clusterizzazione sfruttano anche gli incorporamenti (ad esempio, Spectral Clustering). Se desideri saperne di più, ecco un tutorial sulla clusterizzazione.
  • Perché non usare semplicemente una matrice di distanza come caratteristiche?
    La dimensione di una matrice di distanza è $(n_{campioni}, n_{campioni})$. Non tutti i modelli possono gestirlo in modo efficiente: alcuni potrebbero adattarsi troppo, altri potrebbero essere lenti, altri potrebbero non adattarsi del tutto. I modelli con varianza bassa sarebbero una buona scelta in questo caso, come i modelli lineari e/o regolarizzati.
  • Perché non utilizzare semplicemente SVM con una matrice di distanza?
    SVM è un ottimo modello, che ha funzionato bene nel nostro caso d'uso. Tuttavia, ci sono alcuni avvertimenti. Innanzitutto, se vogliamo aggiungere altre funzionalità (potrebbero essere solo semplici numeri numerici), non saremo in grado di farlo direttamente. Dovremmo incorporarli nella nostra matrice di somiglianza e potenzialmente perdere alcune informazioni preziose. In secondo luogo, per quanto SVM sia buono, un altro modello potrebbe funzionare meglio per il tuo problema particolare.
  • Perché non utilizzare semplicemente il deep learning?
    È vero, per qualsiasi problema, puoi trovare una rete neurale adatta se cerchi abbastanza a lungo. Tieni presente, tuttavia, che il processo di ricerca, addestramento, convalida e distribuzione di questa rete neurale non sarà necessariamente semplice. Quindi, come sempre, usa il tuo miglior giudizio.

In una frase

Gli incorporamenti in combinazione con le matrici di distanza sono uno strumento incredibilmente utile se ti capita di lavorare con dati non numerici complessi, specialmente quando non puoi trasformare i tuoi dati direttamente in uno spazio vettoriale e preferiresti avere un input di dimensioni ridotte per il tuo modello.