Apprendimento automatico e Reti Neurali - pagina 74

 

13.2 Metodi di filtro per la selezione delle caratteristiche -- Soglia di varianza (L13: Selezione delle caratteristiche)


13.2 Metodi di filtro per la selezione delle caratteristiche -- Soglia di varianza (L13: Selezione delle caratteristiche)

Sì, quindi nel video precedente abbiamo discusso le tre diverse categorie di selezione delle funzionalità: metodi filtro, metodi incorporati e metodi wrapper. Ora, approfondiamo una delle categorie, i metodi di filtro. Nei prossimi video, esploreremo anche i metodi incorporati e i metodi wrapper. Tuttavia, per ora, concentriamoci sui metodi di filtro come argomento principale.

I metodi di filtro sono tecniche di selezione delle caratteristiche che considerano principalmente le proprietà intrinseche delle caratteristiche stesse. Non si basano su un modello specifico per la selezione delle funzionalità. Un esempio di metodo di filtro è la soglia di varianza. Diamo un'occhiata più da vicino a come funziona la soglia di varianza.

Quando si utilizza una soglia di varianza per la selezione delle caratteristiche, calcoliamo la varianza di ciascuna caratteristica. Il presupposto è che le caratteristiche con varianze più elevate possono contenere informazioni più utili per l'addestramento di un classificatore o di un modello di regressione. Ma perché è vero? Per capirlo, consideriamo una funzionalità chiamata X1. Sul lato sinistro, abbiamo una caratteristica con varianza elevata e i valori della caratteristica sono ben distribuiti. Sul lato destro, abbiamo una caratteristica con varianza bassa e i valori della caratteristica sono meno distribuiti. Una varianza più elevata ci consente di ricostruire i limiti decisionali basati su quella caratteristica. Questo è fondamentale per fare previsioni accurate. Anche nello scenario peggiore in cui le classi si sovrappongono, caratteristiche ben distribuite possono ancora aiutare a costruire confini decisionali.

Per illustrare ulteriormente questo concetto, consideriamo un caso di classificazione binaria. Supponiamo di avere due classi, classe quadrato e classe stella. Nella migliore delle ipotesi, tutti i punti dati di una classe sono su un lato e tutti i punti dati dell'altra classe sono sull'altro. Ciò semplifica la costruzione di un limite decisionale che separi perfettamente le classi. Tuttavia, negli scenari del mondo reale, la separazione perfetta non è sempre realizzabile. Anche quando le classi si sovrappongono, una caratteristica con un'elevata varianza può ancora aiutare a costruire limiti decisionali. Ad esempio, un albero decisionale può classificare i punti dati in modo accurato in base a caratteristiche ben distribuite, come dimostrato nell'esempio di codifica.

Ora che comprendiamo l'importanza della varianza, discutiamo di come possiamo usarla come misura per la selezione delle caratteristiche. La varianza di una variabile casuale discreta può essere calcolata utilizzando una formula specifica, ma in pratica lavoriamo spesso con set di dati di cui non conosciamo la distribuzione di probabilità. Pertanto, assumiamo pesi uniformi e calcoliamo la varianza in base ai punti dati osservati. Ad esempio, quando si tratta di caratteristiche categoriche, eseguiamo la codifica one-hot per creare variabili binarie. In questo caso, la varianza di una variabile di Bernoulli può essere calcolata come p * (1 - p), dove p è la probabilità di osservare un valore pari a 1. Questo calcolo della varianza è particolarmente utile per la selezione delle caratteristiche in scenari di caratteristiche categoriche.

Per implementare la selezione delle funzionalità basata sulla varianza, Scikit-learn fornisce la classe VarianceThreshold. Questa classe ci consente di rimuovere le caratteristiche con varianze basse. Specificando una soglia di varianza, possiamo eliminare le colonne delle caratteristiche in cui una certa percentuale delle etichette è la stessa. Ad esempio, se vogliamo rimuovere le caratteristiche in cui più dell'80% delle etichette sono simili, possiamo impostare la soglia di varianza a 0,16 (calcolata come 0,8 * (1 - 0,8)). Questa soglia assicura che le caratteristiche con scarso potere discriminatorio vengano scartate.

In sintesi, i metodi di filtro come la soglia di varianza sono preziosi per la selezione delle caratteristiche perché considerano le proprietà intrinseche delle caratteristiche. Analizzando la varianza delle caratteristiche, possiamo identificare e rimuovere quelle che forniscono informazioni limitate per attività di classificazione o regressione.

13.2 Filter Methods for Feature Selection -- Variance Threshold (L13: Feature Selection)
13.2 Filter Methods for Feature Selection -- Variance Threshold (L13: Feature Selection)
  • 2021.12.10
  • www.youtube.com
Sorry, I had some issues with the microphone (a too aggressive filter to remove background noise). Should be better in the next vids!Description: This video ...
 

13.3.1 Regressione logistica regolarizzata L1 come selezione di funzionalità incorporate (L13: selezione di funzionalità)


13.3.1 Regressione logistica regolarizzata L1 come selezione di funzionalità incorporate (L13: selezione di funzionalità)

Nel video precedente, abbiamo discusso diversi metodi per la selezione delle funzionalità, concentrandoci in particolare sui metodi di filtro basati sulle proprietà delle funzionalità. Ora, esaminiamo due diverse categorie di selezione delle funzionalità: metodi incorporati e metodi wrapper. Entrambe queste categorie comportano l'utilizzo di un modello, ad esempio un classificatore, per la selezione delle caratteristiche. In questo video, ci concentreremo sui metodi incorporati, in cui la selezione delle funzionalità avviene implicitamente come parte del processo di addestramento o ottimizzazione del modello.

I metodi incorporati integrano la selezione delle funzionalità nel processo di addestramento del modello. Esploreremo questo concetto nel contesto della regressione logistica L1-regolarizzata, nota anche come regressione Lasso. Prima di procedere, è importante notare che questo video presuppone una conoscenza di base della regressione logistica. Tuttavia, tratteremo solo i concetti essenziali per evitare di essere troppo distratti.

Iniziamo considerando un modello di regressione logistica binaria con due classi, utilizzando il set di dati Iris con due caratteristiche: lunghezza e larghezza del petalo. La regressione logistica produce un limite decisionale lineare per separare le due classi. Il limite di decisione è determinato applicando una soglia alla somma pesata degli input, che subiscono una trasformazione non lineare.

Per comprendere meglio la regressione logistica, esaminiamo una rappresentazione grafica del modello. In questo diagramma, abbiamo i pesi (w) sul lato sinistro, con w1 e w2 che rappresentano i pesi per le due caratteristiche. Inoltre, abbiamo l'unità di polarizzazione (B) che funge da termine di intercettazione. La somma ponderata viene calcolata come la somma del prodotto di ciascun peso e della sua caratteristica corrispondente, più il termine di polarizzazione. Questa somma ponderata viene quindi passata attraverso una funzione sigmoidale, nota anche come sigmoide logistico, che restituisce un valore compreso tra 0 e 1. Questo valore rappresenta la probabilità di appartenenza alla classe, indicando la probabilità che un punto dati appartenga alla classe 1 date le caratteristiche osservate . Applicando una soglia (tipicamente 0,5), possiamo fare previsioni binarie, classificando il punto dati come classe 0 o classe 1.

Ora che abbiamo una conoscenza di base della regressione logistica, concentriamoci sulla regressione logistica L1-regolarizzata. L'aspetto chiave della regolarizzazione L1 è l'inclusione di un termine norma L1, che misura l'entità dei pesi. Questo termine si aggiunge alla funzione di perdita, penalizzando di fatto modelli complessi con pesi elevati. Nella regressione logistica, miriamo a minimizzare la funzione di perdita minimizzando anche i pesi.

Per visualizzarlo, immagina le linee di contorno che rappresentano la funzione di perdita. I contorni esterni corrispondono a grandi valori di perdita, mentre i contorni più vicini al centro rappresentano valori di perdita più piccoli. Il minimo globale della funzione di perdita senza regolarizzazione si verifica al centro, indicando i pesi ottimali per minimizzare la perdita. Tuttavia, il termine di penalità L1 preferisce pesi più piccoli e incoraggia la semplicità. Introducendo questo termine di penalità, cerchiamo un equilibrio tra minimizzare la perdita e minimizzare la penalità. Sorprendentemente, la regressione logistica L1-regolarizzata tende a produrre pesi sparsi, con alcuni pesi esattamente pari a zero. Questo aspetto della selezione delle funzionalità è ciò che rende attraente la regolarizzazione L1.

Per dimostrare in pratica la regressione logistica L1-regolarizzata, utilizzeremo il set di dati del vino. Questo set di dati contiene 13 diverse caratteristiche relative a varie caratteristiche del vino e il compito è classificare i vini in diversi tipi. Iniziamo suddividendo i dati in set di addestramento e test, una pratica comune nell'apprendimento automatico.

Si prega di notare che gli esempi di codice dettagliati e ulteriori spiegazioni possono essere trovati nel taccuino che accompagna questo video, che verrà fornito di seguito.

Ora passiamo alla parte di selezione delle caratteristiche utilizzando l'approccio di regolarizzazione L1, noto anche come Lasso. Useremo il modello di regressione logistica di scikit-learn, che ci consente di applicare la penalità di regolarizzazione L1.

 from sklearn.linear_model import LogisticRegression

# Create a Logistic Regression model with L1 regularization
model = LogisticRegression(penalty= 'l1' , solver= 'liblinear' )

# Fit the model on the training data
model.fit(X_train, y_train)

Impostando il parametro penalty su 'l1', specifichiamo che vogliamo utilizzare la regolarizzazione L1. Il parametro del risolutore è impostato su 'liblinear', che è adatto per piccoli set di dati come quello con cui stiamo lavorando.

Dopo aver adattato il modello ai dati di addestramento, possiamo accedere ai coefficienti appresi, che rappresentano i pesi assegnati a ciascuna caratteristica. Stampiamo i coefficienti:

# Get the learned coefficients
coefficients = model.coef_

# Print the coefficients
for i, coef in enumerate(coefficients[ 0 ]):
    print(f 'Feature {i+1}: {coef:.4f}' )
L'attributo coef_ del modello contiene i coefficienti. Iteriamo sui coefficienti e li stampiamo, associando ogni coefficiente alla sua caratteristica corrispondente.

Successivamente, possiamo identificare le caratteristiche che hanno coefficienti diversi da zero, in quanto queste sono le caratteristiche selezionate. Troviamo le caratteristiche selezionate e stampiamole:

# Find the indices of non-zero coefficients
selected_features = [i for i, coef in enumerate(coefficients[ 0 ]) if coef != 0 ]

# Print the selected features
print( 'Selected features:' )
for feature in selected_features:
    print(f 'Feature {feature+1}' )
Iteriamo nuovamente sui coefficienti, questa volta memorizzando gli indici dei coefficienti diversi da zero nell'elenco selected_features. Infine, stampiamo le caratteristiche selezionate.

Applicando la regolarizzazione L1, il modello di regressione logistica esegue implicitamente la selezione delle caratteristiche portando alcuni coefficienti a zero. Le caratteristiche con coefficienti diversi da zero sono considerate importanti per le previsioni del modello.

È importante notare che la scelta del parametro di regolarizzazione C influenza il grado di regolarizzazione applicato. Un valore C più piccolo si traduce in una regolarizzazione più forte, portando potenzialmente a più caratteristiche con coefficienti zero.

Ora hai una comprensione del metodo di selezione delle caratteristiche incorporate utilizzando la regolarizzazione L1 in Regressione logistica. Nel prossimo video, esploreremo la selezione delle funzionalità con alberi decisionali e foreste casuali.

Nel prossimo video, esploreremo la selezione delle funzionalità utilizzando alberi decisionali e foreste casuali. Questi metodi sono noti come metodi di ensemble e possono essere utilizzati sia per problemi di classificazione che di regressione.

Gli alberi decisionali sono modelli semplici ma potenti che effettuano previsioni suddividendo lo spazio delle caratteristiche in regioni e assegnando un'etichetta a ciascuna regione. Le foreste casuali, d'altra parte, sono un insieme di alberi decisionali in cui ogni albero viene addestrato su un sottoinsieme casuale di dati e caratteristiche.

Iniziamo usando il Random Forest Classifier di scikit-learn per la selezione delle caratteristiche:

 from sklearn.ensemble import RandomForestClassifier

# Create a Random Forest Classifier
model = RandomForestClassifier()

# Fit the model on the training data
model.fit(X_train, y_train)

Dopo aver adattato il modello ai dati di addestramento, possiamo accedere all'importanza delle funzionalità, che rappresentano l'importanza relativa di ciascuna funzionalità nelle previsioni del modello. Stampiamo l'importanza delle caratteristiche:

# Get the feature importances
importances = model.feature_importances_

# Print the feature importances
for i, importance in enumerate(importances):
    print(f 'Feature {i+1}: {importance:.4f}' )
L'attributo feature_importances_ del modello contiene l'importanza delle funzionalità. Ripetiamo le importanza e le stampiamo, associando ogni importanza alla caratteristica corrispondente.

Successivamente, possiamo classificare le caratteristiche in base alla loro importanza e selezionare le caratteristiche principali. Troviamo le caratteristiche top k e stampiamole:

# Rank the features based on importances
feature_ranks = sorted(range(len(importances)), key=lambda i: importances[i], reverse=True)

# Select the top k features
k = 5   # Number of top features to select
top_features = feature_ranks[:k]

# Print the top features
print(f 'Top {k} features:' )
for feature in top_features:
    print(f 'Feature {feature+1}' )

Ordiniamo gli indici delle caratteristiche in base alla loro importanza, in ordine decrescente. Quindi, selezioniamo le migliori caratteristiche suddividendo l'elenco feature_ranks. Infine, stampiamo le caratteristiche principali.

Le foreste casuali considerano il contributo medio di ciascuna caratteristica in tutti gli alberi decisionali dell'insieme. Maggiore è l'importanza, più influente è la caratteristica nel fare previsioni.

In questo modo, le foreste casuali forniscono un modo semplice per eseguire la selezione delle funzionalità in base ai punteggi di importanza.

Ora hai una comprensione della selezione delle funzionalità utilizzando alberi decisionali e foreste casuali. Nel prossimo video tratteremo il metodo di eliminazione delle funzionalità ricorsive.

13.3.1 L1-regularized Logistic Regression as Embedded Feature Selection (L13: Feature Selection)
13.3.1 L1-regularized Logistic Regression as Embedded Feature Selection (L13: Feature Selection)
  • 2021.12.13
  • www.youtube.com
Without going into the nitty-gritty details behind logistic regression, this lecture explains how/why we can consider an L1 penalty --- a modification of the...
 

13.3.2 Alberi decisionali e importanza delle caratteristiche della foresta casuale (L13: selezione delle caratteristiche)


13.3.2 Alberi decisionali e importanza delle caratteristiche della foresta casuale (L13: selezione delle caratteristiche)

Saluti, spettatori! Nel nostro video precedente, abbiamo iniziato la nostra discussione sui metodi incorporati per la selezione delle funzionalità, concentrandoci su un esempio di regressione logistica regolarizzata. Oggi approfondiremo un altro esempio di metodi incorporati, vale a dire alberi decisionali, ed esamineremo come selezionano le funzionalità in ciascun nodo. Esploreremo anche la loro relazione con l'importanza delle caratteristiche della foresta casuale, un concetto che potresti già conoscere. Quindi, entriamo subito!

Ma prima di procedere, ho un piccolo annuncio da fare. Sfortunatamente, la matita o la penna del mio iPad non funziona più, quindi sono passato all'utilizzo di una pen tablet. Tuttavia, devo ammettere che abituarsi è stato un po' più complicato di quanto mi aspettassi. Potrebbero volerci altri video per diventare veramente a mio agio e competente con esso. Inoltre, sto provando un nuovo software di annotazione dello schermo, quindi per favore abbi pazienza se ci sono problemi. Spero che il processo di annotazione diventi più agevole nei prossimi video. Ora, concentriamoci nuovamente sul nostro argomento.

Per ricapitolare, la selezione delle funzionalità può essere ampiamente classificata in tre metodi principali: metodi filtro, metodi wrapper e metodi incorporati. Nel nostro video precedente, abbiamo esplorato la regressione logistica regolarizzata con Lasso o L1 come esempio di metodi incorporati. Oggi spostiamo la nostra attenzione sugli alberi decisionali e sulle foreste casuali.

Innanzitutto, discutiamo degli alberi decisionali e di come eseguono la selezione delle funzionalità. Per illustrare questo, consideriamo un set di dati che abbiamo esaminato in precedenza. Consiste di due feature, x1 e x2, e di due classi: quadrati (classe 0) e triangoli (classe 1). Il nostro obiettivo è classificare i punti dati e possiamo visualizzare il confine decisionale come una linea di demarcazione che separa le due classi. Confini decisionali multipli possono raggiungere questo obiettivo, come dimostrerò tra breve.

Ora, diamo un'occhiata più da vicino a come un albero decisionale suddivide il set di dati. Ho addestrato un albero decisionale usando scikit-learn e l'ho tracciato per te. Questo albero presenta due spaccature. La prima suddivisione si verifica sulla funzione x1 a un valore limite di 5,5, dividendo i dati in due gruppi. La seconda suddivisione avviene sulla funzione x2 a un valore limite di 10,5, suddividendo ulteriormente i dati. Effettuando queste divisioni, l'albero decisionale classifica correttamente il set di dati. Possiamo valutare l'efficacia di queste scissioni esaminando l'entropia, che indica il livello di mescolanza o disordine nelle classi. Il nostro obiettivo è ridurre il più possibile l'entropia, raggiungendo idealmente un valore pari a zero, che significa classificazione perfetta. Nel nostro esempio, osserviamo che l'entropia diminuisce ad ogni divisione, fino a raggiungere lo zero.

Ciò che è interessante da notare è che gli alberi decisionali eseguono intrinsecamente la selezione delle funzionalità. Ad ogni nodo, l'albero decide quale caratteristica usare per la divisione. Questa decisione si basa sulla caratteristica che massimizza la diminuzione dell'entropia o massimizza il guadagno di informazioni. Di conseguenza, l'albero decisionale seleziona automaticamente le caratteristiche più informative per costruire il modello di classificazione.

Ora spostiamo la nostra attenzione su foreste casuali, che sono insiemi di alberi decisionali. Le foreste casuali forniscono un mezzo per stimare l'importanza delle caratteristiche. Per dimostrarlo, passiamo al set di dati del vino, che comprende 13 diverse caratteristiche relative a varie caratteristiche del vino, come la gradazione alcolica, l'acido malico, la cenere e altro ancora. Sul lato destro, puoi vedere un grafico dell'importanza delle caratteristiche generato dalla foresta casuale. L'importanza delle funzionalità varia da 0 a 1 e somma fino a 1, che rappresenta l'importanza relativa di ciascuna funzionalità. La trama è ordinata in ordine decrescente, con la caratteristica più importante a sinistra.

Per generare questo grafico, ho utilizzato l'attributo feature_importances_ di scikit-learn, che calcola l'importanza delle caratteristiche in base al modello di foresta casuale. Come puoi osservare, la caratteristica più importante in questo set di dati è la prolina, seguita dai flavonoidi e dall'intensità del colore.

I valori di importanza delle caratteristiche sono determinati misurando la riduzione totale dell'impurità (spesso misurata dall'impurità Gini o dall'entropia) ottenuta dalle divisioni su ciascuna caratteristica in tutti gli alberi decisionali nella foresta casuale. Le caratteristiche che portano costantemente a una maggiore riduzione delle impurità sono considerate più importanti.

È importante notare che l'importanza delle caratteristiche è una misura relativa nel contesto del modello di foresta casuale. I valori sono specifici per la foresta casuale di cui hai eseguito il training e potrebbero non essere generalizzabili ad altri modelli o set di dati. Tuttavia, può ancora fornire preziose informazioni su quali caratteristiche sono più influenti nel fare previsioni.

Ora che abbiamo trattato gli alberi decisionali e le foreste casuali, riassumiamo ciò che abbiamo imparato finora. Gli alberi decisionali eseguono la selezione delle caratteristiche in modo implicito selezionando la caratteristica più informativa ad ogni divisione, con l'obiettivo di diminuire l'entropia e migliorare la classificazione. D'altra parte, le foreste casuali, come un insieme di alberi decisionali, forniscono una misura dell'importanza delle caratteristiche valutando la riduzione totale dell'impurità ottenuta da ciascuna caratteristica su tutti gli alberi.

Comprendere l'importanza delle funzionalità può essere utile in vari modi. Aiuta a identificare le funzionalità più rilevanti per la previsione della variabile target, consente la riduzione della dimensionalità concentrandosi sulle funzionalità più informative e fornisce approfondimenti sulle relazioni sottostanti tra le funzionalità e la variabile target.

Approfondiamo ora il processo di valutazione dell'importanza delle caratteristiche nelle foreste casuali. Esploreremo un metodo chiamato importanza della permutazione. Ma prima di farlo, rivisitiamo brevemente il campionamento bootstrap e il concetto di campioni out-of-bag.

Il campionamento bootstrap comporta il campionamento casuale del set di dati originale con la sostituzione, con conseguente duplicazione dei punti dati. Di conseguenza, alcuni esempi non sono inclusi nell'esempio bootstrap, creando quelli che chiamiamo campioni out-of-bag. Questi campioni servono come set di convalida o valutazione poiché gli alberi non li vedono durante l'addestramento.

Ora, concentriamoci sul metodo B, che è l'importanza della permutazione. Utilizza i campioni out-of-bag di cui abbiamo discusso in precedenza. In primo luogo, possiamo valutare le prestazioni predittive degli alberi decisionali nella foresta casuale durante l'addestramento. Per ogni albero, è possibile effettuare previsioni per i campioni out-of-bag, che fungono da punti dati di convalida o test esclusivi per quell'albero.

Per calcolare l'importanza della permutazione, iniziamo con una matrice di caratteristiche contenente i valori delle caratteristiche originali per gli esempi out-of-bag. Per ogni albero decisionale nella foresta casuale, permutiamo i valori della funzione J negli esempi out-of-bag. Ciò significa che mescoliamo casualmente i valori delle caratteristiche mantenendo invariate le etichette delle classi.

Successivamente, usiamo la matrice delle caratteristiche permutate per fare previsioni sugli esempi out-of-bag utilizzando l'albero decisionale corrente. Ricorda, queste previsioni si basano sui valori della funzione permutata, quindi rappresentano le prestazioni del modello quando la funzione J viene randomizzata.

Confrontiamo le previsioni permutate con le previsioni originali per ogni esempio fuori borsa e contiamo quante volte la previsione della classe corretta cambia a causa della permutazione della caratteristica J. Questo conteggio riflette l'impatto della caratteristica J sull'accuratezza del modello. Se la funzione J è importante, la permutazione dei suoi valori dovrebbe portare a una significativa diminuzione dell'accuratezza della previsione.

Ripetiamo questo processo per ogni caratteristica nel set di dati, calcolando l'impatto di ogni caratteristica sulla precisione del modello. Quanto più la permutazione di una caratteristica influisce sulle previsioni, tanto più importante è considerata.

Per quantificare l'importanza della caratteristica, calcoliamo la diminuzione della precisione causata dalla permutazione di ciascuna caratteristica. Questo viene fatto sottraendo l'accuratezza permutata dall'accuratezza originale e calcolando la media di questa differenza su tutti gli alberi decisionali nella foresta casuale.

Infine, normalizziamo i valori di importanza delle caratteristiche in modo che si riassumano in uno, fornendo una misura relativa dell'importanza tra le caratteristiche. Questa normalizzazione assicura che i valori di importanza siano comparabili e interpretabili.

Tuttavia, è essenziale essere consapevoli del fatto che il metodo dell'importanza della permutazione presenta alcune limitazioni e considerazioni.

In primo luogo, l'importanza della permutazione può sottovalutare l'importanza delle caratteristiche correlate. Quando si permuta una caratteristica, può portare a cambiamenti nelle previsioni per altre caratteristiche correlate. Di conseguenza, l'importanza di tali caratteristiche correlate potrebbe non riflettersi accuratamente nel grafico dell'importanza delle caratteristiche. È importante considerare la correlazione tra le caratteristiche quando si interpreta la loro importanza.

In secondo luogo, l'importanza della permutazione presuppone che l'importanza della caratteristica sia basata esclusivamente sull'accuratezza predittiva del modello. Sebbene l'accuratezza predittiva sia un fattore cruciale, potrebbe non cogliere tutti gli aspetti dell'importanza delle funzionalità. Potrebbero esserci altre dimensioni di importanza, come l'interpretabilità o la rilevanza della conoscenza del dominio di una caratteristica.

Nonostante queste limitazioni, l'importanza della permutazione fornisce una preziosa misura quantitativa dell'importanza delle caratteristiche. Consente a ricercatori e professionisti di comprendere quali caratteristiche hanno la maggiore influenza sulle previsioni del modello e può guidare le decisioni relative alla selezione delle caratteristiche, all'interpretazione del modello e alla riduzione della dimensionalità.

Nel prossimo video esploreremo un'altra categoria di metodi di selezione delle funzionalità chiamati metodi wrapper. I metodi wrapper implicano la valutazione di diversi sottoinsiemi di funzionalità utilizzando uno specifico modello di machine learning. Approfondiremo l'eliminazione delle funzionalità ricorsive e la selezione delle funzionalità avanti/indietro. Questi metodi possono essere particolarmente utili quando il numero di feature è elevato e la selezione del sottoinsieme più rilevante diventa cruciale per le prestazioni del modello.

Per ricapitolare, abbiamo coperto i metodi incorporati, in particolare gli alberi decisionali e le foreste casuali, come tecniche per la selezione delle caratteristiche. Gli alberi decisionali eseguono la selezione delle caratteristiche in modo implicito selezionando la caratteristica più informativa ad ogni divisione, con l'obiettivo di diminuire l'entropia e migliorare la classificazione. Le foreste casuali, come un insieme di alberi decisionali, forniscono una misura dell'importanza delle caratteristiche valutando la riduzione totale dell'impurità ottenuta da ciascuna caratteristica su tutti gli alberi. Abbiamo anche discusso il metodo dell'importanza della permutazione, che quantifica l'importanza delle caratteristiche permutando i valori delle caratteristiche e misurando il loro impatto sull'accuratezza del modello.

Comprendere l'importanza delle funzionalità consente ai data scientist e ai professionisti di prendere decisioni informate sulla selezione delle funzionalità, interpretare i modelli e ottenere informazioni sulle relazioni sottostanti tra le funzionalità e la variabile target. È uno strumento prezioso nel toolkit di apprendimento automatico che può contribuire a migliorare le prestazioni e la comprensione del modello.

Nei nostri video precedenti, abbiamo coperto diversi metodi per la selezione delle funzionalità, inclusi metodi di filtro, metodi wrapper e metodi incorporati. In questo video, ci concentreremo sui metodi wrapper, in particolare sull'eliminazione ricorsiva delle funzionalità (RFE) e sulla selezione delle funzionalità forward/backward.

I metodi wrapper sono tecniche di selezione delle funzionalità che implicano la valutazione di diversi sottoinsiemi di funzionalità utilizzando uno specifico modello di machine learning. A differenza dei metodi filtro, che si basano su misure statistiche, e dei metodi incorporati, che integrano la selezione delle funzionalità nel processo di addestramento del modello, i metodi wrapper utilizzano le prestazioni di un modello come criterio per la selezione delle funzionalità.

Iniziamo discutendo l'eliminazione delle caratteristiche ricorsive (RFE). RFE è un approccio iterativo alla selezione delle caratteristiche che funziona eliminando ricorsivamente le caratteristiche e costruendo modelli sulle restanti caratteristiche. Inizia addestrando un modello sul set completo di funzionalità e classifica le funzionalità in base alla loro importanza. Quindi, elimina le funzionalità meno importanti e ripete il processo con le funzionalità rimanenti. Questo processo iterativo continua fino a quando non viene raggiunto un numero specificato di funzionalità o viene raggiunta una soglia di prestazioni predefinita.

L'idea alla base di RFE è che rimuovendo in modo ricorsivo le funzionalità meno importanti, si concentri sulle funzionalità più informative che contribuiscono maggiormente alle prestazioni del modello. RFE può essere utilizzato con qualsiasi modello di machine learning che fornisca una misura dell'importanza delle funzionalità o dei pesi delle funzionalità. I modelli più diffusi utilizzati con RFE includono la regressione logistica, le macchine vettoriali di supporto e le foreste casuali.

Passiamo ora alla selezione delle funzioni avanti/indietro. Si tratta di due metodi wrapper correlati che cercano un sottoinsieme ottimale di funzionalità aggiungendo o rimuovendo in modo iterativo funzionalità in base al loro contributo alle prestazioni del modello.

La selezione delle funzionalità in avanti inizia con un set di funzionalità vuoto e aggiunge in modo iterativo una funzionalità alla volta. Ad ogni iterazione, valuta le prestazioni del modello utilizzando la convalida incrociata o un'altra metrica di valutazione e seleziona la funzionalità che migliora maggiormente le prestazioni. Il processo continua fino a quando non viene soddisfatto un criterio di arresto predefinito, come il raggiungimento di un numero desiderato di funzionalità o un plateau nel miglioramento delle prestazioni.

La selezione delle funzionalità all'indietro, d'altra parte, inizia con il set completo di funzionalità e rimuove in modo iterativo una funzionalità alla volta. Ad ogni iterazione, valuta le prestazioni del modello e rimuove la funzionalità che ha il minor impatto sulle prestazioni. Il processo continua finché non viene soddisfatto un criterio di arresto.

Sia la selezione delle funzionalità in avanti che all'indietro può essere computazionalmente costosa, specialmente quando si ha a che fare con un gran numero di funzionalità. Per mitigare questo, possono essere impiegate varie strategie, come l'uso di euristiche o approssimazioni per accelerare il processo di ricerca.

Vale la pena notare che i metodi wrapper, inclusi RFE, selezione in avanti e selezione all'indietro, possono essere sensibili alla scelta della metrica di valutazione e al modello di apprendimento automatico utilizzato. Diverse metriche di valutazione possono portare a diversi sottoinsiemi di funzionalità selezionate e le prestazioni delle funzionalità selezionate possono variare a seconda dei diversi modelli.

In pratica, si consiglia di eseguire la convalida incrociata o utilizzare un set di convalida esterno per ottenere una stima affidabile delle prestazioni del modello con diversi sottoinsiemi di funzionalità. Questo aiuta a evitare l'overfitting e a selezionare le funzionalità che si generalizzano bene ai dati invisibili.

Per riassumere, i metodi wrapper, come l'eliminazione di funzionalità ricorsive (RFE), la selezione di funzionalità in avanti e la selezione di funzionalità all'indietro, sono tecniche iterative per la selezione di funzionalità che valutano diversi sottoinsiemi di funzionalità in base alle prestazioni di un modello. Questi metodi possono aiutare a identificare le funzionalità più rilevanti per una specifica attività di machine learning, migliorare l'interpretabilità del modello e ridurre la dimensionalità dello spazio delle funzionalità.

Nel prossimo video esploreremo altre tecniche avanzate per la selezione delle caratteristiche, inclusi gli algoritmi genetici e l'analisi dei componenti principali (PCA). Questi metodi offrono opzioni aggiuntive per la selezione delle funzionalità basate su diversi principi di ottimizzazione e tecniche statistiche. Resta sintonizzato per quello!

La selezione delle funzionalità è un passaggio fondamentale nella pipeline di machine learning e la scelta del giusto metodo di selezione delle funzionalità dipende dal set di dati specifico, dall'attività di machine learning e dai compromessi desiderati tra prestazioni del modello, interpretabilità ed efficienza computazionale.

13.3.2 Decision Trees & Random Forest Feature Importance (L13: Feature Selection)
13.3.2 Decision Trees & Random Forest Feature Importance (L13: Feature Selection)
  • 2021.12.22
  • www.youtube.com
This video explains how decision trees training can be regarded as an embedded method for feature selection. Then, we will also look at random forest feature...
 

13.4.1 Eliminazione di funzioni ricorsive (L13: selezione delle funzioni)


13.4.1 Eliminazione di funzioni ricorsive (L13: selezione delle funzioni)

In questa sezione, esploreremo l'argomento dei metodi Wrapper per la selezione delle funzionalità, basandoci sulle nostre precedenti discussioni sui metodi di filtro e sui metodi incorporati. I metodi wrapper utilizzano i modelli in modo esplicito per la selezione delle funzionalità. Un esempio popolare di metodo wrapper è l'eliminazione ricorsiva di funzionalità (RFE), su cui ci concentreremo in questo video. Inoltre, nei prossimi video approfondiremo anche altri metodi di selezione delle funzionalità utilizzando tecniche wrapper.

Per fornire una panoramica, esistono tre metodi principali per la selezione delle funzionalità: metodi filtro, metodi incorporati e metodi wrapper. Oggi ci concentriamo sui metodi wrapper. L'idea alla base di RFE può essere riassunta in tre fasi.

Innanzitutto, adattiamo un modello al set di dati, in genere utilizzando modelli lineari come la regressione lineare o la regressione logistica. Questo passaggio non è niente di straordinario.

Successivamente, esaminiamo il modello e osserviamo in particolare i coefficienti del modello, di cui parleremo più dettagliatamente a breve. Sulla base delle grandezze di questi coefficienti, eliminiamo la caratteristica con il coefficiente più piccolo. Considerando la caratteristica con il coefficiente più piccolo come la meno importante, possiamo rimuoverla da ulteriori considerazioni. Vale la pena notare che la normalizzazione o la standardizzazione delle funzionalità è importante per questo processo, garantendo che siano su una scala comparabile. Vedremo in seguito esempi concreti di questo.

Il passaggio finale consiste nel ripetere i passaggi uno e due fino a raggiungere il numero desiderato di funzioni. In sostanza, adattiamo continuamente il modello ed eliminiamo la caratteristica meno importante fino a quando non abbiamo il set di funzionalità desiderato. Questo metodo semplice ma efficace fornisce un approccio diretto alla selezione delle funzionalità.

Un aspetto critico dell'eliminazione delle caratteristiche ricorsive risiede nell'eliminazione dei coefficienti o dei pesi del modello. Per illustrare ciò, consideriamo i modelli di regressione lineare e di regressione logistica. La regressione lineare viene utilizzata per modellare obiettivi continui, mentre la regressione logistica è un classificatore per etichette discrete o categoriali. Non approfondiremo qui i dettagli di questi modelli, poiché sono stati trattati nelle lezioni precedenti.

Sia nella regressione lineare che in quella logistica, i modelli hanno coefficienti o pesi. Nella regressione lineare, questi pesi rappresentano le pendenze, mentre nella regressione logistica sono associati all'influenza di ciascuna caratteristica sul risultato della classificazione. Esaminando le grandezze di questi pesi, possiamo determinare l'importanza di ciascuna caratteristica. L'eliminazione della caratteristica con il peso o il coefficiente più piccolo la rimuove efficacemente dalla considerazione. In alternativa, impostando il peso su zero si ottiene lo stesso risultato, poiché il calcolo della somma ponderata esclude il contributo della caratteristica.

Per comprendere meglio come funziona l'eliminazione delle funzionalità, esaminiamo un esempio utilizzando la regressione logistica. Abbiamo un problema di classificazione binaria con due caratteristiche, x1 e x2, e vogliamo determinare la probabilità di appartenenza alla classe. Calcolando una somma ponderata utilizzando i valori delle caratteristiche e i pesi del modello, otteniamo l'input netto. Applicando una funzione sigmoidea logistica all'input netto, deriviamo la probabilità di appartenenza alla classe. Il confronto di questa probabilità con una soglia, tipicamente 0,5, ci consente di assegnare etichette di classe.

Il punto chiave è che i pesi in questi modelli riflettono l'importanza di ciascuna caratteristica. Pesi maggiori indicano una maggiore importanza, in quanto contribuiscono in modo più significativo all'input netto e successivamente influenzano il risultato della classificazione. La standardizzazione o la normalizzazione dei pesi garantisce che siano sulla stessa scala, facilitando una migliore interpretazione della loro importanza.

Andando avanti, esploriamo un esempio di utilizzo dell'eliminazione ricorsiva delle funzionalità in scikit-learn con il set di dati wine. Il codice qui presentato illustra il processo. Per prima cosa prepariamo il set di dati suddividendolo in set di addestramento e test, quindi standardizzando le funzionalità. Quindi, istanziamo un oggetto RFE dalla classe RFE in scikit-learn. Passiamo uno stimatore di regressione logistica all'oggetto RFE e specifichiamo il numero desiderato di caratteristiche da selezionare (ad esempio, 5 in questo caso).

Dopo aver istanziato l'oggetto RFE, possiamo adattarlo ai nostri dati di addestramento utilizzando il metodo fit. Questo avvierà il processo di eliminazione delle funzionalità ricorsive. L'oggetto RFE addestrerà il modello di regressione logistica sui dati di addestramento e quindi eliminerà la funzione con il coefficiente più piccolo. Ripeterà questo processo in modo iterativo fino al raggiungimento del numero desiderato di funzioni.

Dopo aver adattato l'oggetto RFE, possiamo accedere alle funzionalità selezionate utilizzando l'attributo support_. Questo attributo restituisce una maschera booleana che indica quali feature sono state selezionate. Possiamo anche ottenere la classifica delle caratteristiche in base alla loro importanza utilizzando l'attributo ranking_. Più basso è il rango, più importante è la caratteristica.

Nella fase successiva, possiamo trasformare i nostri dati di addestramento originali e i dati di test per includere solo le funzionalità selezionate utilizzando il metodo di trasformazione dell'oggetto RFE. Questo creerà nuovi set di funzionalità solo con le funzionalità selezionate.

Infine, possiamo addestrare un modello di regressione logistica sui dati di addestramento trasformati e valutarne le prestazioni sui dati di test trasformati. Questo ci consentirà di valutare l'efficacia del processo di selezione delle caratteristiche e determinare se ha migliorato l'accuratezza predittiva del modello.

Vale la pena notare che il numero di funzionalità da selezionare e la dimensione del passaggio sono iperparametri che possono essere ottimizzati per trovare la configurazione ottimale per un set di dati e un modello specifici. La ricerca a griglia o altre tecniche di ottimizzazione degli iperparametri possono essere impiegate per trovare la migliore combinazione di questi parametri.

Nel complesso, l'eliminazione ricorsiva delle funzionalità è un metodo wrapper per la selezione delle funzionalità che si basa sull'addestramento di un modello e sull'eliminazione iterativa delle funzionalità meno importanti. Può essere applicato sia a problemi di regressione che di classificazione e può essere utilizzato con diversi tipi di modelli. La selezione delle feature si basa sui coefficienti o pesi assegnati alle feature dal modello. Rimuovendo in modo iterativo le funzionalità meno importanti, RFE mira a migliorare le prestazioni del modello concentrandosi sulle funzionalità più informative.

13.4.1 Recursive Feature Elimination (L13: Feature Selection)
13.4.1 Recursive Feature Elimination (L13: Feature Selection)
  • 2021.12.27
  • www.youtube.com
In this video, we start our discussion of wrapper methods for feature selection. In particular, we cover Recursive Feature Elimination (RFE) and see how we c...
 

13.4.2 Importanza della permutazione delle caratteristiche (L13: selezione delle caratteristiche)


13.4.2 Importanza della permutazione delle caratteristiche (L13: selezione delle caratteristiche)

Benvenuti in questo video in cui approfondiremo l'argomento dell'importanza della permutazione. L'importanza della permutazione fa parte dei metodi wrapper per la selezione delle funzionalità, di cui abbiamo discusso brevemente nel video precedente. I metodi wrapper implicano l'utilizzo di un modello per eseguire la selezione delle funzionalità o stimare l'importanza delle funzionalità. In una lezione precedente, abbiamo esplorato l'eliminazione ricorsiva delle caratteristiche come esempio di metodo wrapper. Ora sposteremo la nostra attenzione sull'importanza della permutazione. Nei prossimi video, esploreremo anche un altro metodo chiamato selezione sequenziale delle funzioni.

Prima di immergerti nei dettagli nitidi di come funziona l'importanza della permutazione, lascia che ti fornisca una panoramica concisa del metodo. In sostanza, l'importanza della permutazione implica il rimescolamento di ciascuna colonna di funzionalità in un set di dati. Quindi, utilizzando un modello già addestrato, valutiamo le prestazioni del modello sul set di dati mescolato e le confrontiamo con le prestazioni originali. In genere, osserviamo un calo delle prestazioni quando una colonna di funzionalità viene rimescolata. Questo calo delle prestazioni funge da indicatore dell'importanza della funzione. Naturalmente, riassumere il metodo in soli due passaggi può sembrare un po' complicato, quindi nelle prossime diapositive ti illustrerò il processo in modo più dettagliato e più lento.

Applicando l'importanza della permutazione a ciascuna colonna nel set di dati, possiamo generare un grafico a barre che illustra l'importanza di ciascuna caratteristica. Inoltre, possiamo facoltativamente includere la deviazione standard dei valori di importanza nel grafico. Nel prossimo video, fornirò un esempio di codice su come creare una tale trama.

Ora, prima di approfondire la spiegazione dettagliata dell'importanza della permutazione e dell'algoritmo alla base, esaminiamo alcuni fatti degni di nota. L'importanza della permutazione spesso produce risultati simili all'importanza casuale delle caratteristiche della foresta basata sull'impurità. Tuttavia, il vantaggio dell'importanza della permutazione è che è indipendente dal modello, il che significa che può essere utilizzato con qualsiasi tipo di algoritmo o modello di machine learning. È importante notare che mentre l'importanza della permutazione non è strettamente un metodo di selezione delle caratteristiche, fornisce approfondimenti sulle caratteristiche su cui un modello si basa maggiormente. Di conseguenza, possiamo utilizzare le misure di importanza delle caratteristiche come base per la selezione delle caratteristiche.

Se ricordi la nostra precedente discussione sull'importanza delle caratteristiche della foresta casuale, puoi pensare all'importanza della permutazione come una generalizzazione di uno dei metodi, in particolare il metodo B, in quel video. Tuttavia, invece di utilizzare campioni out-of-bag, l'importanza della permutazione utilizza il set di controllo. Se hai bisogno di un ripasso sugli esempi fuori borsa, sentiti libero di rivisitare il video precedente.

Ora, tuffiamoci nell'algoritmo passo-passo dell'importanza della permutazione. Innanzitutto, iniziamo con un modello che è stato adattato al training set. Questo modello può essere qualsiasi modello o algoritmo di machine learning. Ad esempio, consideriamo un classificatore foresta casuale. Formiamo la foresta casuale sul set di addestramento, che è un passaggio standard.

Successivamente, stimiamo le prestazioni predittive del modello su un set di dati indipendente, come il set di convalida o il set di test. Registriamo questa performance come performance di riferimento. Ad esempio, supponiamo di ottenere una precisione del 99% sul set di convalida utilizzando il nostro modello di foresta casuale adattato. Consideriamo questo come la prestazione di base.

Per ogni colonna di funzionalità nel set di dati, mescoliamo casualmente quella colonna specifica mantenendo invariate le altre colonne e le etichette di classe. Questo processo di mescolamento è illustrato con un set di dati di esempio. Supponiamo di avere un set di dati con tre colonne di funzionalità e quattro esempi di addestramento. Ci concentriamo sulla mescolanza della colonna uno, rappresentata da un colore diverso nell'esempio. Dopo la mescolanza, l'ordine dei valori in quella colonna cambia. Permutiamo casualmente i valori mantenendo i valori originali nelle colonne due e tre.

Un altro vantaggio dell'importanza della permutazione è che può gestire bene le caratteristiche correlate. Poiché valuta l'importanza di ogni caratteristica individualmente mescolandone i valori, acquisisce il contributo univoco di ogni caratteristica alle prestazioni del modello, indipendentemente dalle correlazioni con altre caratteristiche. Ciò è particolarmente utile in scenari in cui sono presenti set di dati ad alta dimensione con funzionalità correlate.

L'importanza della permutazione fornisce anche una misura dell'importanza della caratteristica che è più affidabile dell'importanza della caratteristica intrinseca fornita da alcuni modelli. Ad esempio, negli alberi decisionali o nelle foreste casuali, l'importanza di una caratteristica si basa sulla riduzione delle impurità che ottiene durante la suddivisione dei dati. Tuttavia, questa misura può essere sbilanciata verso caratteristiche con molte possibili divisioni o quelle che appaiono più in alto nella struttura ad albero. L'importanza della permutazione fornisce una stima più diretta e imparziale dell'importanza delle funzionalità valutando direttamente l'impatto della mescolanza di ciascuna funzionalità.

L'aspetto negativo è che l'importanza della permutazione può essere computazionalmente costosa, soprattutto se il processo di addestramento del modello richiede molto tempo o se è presente un numero elevato di funzionalità. Poiché il processo di permutazione richiede la rivalutazione delle prestazioni del modello più volte, può aggiungere un sovraccarico significativo. Tuttavia, esistono tecniche di ottimizzazione e strategie di parallelizzazione che possono aiutare a mitigare questo problema, come l'utilizzo del calcolo parallelo o la riduzione del numero di permutazioni.

Vale la pena notare che l'importanza della permutazione non è un proiettile d'argento per la selezione delle funzionalità o l'interpretazione del modello. Sebbene fornisca preziose informazioni sull'importanza delle singole caratteristiche, dovrebbe essere utilizzato insieme ad altre tecniche e conoscenze di dominio. L'importanza della caratteristica da sola non garantisce il potere predittivo o la pertinenza di una caratteristica. È essenziale considerare il contesto, il problema specifico ei limiti del modello.

In sintesi, l'importanza della permutazione è un metodo potente e indipendente dal modello per valutare l'importanza delle funzionalità in un modello di machine learning. Mescolando i valori delle funzionalità e confrontando le prestazioni del modello prima e dopo la mescolanza, fornisce una misura affidabile dell'importanza delle funzionalità. È facile da capire, gestisce bene le caratteristiche correlate e non è suscettibile di overfitting. Tuttavia, può essere computazionalmente costoso e dovrebbe essere utilizzato insieme ad altre tecniche per la selezione completa delle caratteristiche e l'interpretazione del modello.

13.4.2 Feature Permutation Importance (L13: Feature Selection)
13.4.2 Feature Permutation Importance (L13: Feature Selection)
  • 2021.12.29
  • www.youtube.com
This video introduces permutation importance, which is a model-agnostic, versatile way for computing the importance of features based on a machine learning c...
 

13.4.3 Esempi di codici di importanza della permutazione delle caratteristiche (L13: selezione delle caratteristiche)


13.4.3 Esempi di codici di importanza della permutazione delle caratteristiche (L13: selezione delle caratteristiche)

Bene, quindi ora che abbiamo coperto l'introduzione di base all'importanza della permutazione, diamo un'occhiata ad alcuni esempi di codice per vedere come possiamo usare l'importanza della permutazione nella pratica. Sì, e come sempre, ho anche gli esempi di codice in Jupyter Notebook collegati sotto il video. Inoltre, a differenza di sempre, lavoreremo di nuovo con un set di dati del vento, solo per semplificare le cose.

Quindi il set di dati del vento, ancora una volta, è un set di dati composto da 13 colonne. Ed ecco una panoramica di come appaiono le prime cinque righe. Quindi ci sono tre classi, classe uno, due e tre. E ci sono 13 colonne, ma non tutte le colonne sono mostrate qui a causa di vincoli di spazio. Ma sì, non discuteremo troppo dettagliatamente di questo set di dati sul vento perché l'abbiamo visto così tante volte prima.

Sì, e poi anche, come sempre, divideremo il set di dati in un set di addestramento e uno di test. Quindi qui, quello che stiamo facendo è prendere il set di dati, tranne la prima colonna, che è la colonna dell'etichetta. Quindi divideremo il set di dati in un set di addestramento e uno di test in cui il 30% dei dati viene utilizzato per i test e il 70% verrà utilizzato per l'addestramento corrispondente. Si noti qui che non stiamo creando alcun set di convalida. Quindi è solo la mia opinione personale. Ma non penso che abbiamo bisogno necessariamente di un set di convalida se calcoliamo le prestazioni della permutazione perché sì, di solito dovremmo mantenere il nostro set di test indipendente. Ma se ripensi a come funzionano le prestazioni della permutazione, in base al video precedente, qui osserviamo solo il calo delle prestazioni quando permutiamo una colonna di funzionalità. Quindi non stiamo realmente ricalcolando l'accuratezza del test, stiamo solo usando il set di test per vedere di quanto diminuiranno le prestazioni se mescoliamo una colonna.

Sì, siamo ancora nella fase di installazione qui. Quindi qui in questa diapositiva, stiamo preparando il nostro modello. E infatti, qui c'è un classificatore forestale casuale. Quindi, nel video precedente, abbiamo appreso che l'importanza della permutazione è un metodo indipendente dal modello. Ciò significa che possiamo calcolarlo per qualsiasi tipo di modello. Tuttavia, stiamo usando qui una foresta casuale in modo da poter quindi confrontare l'importanza della permutazione con le prestazioni basate sull'impurità della foresta casuale, che potrebbe essere un confronto interessante. Quindi qui stiamo impostando un classificatore di foreste casuali con 100 alberi. E lo stiamo adattando al training set. E qui c'è solo il calcolo dell'accuratezza. E possiamo vedere che l'accuratezza dell'addestramento è del 100% e anche l'accuratezza del test è del 100%, il che indica che questo è in realtà un modello piuttosto buono, oppure può anche solo indicare che il set di dati è abbastanza facile da classificare.

Una cosa che volevo notare anche qui è che quando calcoliamo l'importanza della permutazione, è piuttosto importante avere un modello molto performante se vogliamo interpretare l'importanza della caratteristica come un'importanza della caratteristica generale. Perché se non disponiamo di un modello che funziona bene, potremmo scoprire su quali funzionalità si basa maggiormente il modello, ma non ci dice davvero, diciamo, quanto sia importante la funzionalità nel contesto della variabile target se il modello non è molto preciso. Quindi, prima di esaminare l'importanza della permutazione, solo per riferimento, ecco di nuovo l'importanza basata sull'impurità. Quindi, questa è l'importanza casuale basata sull'impurità della foresta di cui abbiamo già discusso in un video precedente. Ancora una volta, questo è solo per riferimento, dove accediamo a questo attributo di importanza della caratteristica dopo aver adattato il modello.

Quindi, stiamo applicando arg_sort, in modo da ottenere l'ordinamento dei valori di importanza dal più grande al più piccolo. Quindi, dal più grande al più piccolo. E poi quello che stiamo facendo è creare un grafico a barre per visualizzare l'importanza basata sull'impurità. Il grafico a barre mostrerà i nomi delle caratteristiche sull'asse x ei corrispondenti valori di importanza sull'asse y. Ordinando i valori di importanza in ordine decrescente, le caratteristiche più importanti verranno tracciate per prime.

Successivamente, il codice passa al calcolo dell'importanza della permutazione. L'importanza della permutazione viene calcolata mescolando in modo casuale i valori di ciascuna funzionalità nel set di test e misurando il calo delle prestazioni del modello. Maggiore è il calo delle prestazioni, più importante è considerata la funzione. Il codice usa un ciclo for per scorrere ogni funzionalità nel set di dati.

All'interno del ciclo, i valori delle caratteristiche nel set di test vengono mescolati utilizzando np.random.permutation(). Quindi, il set di test mescolato viene passato attraverso il classificatore di foresta casuale addestrato per ottenere le etichette previste. L'accuratezza del modello sul set di test mescolato viene calcolata utilizzando la funzione accurate_score(). La differenza tra l'accuratezza del test originale e l'accuratezza del test mescolato rappresenta il calo delle prestazioni causato dalla permutazione della funzione.

Il calo delle prestazioni per ciascuna funzione viene memorizzato in un elenco denominato importanza_vals. Dopo aver eseguito l'iterazione su tutte le funzionalità, l'elenco important_vals contiene il calo dei valori delle prestazioni per ciascuna funzionalità.

Infine, viene creato un grafico a barre per visualizzare l'importanza della permutazione. I nomi delle funzionalità vengono tracciati sull'asse x e il calo corrispondente nei valori delle prestazioni viene tracciato sull'asse y. Ancora una volta, i valori di importanza sono ordinati in ordine decrescente per evidenziare le caratteristiche più importanti.

Questo codice fornisce un confronto tra l'importanza basata sull'impurità e l'importanza della permutazione. Confrontando i due grafici, è possibile osservare se ci sono differenze nella classifica dell'importanza delle caratteristiche tra i due metodi.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X, y)

# Compute impurity-based feature importances
importances = clf.feature_importances_

# Plot impurity-based feature importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importances, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Importance' )
plt.title( 'Impurity-based Feature Importances' )
plt.show()

# Compute permutation importances
importance_vals = []
for feature in range(X.shape[ 1 ]):
    X_permuted = X.copy()
    np.random.shuffle(X_permuted[:, feature])
    y_pred = clf.predict(X_permuted)
    accuracy = accuracy_score(y, y_pred)
    drop_in_performance = accuracy_score(y, y_pred) - accuracy
    importance_vals.append(drop_in_performance)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importance_vals, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Drop in Performance' )
plt.title( 'Permutation Importances' )
plt.show()
Questo codice creerà due grafici a barre affiancati. Il primo grafico mostrerà l'importanza delle caratteristiche basate sull'impurità e il secondo grafico mostrerà l'importanza della permutazione. Esaminando questi grafici, è possibile ottenere informazioni sull'importanza relativa delle diverse funzionalità nel set di dati Iris secondo questi due metodi.

Assicurati di aver importato le librerie necessarie, come matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris e sklearn.metrics.accuracy_score.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
In questo codice, utilizziamo la funzione permutation_importance dal modulo sklearn.inspection per calcolare l'importanza della permutazione. Il set di dati è suddiviso in set di addestramento e test utilizzando train_test_split. Quindi inseriamo un classificatore di foreste casuali sui dati di addestramento e calcoliamo l'importanza della permutazione utilizzando i dati di test.

L'importanza della permutazione risultante viene memorizzata nella variabile di importanza. Usiamo np.argsort per ottenere gli indici che ordinano le importanza in ordine crescente. Questo aiuta a tracciare le importanza nell'ordine corretto.

Infine, creiamo un grafico a barre orizzontali utilizzando plt.barh per visualizzare l'importanza della permutazione. L'asse y rappresenta le caratteristiche, mentre l'asse x rappresenta i valori di importanza. Le funzioni plt.xlabel, plt.ylabel e plt.title vengono utilizzate per aggiungere etichette e un titolo al grafico.

Assicurati di aver importato le librerie necessarie, come matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris, sklearn.inspection.permutation_importance e sklearn.model_selection.train_test_split.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
In questo codice, utilizziamo la funzione permutation_importance dal modulo sklearn.inspection per calcolare l'importanza della permutazione. Il set di dati è suddiviso in set di addestramento e test utilizzando train_test_split. Quindi inseriamo un classificatore di foreste casuali sui dati di addestramento e calcoliamo l'importanza della permutazione utilizzando i dati di test.

L'importanza della permutazione risultante viene memorizzata nella variabile di importanza. Usiamo np.argsort per ottenere gli indici che ordinano le importanza in ordine crescente. Questo aiuta a tracciare le importanza nell'ordine corretto.

Infine, creiamo un grafico a barre orizzontali utilizzando plt.barh per visualizzare l'importanza della permutazione. L'asse y rappresenta le caratteristiche, mentre l'asse x rappresenta i valori di importanza. Le funzioni plt.xlabel, plt.ylabel e plt.title vengono utilizzate per aggiungere etichette e un titolo al grafico.

Assicurati di aver importato le librerie necessarie, come matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris, sklearn.inspection.permutation_importance e sklearn.model_selection.train_test_split.

13.4.3 Feature Permutation Importance Code Examples (L13: Feature Selection)
13.4.3 Feature Permutation Importance Code Examples (L13: Feature Selection)
  • 2021.12.30
  • www.youtube.com
This video shows code examples for computing permutation importance in mlxtend and scikit-learn. Permutation importance is a model-agnostic, versatile way fo...
 

13.4.4 Selezione sequenziale delle funzioni (L13: Selezione delle funzioni)


13.4.4 Selezione sequenziale delle funzioni (L13: Selezione delle funzioni)

Nei video precedenti, ho introdotto il concetto di importanza delle caratteristiche utilizzando l'importanza della permutazione come tecnica preferita. In questo video, voglio discutere un'altra tecnica importante chiamata selezione sequenziale delle caratteristiche, che fa anche parte dei metodi wrapper di cui abbiamo parlato in precedenza.

Prima di addentrarci nella selezione sequenziale delle funzionalità, ricapitoliamo brevemente i diversi tipi di metodi di selezione delle funzionalità che abbiamo discusso finora. Abbiamo iniziato con i metodi di filtraggio, poi siamo passati a metodi incorporati come l'eliminazione di funzionalità ricorsive e ora ci stiamo concentrando sui metodi wrapper.

I metodi wrapper mirano a trovare un sottoinsieme di funzionalità ottimale provando tutte le possibili combinazioni di funzionalità. Questo approccio è noto come selezione esaustiva delle funzionalità. Per capire come funziona, consideriamo l'esempio del set di dati Iris, che ha quattro caratteristiche: lunghezza del sepalo, larghezza del sepalo, lunghezza del petalo e larghezza del petalo. Per trovare la migliore combinazione di funzionalità per il nostro modello, dovremmo provare tutti i possibili sottoinsiemi, dalle singole funzionalità al set completo di funzionalità.

Per il set di dati Iris, ciò comporterebbe 15 possibili combinazioni, inclusi sottoinsiemi di una, due, tre e quattro caratteristiche. Tuttavia, la selezione completa delle funzionalità può essere computazionalmente costosa e soggetta a overfitting. Per mitigare questi problemi, possiamo utilizzare un set di convalida o una convalida incrociata K-fold per valutare le prestazioni di diversi sottoinsiemi di funzionalità.

Nonostante la sua semplicità, la selezione esaustiva delle funzionalità presenta un limite se applicata a set di dati con un numero elevato di funzionalità. Il numero di possibili sottoinsiemi di funzionalità cresce in modo esponenziale con il numero di funzionalità, rendendolo poco pratico per set di dati di grandi dimensioni. Questa limitazione motiva l'uso della selezione sequenziale delle caratteristiche, che è una tecnica di approssimazione che esplora un sottoinsieme di combinazioni di caratteristiche invece di valutare tutte le possibili combinazioni.

La selezione sequenziale delle funzionalità è un processo iterativo che inizia con il set di funzionalità originale e seleziona o rimuove gradualmente le funzionalità in base alle loro prestazioni. Un approccio popolare è la selezione sequenziale all'indietro, in cui iniziamo con il set completo di funzionalità e rimuoviamo iterativamente una funzionalità alla volta. In ogni iterazione, valutiamo le prestazioni delle funzionalità rimanenti e selezioniamo il sottoinsieme con le prestazioni più elevate. Questo processo continua fino a quando non rimane un sottoinsieme con una sola caratteristica.

L'algoritmo di selezione all'indietro sequenziale può essere riassunto come segue:

  1. Inizia con il set di funzionalità originale.
  2. Genera tutti i possibili sottoinsiemi di funzionalità di dimensione n-1 rimuovendo una funzionalità alla volta.
  3. Valutare le prestazioni di ciascun sottoinsieme candidato.
  4. Seleziona il sottoinsieme con le prestazioni più elevate e rimuovi definitivamente la funzionalità che è assente da questo sottoinsieme.
  5. Ripetere i passaggi 2-4 fino a raggiungere la dimensione della caratteristica desiderata (ad esempio, rimane solo una caratteristica).

Ripetendo i passaggi 2-4, riduciamo gradualmente il set di funzionalità fino a raggiungere il sottoinsieme ottimale. Il sottoinsieme finale viene selezionato in base al punteggio di valutazione più alto e, in caso di parità, viene preferito il sottoinsieme più piccolo per l'efficienza computazionale. Il numero di iterazioni nella selezione all'indietro sequenziale è uguale al numero di caratteristiche meno uno.

La selezione sequenziale in avanti è un'altra variante della selezione sequenziale delle caratteristiche. Invece di rimuovere le funzionalità, la selezione sequenziale in avanti inizia con un set di funzionalità vuoto e aggiunge gradualmente una funzionalità alla volta. Il processo prevede l'addestramento di un classificatore su ogni singola caratteristica e la valutazione delle sue prestazioni. La funzione con le prestazioni più elevate viene selezionata e aggiunta al sottoinsieme. Questo processo continua fino al raggiungimento del numero massimo di funzioni.

In sintesi, la selezione sequenziale delle caratteristiche è una tecnica utile per trovare un sottoinsieme ottimale di caratteristiche. Offre un compromesso tra l'efficienza computazionale e la ricerca di una buona combinazione di funzionalità. La selezione sequenziale all'indietro e la selezione sequenziale in avanti sono due varianti comuni della selezione sequenziale delle funzionalità, ciascuna con i propri vantaggi e casi d'uso. Nel prossimo video, esploreremo come implementare la selezione sequenziale delle funzionalità a livello di codice e affrontare i limiti della selezione esaustiva delle funzionalità.

13.4.4 Sequential Feature Selection (L13: Feature Selection)
13.4.4 Sequential Feature Selection (L13: Feature Selection)
  • 2022.01.05
  • www.youtube.com
This video explains how sequential feature selection works. Sequential feature selection is a wrapper method for feature selection that uses the performance ...
 

13.4.5 Selezione sequenziale delle funzioni -- Esempi di codice (L13: Selezione delle funzioni)


13.4.5 Selezione sequenziale delle funzioni -- Esempi di codice (L13: Selezione delle funzioni)

Ok, è ora di concludere la nostra discussione sulla selezione delle funzionalità. In questo video, dimostrerò come utilizzare la selezione sequenziale delle funzionalità in Python. Inizierò mostrandoti un esempio utilizzando la libreria MLxtend, che è l'implementazione originale che ho sviluppato diversi anni fa. Successivamente, dimostrerò anche come ottenere gli stessi risultati utilizzando scikit-learn, che offre un'implementazione più snella.

Prima di addentrarci nel codice, ti invito a dare un'occhiata alla documentazione, che contiene esempi aggiuntivi che non tratterò in questo video per evitare di renderlo troppo lungo e opprimente. È sempre utile fare riferimento alla documentazione per informazioni più approfondite.

Innanzitutto, iniziamo caricando il plugin "watermark" che ho sviluppato per tenere traccia delle versioni dei miei taccuini e librerie software nel corso degli anni. È buona norma assicurarsi che i numeri di versione corrispondano alle nostre aspettative, soprattutto se alcune opzioni potrebbero non funzionare più a causa di discrepanze tra le versioni. In seguito utilizzeremo anche la libreria matplotlib, quindi importiamola per assicurarci che i grafici vengano visualizzati correttamente nel notebook.

Passiamo ora alla preparazione del set di dati per la selezione delle funzionalità. Come nei video precedenti, utilizzeremo il dataset del vino. Carichiamo il set di dati dal repository di set di dati di machine learning UCI utilizzando Pandas. Dopo aver caricato il set di dati, stampiamo alcune informazioni di base per assicurarci che tutto sia stato caricato correttamente. È anche importante verificare che le etichette delle classi siano rappresentate come numeri interi.

Successivamente, dividiamo il set di dati in set di addestramento e test, come abbiamo fatto nei video precedenti. Inoltre, standardizziamo il set di dati perché utilizzeremo un classificatore K-nearest neighbor, che è sensibile al ridimensionamento delle funzionalità. Dividiamo il set di dati in set di addestramento dell'80% e set di test del 20% e standardizziamo entrambi i set.

Per stabilire una linea di base prima della selezione delle funzionalità, inseriamo un classificatore K-nearest neighbor nel set di dati standardizzato e calcoliamo l'accuratezza dell'addestramento e del test. In questo esempio, scegliamo arbitrariamente cinque vicini per il classificatore, ma questo parametro potrebbe essere soggetto alla ricerca della griglia per prestazioni ottimali. Anche se qui non eseguiremo la ricerca in griglia per mantenere il codice e il video più semplici, un approccio comune è combinare la ricerca in griglia con la selezione sequenziale delle funzionalità. È possibile trovare esempi di ciò nella documentazione.

I risultati di base mostrano che otteniamo un'accuratezza del 98,6% sul set di allenamento e un'accuratezza del 94% sul set di test. Le prestazioni sono abbastanza buone utilizzando tutte le 13 funzionalità del set di dati del vino. Tuttavia, potrebbe esserci un eccesso di adattamento a causa della maledizione della dimensionalità associata ai classificatori del vicino più vicino K. Per mitigare questo, possiamo selezionare un sottoinsieme più piccolo di funzionalità per migliorare potenzialmente le prestazioni.

Dimostriamo ora come utilizzare la selezione sequenziale delle funzioni per selezionare un sottoinsieme di cinque funzioni. Importiamo la classe SequentialFeatureSelector dalla libreria MLxtend e accorciamo il nome dell'importazione in sfs per comodità. Questa classe accetta come input il modello, la dimensione del sottoinsieme di funzionalità desiderata e la direzione di selezione (avanti, indietro, mobile). Impostiamo la direzione in avanti per la selezione sequenziale in avanti. Il parametro verbose ci consente di controllare la quantità di output visualizzato durante l'allenamento, che può essere utile per monitorare i progressi. Specifichiamo la metrica del punteggio come accuratezza e utilizziamo la convalida incrociata di 5 volte per valutare i sottoinsiemi di funzionalità. L'elaborazione parallela può essere abilitata impostando il parametro n_jobs su un numero intero positivo o -1 per utilizzare tutti i core CPU disponibili. In questo caso, lo impostiamo su 8 per un'esecuzione più rapida.

L'output mostra l'avanzamento del processo di selezione delle funzionalità, a partire da una funzionalità e aumentando gradualmente il numero di funzionalità fino a raggiungere la dimensione desiderata del sottoinsieme di cinque. Vengono visualizzate anche le prestazioni di ciascun sottoinsieme di funzionalità, indicando il miglioramento man mano che vengono aggiunte più funzionalità.

Dopo il completamento, possiamo accedere agli indici delle caratteristiche selezionate e ai corrispondenti nomi delle caratteristiche usando rispettivamente gli attributi k_feature_idx_ e k_feature_names_ dell'oggetto sfs. Inoltre, possiamo accedere alla cronologia delle prestazioni dei sottoinsiemi di funzionalità utilizzando l'attributo k_score_. Stampiamo gli indici delle caratteristiche selezionate, i nomi e i punteggi corrispondenti:

print( 'Selected feature indices:' , sfs.k_feature_idx_)
print( 'Selected feature names:' , sfs.k_feature_names_)
print( 'Selected feature scores:' , sfs.k_score_)

L'output mostrerà gli indici, i nomi e i punteggi delle cinque funzionalità selezionate.

Successivamente, possiamo riaddestrare il classificatore del vicino più vicino K sul sottoinsieme di funzionalità selezionato. Per fare ciò, dobbiamo creare un nuovo set di training e test che contenga solo le funzionalità selezionate. Possiamo utilizzare il metodo di trasformazione dell'oggetto sfs per trasformare i set di dati originali nel nuovo spazio delle funzionalità:

X_train_selected = sfs.transform(X_train)
X_test_selected = sfs.transform(X_test)
Dopo aver trasformato i set di dati, possiamo adattare un nuovo classificatore K-nearest neighbor al sottoinsieme di funzionalità selezionato e calcolare le accuratezze di addestramento e test. Stampiamo i risultati:

knn_selected = KNeighborsClassifier(n_neighbors= 5 )
knn_selected.fit(X_train_selected, y_train)

train_acc_selected = knn_selected.score(X_train_selected, y_train)
test_acc_selected = knn_selected.score(X_test_selected, y_test)

print( 'Training accuracy on selected features:' , train_acc_selected)
print( 'Test accuracy on selected features:' , test_acc_selected)
L'output mostrerà l'accuratezza dell'addestramento e del test ottenuta utilizzando solo le cinque funzionalità selezionate.

Confrontando i risultati con le accuratezze della linea di base, possiamo valutare l'impatto della selezione delle caratteristiche sulle prestazioni del classificatore. In alcuni casi, la selezione delle funzionalità può portare a una migliore generalizzazione e a migliori prestazioni del modello riducendo l'overfitting e rimuovendo funzionalità irrilevanti o ridondanti.

Questo è tutto per la dimostrazione utilizzando la libreria MLxtend. Passiamo ora all'utilizzo di scikit-learn per la selezione sequenziale delle funzionalità.

In scikit-learn, la classe SequentialFeatureSelector è disponibile nel modulo feature_selection. Lo importiamo come segue:

from sklearn.feature_selection import SequentialFeatureSelector
L'utilizzo della versione scikit-learn è simile alla versione MLxtend, ma con alcune piccole differenze nei nomi dei parametri e nell'accesso agli attributi. La versione scikit-learn offre anche maggiore flessibilità in termini di utilizzo di diversi algoritmi di selezione delle funzionalità e metriche di punteggio.

Spero che questa dimostrazione ti aiuti a capire come utilizzare la selezione sequenziale delle funzionalità in Python. Ricordarsi di fare riferimento alla documentazione per ulteriori esempi e informazioni.

13.4.5 Sequential Feature Selection -- Code Examples (L13: Feature Selection)
13.4.5 Sequential Feature Selection -- Code Examples (L13: Feature Selection)
  • 2022.01.06
  • www.youtube.com
This final video in the "Feature Selection" series shows you how to use Sequential Feature Selection in Python using both mlxtend and scikit-learn.Jupyter no...
Motivazione: