Le tue caratteristiche sono importanti? Non significa che siano buoni - KDnuggets

Le tue caratteristiche sono importanti? Ciò non significa che siano buoni – KDnuggets

Nodo di origine: 2893531

Le tue caratteristiche sono importanti? Non significa che siano buoni
[Immagine dell'autore]

 

Il concetto di “importanza delle funzionalità” è ampiamente utilizzato nell’apprendimento automatico come il tipo più elementare di spiegabilità del modello. Ad esempio, viene utilizzato in Recursive Feature Elimination (RFE), per eliminare in modo iterativo la caratteristica meno importante del modello.

Tuttavia, c’è un malinteso a riguardo.

Il fatto che una caratteristica sia importante non implica che sia vantaggiosa per il modello!

Infatti, quando diciamo che una caratteristica è importante, ciò significa semplicemente che la caratteristica apporta un contributo elevato alle previsioni fatte dal modello. Ma dovremmo considerarlo tale contributo potrebbe essere sbagliato.

Prendiamo un semplice esempio: un data scientist dimentica accidentalmente l'ID cliente tra le funzionalità del suo modello. Il modello utilizza l'ID cliente come funzionalità altamente predittiva. Di conseguenza, questa caratteristica avrà un'elevata importanza anche se in realtà sta peggiorando il modello, perché non può funzionare bene su dati invisibili.

Per rendere le cose più chiare, bisognerà fare una distinzione tra due concetti:

  • Contributo di previsione: quale parte delle previsioni è dovuta alla caratteristica; questo equivale all'importanza della caratteristica.
  • Contributo di errore: quale parte degli errori di previsione è dovuta alla presenza della feature nel modello.

In questo articolo vedremo come calcolare queste quantità e come utilizzarle per ottenere informazioni preziose su un modello predittivo (e per migliorarlo).

Nota: questo articolo è focalizzato sul caso di regressione. Se sei più interessato al caso di classificazione, puoi leggere “Quali caratteristiche sono dannose per il tuo modello di classificazione?”

Supponiamo di costruire un modello per prevedere il reddito delle persone in base al lavoro, all'età e alla nazionalità. Ora utilizziamo il modello per fare previsioni su tre persone.

Pertanto, abbiamo la verità fondamentale, la previsione del modello e l’errore risultante:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Verità fondamentale, previsione del modello ed errore assoluto (in migliaia di $). [Immagine dell'autore]

 

Quando disponiamo di un modello predittivo, possiamo sempre scomporre le previsioni del modello nei contributi apportati dalle singole caratteristiche. Questo può essere fatto tramite i valori SHAP (se non sai come funzionano i valori SHAP, puoi leggere il mio articolo: I valori SHAP spiegati esattamente come avresti voluto che qualcuno ti spiegasse).

Quindi, diciamo che questi sono i valori SHAP relativi al nostro modello per i tre individui.

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Valori SHAP per le previsioni del nostro modello (in migliaia di $). [Immagine dell'autore]

 

La proprietà principale dei valori SHAP è che sono additivi. Ciò significa che, prendendo la somma di ciascuna riga, otterremo la previsione del nostro modello per quell'individuo. Ad esempio, se prendiamo la seconda riga: 72k $ +3k $ -22k $ = 53k $, che è esattamente la previsione del modello per il secondo individuo.

Ora, i valori SHAP sono un buon indicatore di quanto sia importante una caratteristica per le nostre previsioni. Infatti, quanto più alto è il valore SHAP (assoluto), tanto più influente è la caratteristica per la previsione su quello specifico individuo. Tieni presente che sto parlando di valori SHAP assoluti perché il segno qui non ha importanza: una caratteristica è ugualmente importante se spinge la previsione verso l'alto o verso il basso.

Perciò, il contributo di previsione di una caratteristica è uguale alla media dei valori SHAP assoluti di quella caratteristica. Se hai i valori SHAP memorizzati in un dataframe Pandas, è semplice come:

prediction_contribution = shap_values.abs().mean()

Nel nostro esempio, questo è il risultato:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Contributo di previsione. [Immagine dell'autore]

 

Come puoi vedere, il lavoro è chiaramente la caratteristica più importante poiché, in media, rappresenta 71.67k $ del pronostico finale. La nazionalità e l'età sono rispettivamente la seconda e la terza caratteristica più rilevante.

Tuttavia, il fatto che una determinata caratteristica rappresenti una parte rilevante della previsione finale non dice nulla sulle prestazioni della caratteristica. Per considerare anche questo aspetto, dovremo calcolare il “Contributo di errore”.

Diciamo che vogliamo rispondere alla seguente domanda: “Quali previsioni farebbe il modello se non avesse la funzionalità lavoro?” I valori SHAP ci permettono di rispondere a questa domanda. Infatti, essendo additivi, è sufficiente sottrarre i valori SHAP relativi alla caratteristica lavoro dalle previsioni fatte dal modello.

Naturalmente possiamo ripetere questa procedura per ciascuna funzionalità. Nei panda:

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

Questo è il risultato:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Previsioni che otterremmo se rimuovessimo la rispettiva funzionalità. [Immagine dell'autore]

 

Ciò significa che, se non avessimo la funzionalità lavoro, il modello prevederebbe 20 $ per il primo individuo, -19 $ per il secondo e -8 $ per il terzo. Invece, se non avessimo la funzionalità  , il modello prevederebbe 73 $ per il primo individuo, 50 $ per il secondo e così via.

Come puoi vedere, le previsioni per ciascun individuo variano molto se rimuoviamo funzionalità diverse. Di conseguenza, anche gli errori di previsione sarebbero molto diversi. Possiamo calcolarli facilmente:

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

Il risultato è il seguente:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Errori assoluti che otterremmo se rimuovessimo la rispettiva funzionalità. [Immagine dell'autore]

 

Questi sono gli errori che otterremmo se rimuovessimo la rispettiva funzionalità. Intuitivamente, se l'errore è piccolo, rimuovere la funzionalità non è un problema, o addirittura è vantaggioso, per il modello. Se l'errore è elevato, rimuovere la funzionalità non è una buona idea.

Ma possiamo fare di più. Infatti, possiamo calcolare la differenza tra gli errori del modello completo e gli errori che otterremmo senza la funzionalità:

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

Quale è:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Differenza tra gli errori del modello e gli errori che avremmo senza la funzionalità. [Immagine dell'autore]

 

Se questo numero è:

  • negativo, allora la presenza della caratteristica porta ad una riduzione dell'errore di previsione, quindi la caratteristica funziona bene per quell'osservazione!
  • positivo, allora la presenza della caratteristica porta ad un aumento dell'errore di previsione, quindi la caratteristica è negativa per quell'osservazione.

Possiamo calcolare il "contributo di errore" come la media di questi valori, per ciascuna caratteristica. Nei panda:

error_contribution = error_diff.mean()

Questo è il risultato:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Contributo di errore. [Immagine dell'autore]

 

Se questo valore è positivo significa che, in media, la presenza della feature nel modello porta ad un errore maggiore. Pertanto, senza tale caratteristica, la previsione sarebbe stata generalmente migliore. In altre parole, la funzionalità sta causando più danni che benefici!

Al contrario, più questo valore è negativo, più la funzionalità è vantaggiosa per le previsioni poiché la sua presenza porta a errori minori.

Proviamo a utilizzare questi concetti su un set di dati reale.

Di seguito utilizzerò un set di dati tratto da Picaret (una libreria Python sotto Licenza MIT). Il set di dati si chiama “Gold” e contiene serie temporali di dati finanziari.

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Esempio di set di dati. Le caratteristiche sono tutte espresse in percentuale, quindi -4.07 significa un rendimento del -4.07%. [Immagine dell'autore]

 

Le caratteristiche consistono nei rendimenti delle attività finanziarie rispettivamente 22, 14, 7 e 1 giorno prima del momento di osservazione (“T-22”, “T-14”, “T-7”, “T-1”). Ecco l’elenco esaustivo di tutte le attività finanziarie utilizzate come funzionalità predittive:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Elenco degli asset disponibili. Ciascun asset viene osservato ai tempi -22, -14, -7 e -1. [Immagine dell'autore]

 

In totale, abbiamo 120 funzionalità.

L'obiettivo è prevedere il prezzo dell'oro (rendimento) con 22 giorni di anticipo ("Gold_T+22"). Diamo un'occhiata alla variabile target.

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Istogramma della variabile. [Immagine dell'autore]

 

Una volta caricato il dataset, questi sono i passaggi che ho eseguito:

  1. Suddividi l'intero set di dati in modo casuale: 33% delle righe nel set di dati di training, un altro 33% nel set di dati di convalida e il restante 33% nel set di dati di test.
  2. Addestra un regressore LightGBM sul set di dati di addestramento.
  3. Effettua previsioni su set di dati di training, convalida e test utilizzando il modello addestrato nel passaggio precedente.
  4. Calcola i valori SHAP dei set di dati di training, validazione e test, utilizzando la libreria Python "shap".
  5. Calcola il contributo di previsione e il contributo di errore di ciascuna funzionalità su ciascun set di dati (addestramento, convalida e test), utilizzando il codice che abbiamo visto nel paragrafo precedente.

Confrontiamo il contributo degli errori e il contributo della previsione nel set di dati di training. Utilizzeremo un grafico a dispersione, quindi i punti identificano le 120 caratteristiche del modello.

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Contributo di previsione e contributo di errore (nel set di dati di training). [Immagine dell'autore]

 

Esiste una correlazione altamente negativa tra il contributo della previsione e il contributo dell'errore nel set di training.

E questo ha senso: poiché il modello apprende dal dataset di training, tende ad attribuire elevata importanza (ovvero un elevato contributo di previsione) a quelle caratteristiche che portano a una grande riduzione dell'errore di previsione (ovvero un contributo di errore altamente negativo).

Ma questo non aggiunge molto alla nostra conoscenza, giusto?

In effetti, ciò che conta davvero per noi è il set di dati di convalida. Il set di dati di convalida è infatti il ​​miglior proxy che possiamo avere su come le nostre funzionalità si comporteranno sui nuovi dati. Quindi, facciamo lo stesso confronto sul set di validazione.

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Contributo di previsione e contributo di errore (sul set di dati di convalida). [Immagine dell'autore]

 

Da questo grafico possiamo estrarre alcune informazioni molto più interessanti.

Le caratteristiche nella parte in basso a destra del grafico sono quelle a cui il nostro modello assegna correttamente un'elevata importanza poiché in realtà portano una riduzione dell'errore di previsione.

Da notare inoltre che “Gold_T-22” (il ritorno dell’oro 22 giorni prima del periodo di osservazione) funziona davvero bene rispetto all’importanza che gli attribuisce il modello. Ciò significa che questa caratteristica è probabilmente inadeguata. E questa informazione è particolarmente interessante poiché l’oro è l’asset che stiamo cercando di prevedere (“Gold_T+22”).

D'altro canto, le funzionalità che hanno un contributo di errore superiore a 0 peggiorano le nostre previsioni. Ad esempio, "US Bond ETF_T-1" modifica in media la previsione del modello dello 0.092% (contributo alla previsione), ma porta il modello a fare una previsione in media dello 0.013% (contributo all'errore) peggiore di quanto sarebbe stato senza tale funzione. .

Possiamo supporre questo tutte le funzionalità con un elevato contributo di errore (rispetto al loro contributo di previsione) probabilmente sono sovradimensionate o, in generale, hanno comportamenti diversi nel training set e nel validation set.

Vediamo quali funzionalità hanno il maggior contributo di errori.

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Funzionalità ordinate in base al contributo degli errori decrescente. [Immagine dell'autore]

 

E ora le funzionalità con il contributo di errori più basso:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Funzionalità ordinate in base al contributo di errori crescente. [Immagine dell'autore]

 

È interessante notare che possiamo osservare che tutte le caratteristiche con un contributo di errore più elevato sono relative a T-1 (1 giorno prima del momento di osservazione), mentre quasi tutte le caratteristiche con un contributo di errore più piccolo sono relative a T-22 (22 giorni prima del momento di osservazione). ).

Ciò sembra indicarlo le caratteristiche più recenti tendono a sovradimensionarsi, mentre le caratteristiche più distanti nel tempo tendono a generalizzarsi meglio.

Tieni presente che, senza il contributo degli errori, non avremmo mai avuto questa intuizione.

I metodi RFE (Recursive Feature Elimination) tradizionali si basano sulla rimozione di funzionalità non importanti. Ciò equivale a rimuovere prima le funzionalità con un piccolo contributo di previsione.

Tuttavia, in base a quanto detto nel paragrafo precedente, avrebbe più senso rimuovere prima le funzionalità con il contributo di errori più elevato.

Per verificare se la nostra intuizione è verificata, confrontiamo i due approcci:

  • RFE tradizionale: rimuovere prima le funzionalità inutili (contributo di previsione più basso).
  • Il nostro RFE: rimozione di funzionalità dannose prima di tutto (contributo di errore più alto).

Vediamo i risultati sul validation set:

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Errore assoluto medio delle due strategie sul set di validazione. [Immagine dell'autore]

 

La migliore iterazione per ciascun metodo è stata cerchiata: è il modello con 19 funzionalità per il tradizionale RFE (linea blu) e il modello con 17 funzionalità per il nostro RFE (linea arancione).

In generale, sembra che il nostro metodo funzioni bene: rimuovere la funzionalità con il contributo di errore più elevato porta a un MAE costantemente più piccolo rispetto alla rimozione della funzionalità con il contributo di previsione più elevato.

Tuttavia, potresti pensare che funzioni bene solo perché stiamo adattando eccessivamente il set di convalida. Dopotutto, a noi interessa il risultato che otterremo sul set di prova.

Vediamo quindi lo stesso confronto sul set di prova.

 

Le tue caratteristiche sono importanti? Non significa che siano buoni
Errore assoluto medio delle due strategie sul set di test. [Immagine dell'autore]

 

Il risultato è simile al precedente. Anche se c'è meno distanza tra le due linee, il MAE ottenuto rimuovendo il contributore di errore più alto è chiaramente migliore del MAE ottenuto rimuovendo il contributore di previsione più basso.

Poiché abbiamo selezionato i modelli che portano al MAE più piccolo sul set di validazione, vediamo il loro risultato sul set di test:

  • Contributo RFE-Prediction (19 funzionalità). MAE sul set di prova: 2.04.
  • Contributo RFE-Error (17 funzionalità). MAE sul set di prova: 1.94.

Quindi il miglior MAE che utilizza il nostro metodo è migliore del 5% rispetto al RFE tradizionale!

Il concetto di importanza delle funzionalità gioca un ruolo fondamentale nel machine learning. Tuttavia, il concetto di “importanza” viene spesso confuso con quello di “bontà”.

Per distinguere questi due aspetti abbiamo introdotto due concetti: contributo di previsione e contributo di errore. Entrambi i concetti si basano sui valori SHAP del dataset di validazione, e nell'articolo abbiamo visto il codice Python per calcolarli.

Li abbiamo anche provati su un set di dati finanziari reali (in cui il compito è prevedere il prezzo dell'oro) e dimostrato che l'eliminazione ricorsiva delle caratteristiche basata sul contributo di errore porta a un errore assoluto medio migliore del 5% rispetto al tradizionale RFE basato sul contributo di previsione.

Tutto il codice utilizzato per questo articolo può essere trovato in questo taccuino.

Grazie per aver letto!

 
 
Samuele Mazzanti è Lead Data Scientist presso Jakala e attualmente vive a Roma. È laureato in Statistica e i suoi principali interessi di ricerca riguardano le applicazioni di machine learning per l'industria. È anche un creatore di contenuti freelance.

 
Originale. Ripubblicato con il permesso.
 

Timestamp:

Di più da KDnuggets