Utilizzo dei valori SHAP per l’interpretabilità dei modelli nel Machine Learning

Utilizzo dei valori SHAP nell'interpretabilità del Machine Learning

 

Interpretabilità del Machine Learning

 

L’interpretabilità del machine learning si riferisce alle tecniche per spiegare e comprendere come i modelli di machine learning effettuano previsioni. Man mano che i modelli diventano più complessi, diventa sempre più importante spiegare la loro logica interna e ottenere una comprensione del loro comportamento.

Questo è importante perché i modelli di machine learning vengono spesso utilizzati per prendere decisioni che hanno conseguenze reali, come nel settore sanitario, finanziario e della giustizia penale. Senza interpretabilità, può essere difficile sapere se un modello di machine learning sta prendendo buone decisioni o se è influenzato da bias.

Quando si tratta di interpretabilità del machine learning, ci sono varie tecniche da considerare. Un metodo popolare è determinare i punteggi di importanza delle caratteristiche, che rivelano le caratteristiche che hanno il maggiore impatto sulle previsioni del modello. I modelli SKlearn offrono punteggi di importanza delle caratteristiche di default, ma è anche possibile utilizzare strumenti come SHAP, Lime e Yellowbrick per una migliore visualizzazione e comprensione dei risultati del machine learning.

In questo tutorial verranno trattati i valori SHAP e come interpretare i risultati del machine learning con il pacchetto Python SHAP.

 

Cosa sono i valori SHAP?

 

I valori SHAP si basano sui valori di Shapley della teoria dei giochi. Nella teoria dei giochi, i valori di Shapley aiutano a determinare quanto ogni giocatore in un gioco collaborativo ha contribuito al pagamento totale.

Per un modello di machine learning, ogni caratteristica è considerata un “giocatore”. Il valore di Shapley per una caratteristica rappresenta la magnitudine media del contributo di quella caratteristica su tutte le possibili combinazioni di caratteristiche.

In particolare, i valori SHAP vengono calcolati confrontando le previsioni di un modello con e senza una determinata caratteristica presente. Questo viene fatto in modo iterativo per ogni caratteristica e ogni campione nel dataset.

Assegnando a ogni caratteristica un valore di importanza per ogni previsione, i valori SHAP forniscono una spiegazione locale e coerente di come si comporta il modello. Rivelano quali caratteristiche hanno maggior impatto su una previsione specifica, sia in modo positivo che negativo. Questo è prezioso per comprendere il ragionamento di modelli di machine learning complessi come le reti neurali profonde.

 

Primi passi con i valori SHAP

 

In questa sezione, utilizzeremo il dataset di classificazione dei prezzi dei telefoni cellulari di Kaggle per costruire e analizzare modelli di classificazione multipla. Classificheremo i prezzi dei telefoni cellulari in base alle caratteristiche, come la RAM, la dimensione, ecc. La variabile target è <code>price_range</code> con valori di 0 (basso costo), 1 (costo medio-basso), 2 (costo alto) e 3 (costo molto alto).

Nota: Il codice sorgente con gli output è disponibile nello spazio di lavoro di Deepnote.

 

Installazione di SHAP

 

È abbastanza semplice installare <code>shap</code> sul tuo sistema utilizzando i comandi <code>pip</code> o <code>conda</code>.

pip install shap

 

oppure

conda install -c conda-forge shap

 

Caricamento dei dati

 

Il dataset è pulito e ben organizzato, con categorie convertite in numeri utilizzando encoder di etichette.

import pandas as pd

mobile = pd.read_csv("train.csv")
mobile.head()

 

 

Preparazione dei dati

 

Per iniziare, identificheremo le variabili dipendenti e indipendenti e poi le divideremo in set di addestramento e di test separati.

from sklearn.model_selection import train_test_split


X = mobile.drop('price_range', axis=1)
y = mobile.pop('price_range')

# Divisione tra addestramento e test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

 

Allenamento e valutazione del modello 

 

Dopo di che, addestreremo il nostro modello di classificazione Random Forest utilizzando il set di addestramento e valuteremo le sue prestazioni sul set di test. Abbiamo ottenuto un’accuratezza dell’87%, che è piuttosto buona, e il nostro modello è globalmente ben bilanciato.

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# Addestramento del modello
rf = RandomForestClassifier()
rf.fit(X_train, y_train)

# Predizione
y_pred = rf.predict(X_test)

# Valutazione del modello
print(classification_report(y_pred, y_test))

 

              precision    recall  f1-score   support

           0       0.95      0.91      0.93       141
           1       0.83      0.81      0.82       153
           2       0.80      0.85      0.83       158
           3       0.93      0.93      0.93       148

    accuracy                           0.87       600
   macro avg       0.88      0.87      0.88       600
weighted avg       0.87      0.87      0.87       600

 

Calcolo del valore SHAP

 

In questa parte, creeremo un explainers ad albero SHAP e lo utilizzeremo per calcolare i valori SHAP del set di test. 

import shap
shap.initjs()

# Calcola i valori SHAP
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)

 

Riepilogo del grafico

 

Il riepilogo del grafico è una rappresentazione grafica dell’importanza delle caratteristiche di ogni feature nel modello. È uno strumento utile per capire come il modello fa previsioni e per identificare le caratteristiche più importanti.

Nel nostro caso, mostra l’importanza delle caratteristiche per ogni classe target. Risulta che “ram”, “battery_power” e la dimensione del telefono svolgono un ruolo importante nella determinazione della fascia di prezzo.  

# Riassumi gli effetti delle caratteristiche
shap.summary_plot(shap_values, X_test)

 

 

Ora visualizzeremo l’importanza futura della classe “0”. Possiamo chiaramente vedere che ram, batteria e dimensione del telefono hanno effetti negativi nella previsione dei telefoni cellulari a basso costo. 

shap.summary_plot(shap_values[0], X_test)

   

Grafico di dipendenza

 

Un grafico di dipendenza è un tipo di grafico a dispersione che mostra come le previsioni di un modello sono influenzate da una specifica caratteristica. In questo esempio, la caratteristica è “battery_power”. 

L’asse x del grafico mostra i valori di “battery_power”, mentre l’asse y mostra il valore SHAP. Quando la potenza della batteria supera 1200, inizia ad influire negativamente sulla classificazione dei modelli di telefoni cellulari di fascia bassa.

shap.dependence_plot("battery_power", shap_values[0], X_test,interaction_index="ram")

   

Grafico di forza

 

Concentriamoci su un singolo campione. In particolare, analizzeremo più da vicino il 12° campione per vedere quali caratteristiche hanno contribuito al risultato “0”. Per fare ciò, utilizzeremo un grafico di forza e inseriremo il valore atteso, il valore SHAP e il campione di test.

Risulta che ram, dimensione del telefono e velocità del clock hanno una maggiore influenza sui modelli. Abbiamo anche notato che il modello non prevederà la classe “0” poiché il f(x) è inferiore. 

shap.plots.force(explainer.expected_value[0], shap_values[0][12,:], X_test.iloc[12, :], matplotlib = True)

 

 

Ora visualizzeremo il grafico di forza per la classe “1”, e possiamo vedere che è la classe corretta. 

shap.plots.force(explainer.expected_value[1], shap_values[1][12, :], X_test.iloc[12, :],matplotlib = True)

 

 

Possiamo confermare la nostra previsione controllando il 12° record del set di test. 

y_test.iloc[12]
>>> 1

 

Grafico di Decisione

 

I grafici di decisione possono essere uno strumento utile per comprendere il processo decisionale di un modello di machine learning. Possono aiutarci a identificare le caratteristiche più importanti per le previsioni del modello e a individuare eventuali pregiudizi.

Per comprendere meglio i fattori che hanno influenzato la previsione del modello sulla classe “1”, esamineremo il grafico di decisione. In base a questo grafico, sembra che l’altezza del telefono abbia avuto un impatto negativo sul modello, mentre la RAM ha avuto un impatto positivo.

shap.decision_plot(explainer.expected_value[1], shap_values[1][12,:], X_test.columns)

 

 

Conclusioni

 

In questo post del blog, abbiamo presentato i valori SHAP, un metodo per spiegare l’output dei modelli di machine learning. Abbiamo mostrato come i valori SHAP possono essere utilizzati per spiegare le singole previsioni e le prestazioni complessive di un modello. Abbiamo anche fornito esempi di come i valori SHAP possono essere utilizzati nella pratica.

Man mano che il machine learning si espande in settori sensibili come la sanità, le finanze e i veicoli autonomi, l’interpretabilità e la spiegabilità acquisiranno sempre più importanza. I valori SHAP offrono un approccio flessibile e coerente per spiegare le previsioni e il comportamento dei modelli. Possono essere utilizzati per ottenere una comprensione di come i modelli effettuano le previsioni, identificare possibili pregiudizi e migliorare le prestazioni dei modelli.     Abid Ali Awan (@1abidaliawan) è un professionista certificato in data science che ama costruire modelli di machine learning. Attualmente si sta concentrando sulla creazione di contenuti e sulla scrittura di blog tecnici su tecnologie di machine learning e data science. Abid ha una laurea magistrale in Technology Management e una laurea triennale in Ingegneria delle Telecomunicazioni. La sua visione è quella di realizzare un prodotto di intelligenza artificiale utilizzando una rete neurale a grafo per gli studenti che lottano con disturbi mentali.