Cos’è LDA: Analisi discriminante lineare per l’apprendimento automatico

Cos’è LDA: Linear Discriminant Analysis for Machine Learning

Di Priyankur Sarkar

Linear Discriminant Analysis o LDA è una tecnica di riduzione della dimensionalità. È usata come passo di pre-elaborazione nel Machine Learning e nelle applicazioni di classificazione dei modelli. L’obiettivo di LDA è quello di proiettare le caratteristiche in uno spazio dimensionale più alto in uno spazio meno dimensionale per evitare la maledizione della dimensionalità e ridurre le risorse e i costi dimensionali. La tecnica originale è stata sviluppata nell’anno 1936 da Ronald A. Fisher e fu chiamata Analisi Discriminante Lineare o Analisi Discriminante di Fisher. L’originale Linear Discriminant è stata descritta come una tecnica a due classi. La versione multiclasse fu poi generalizzata da C.R Rao come Analisi Discriminante Multipla. Sono tutti semplicemente indicati come Analisi Discriminante Lineare.LDA è una tecnica di classificazione supervisionata che è considerata una parte della creazione di modelli competitivi di apprendimento automatico. Questa categoria di riduzione della dimensionalità è usata in aree come il riconoscimento delle immagini e l’analisi predittiva nel marketing.Cos’è la riduzione della dimensionalità? Le tecniche di riduzione della dimensionalità sono importanti nelle applicazioni di Machine Learning, Data Mining, Bioinformatica e Information Retrieval. L’obiettivo principale è quello di rimuovere le caratteristiche ridondanti e dipendenti cambiando il set di dati in uno spazio a bassa dimensionalità.In termini semplici, riducono le dimensioni (cioè le variabili) in un particolare set di dati mantenendo la maggior parte dei dati.I dati multidimensionali comprendono caratteristiche multiple che hanno una correlazione tra loro. È possibile tracciare dati multidimensionali in solo 2 o 3 dimensioni con la riduzione della dimensionalità. Permette di presentare i dati in un modo esplicito che può essere facilmente compreso da un profano.Quali sono i limiti della regressione logistica? La regressione logistica è un algoritmo di classificazione lineare semplice e potente. Tuttavia, ha alcuni svantaggi che hanno portato ad algoritmi di classificazione alternativi come LDA. Alcune delle limitazioni della Regressione Logistica sono le seguenti:Problemi a due classi – La Regressione Logistica è tradizionalmente usata per problemi di classificazione a due classi e binari. Anche se può essere estrapolata e usata nella classificazione multiclasse, questo viene eseguito raramente. D’altra parte, l’Analisi Discriminante Lineare è considerata una scelta migliore quando è richiesta una classificazione multiclasse e nel caso di classificazioni binarie, vengono applicate sia la regressione logistica che la LDA.Instabile con classi ben separate – La regressione logistica può mancare di stabilità quando le classi sono ben separate. È qui che entra in gioco LDA.Instabile con pochi esempi – Se ci sono pochi esempi da cui i parametri devono essere stimati, la regressione logistica diventa instabile. Tuttavia, l’analisi discriminante lineare è un’opzione migliore perché tende ad essere stabile anche in questi casi.Come avere un approccio pratico ad un modello LDA? Considera una situazione in cui hai tracciato la relazione tra due variabili dove ogni colore rappresenta una classe diversa. Una è mostrata con un colore rosso e l’altra con il blu.Se siete disposti a ridurre il numero di dimensioni a 1, potete semplicemente proiettare tutto sull’asse delle x come mostrato qui sotto: Questo approccio trascura qualsiasi informazione utile fornita dalla seconda caratteristica. Tuttavia, potete usare LDA per tracciarla. Il vantaggio di LDA è che usa le informazioni da entrambe le caratteristiche per creare un nuovo asse che a sua volta minimizza la varianza e massimizza la distanza di classe delle due variabili.Come funziona LDA? LDA si concentra principalmente sulla proiezione delle caratteristiche in uno spazio di dimensione superiore a dimensioni inferiori. È possibile raggiungere questo obiettivo in tre passi: in primo luogo, è necessario calcolare la separabilità tra le classi, che è la distanza tra la media delle diverse classi. Questo è chiamato la varianza tra classi.In secondo luogo, calcolare la distanza tra la media e il campione di ogni classe. Infine, costruisci lo spazio a bassa densità che massimizza la varianza interclasse e minimizza la varianza interclasse. P è considerato come la proiezione dello spazio a bassa dimensione, chiamato anche criterio di Fisher.Come sono rappresentati i modelli LDA? La rappresentazione di LDA è abbastanza semplice. Il modello consiste nelle proprietà statistiche dei vostri dati che sono state calcolate per ogni classe. Le stesse proprietà sono calcolate sulla gaussiana multivariata nel caso di variabili multiple. Le multivariate sono le medie e la matrice delle covariate. Le previsioni sono fatte fornendo le proprietà statistiche nell’equazione LDA. Le proprietà sono stimate dai vostri dati. Infine, i valori del modello vengono salvati in un file per creare il modello LDA.Come imparano i modelli LDA? Le assunzioni fatte da un modello LDA sui vostri dati:Ogni variabile nei dati ha la forma di una curva a campana quando viene tracciata, cioè gaussiana.I valori di ogni variabile variano intorno alla media della stessa quantità in media, cioè ogni attributo ha la stessa varianza.Il modello LDA è in grado di stimare la media e la varianza dai vostri dati per ogni classe con l’aiuto di queste assunzioni.Il valore medio di ogni input per ciascuna delle classi può essere calcolato dividendo la somma dei valori per il numero totale dei valori:Mean =Sum(x)/Nkove Mean = valore medio di x per la classe N = numero di k = numero di Sum(x) = somma dei valori di ogni input x.La varianza è calcolata su tutte le classi come media del quadrato della differenza di ogni valore dalla media:Σ²=Somma((x – M)²)/(N – k)dove Σ² = Varianza su tutti gli input x. N = numero di istanze. k = numero di classi. Somma((x – M)²) = Somma dei valori di tutti i (x – M)². M = media per l’input x.Come fa un modello LDA a fare previsioni? I modelli LDA usano il Teorema di Bayes per stimare le probabilità. Fanno previsioni basate sulla probabilità che un nuovo set di dati di input appartenga ad ogni classe. La classe che ha la probabilità più alta è considerata la classe di uscita e poi la LDA fa una previsione. La predizione è fatta semplicemente con l’uso del Teorema di Bayes che stima la probabilità della classe di uscita dato l’input. Si fa anche uso della probabilità di ogni classe e della probabilità che i dati appartengano ad ogni classe: P(Y=x|X=x) = / Dove x = input. k = classe di output. Plk = Nk/n o probabilità di base di ogni classe osservata nei dati di allenamento. E’ anche chiamata probabilità prioritaria nel Teorema di Bayes. fk(x) = probabilità stimata di x appartenente alla classe k. La f(x) è tracciata usando una funzione di distribuzione gaussiana e poi è inserita nell’equazione sopra e il risultato che otteniamo è l’equazione seguente: Dk(x) = x∗(media/Σ²) – (media²/(2*Σ²)) + ln(PIk)La Dk(x) è chiamata la funzione discriminante per la classe k dato l’input x, media, Σ² e Plk sono tutti stimati dai dati e la classe è calcolata come avente il valore più grande, sarà considerata nella classificazione dell’output. Come preparare i dati per LDA? Alcuni suggerimenti che dovreste tenere a mente mentre preparate i vostri dati per costruire il vostro modello LDA: LDA è usato principalmente nei problemi di classificazione dove avete una variabile di uscita categorica. Il modello standard di LDA fa uso della distribuzione gaussiana delle variabili di input. Dovreste controllare le distribuzioni univariate di ogni attributo e trasformarle in una distribuzione dall’aspetto più gaussiano. Per esempio, per la distribuzione esponenziale, usate la funzione log e root e per le distribuzioni asimmetriche usate BoxCox.Gli outlier possono distorcere le statistiche primitive usate per separare le classi in LDA, quindi è preferibile rimuoverli.Poiché LDA presuppone che ogni variabile di input abbia la stessa varianza, è sempre meglio standardizzare i vostri dati prima di usare un modello LDA. Mantenete la media a 0 e la deviazione standard a 1.Come implementare un modello LDA da zero? Potete implementare un modello di Analisi Discriminante Lineare da zero usando Python. Iniziamo importando le librerie necessarie per il modello:from sklearn.datasets import load_wineimport pandas as pdimport numpy as npnp.set_printoptions(precision=4)from matplotlib import pyplot as pltimport seaborn as snssns.set()from sklearn.preprocessing import LabelEncoderfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import confusion_matrixSiccome lavoreremo con il dataset del vino, potete ottenerlo dal repository UCI machine learning. La libreria scikit-learn in Python fornisce una funzione wrapper per scaricarlo:wine_info = load_wine()X = pd.DataFrame(wine_info.data, columns=wine_info.feature_names)y = pd.Categorical.from_codes(wine_info.target, wine_info.target_names)Il dataset del vino comprende 178 righe di 13 colonne ciascuna:X.shape(178, 13)Gli attributi del dataset del vino comprendono varie caratteristiche come il contenuto alcolico del vino, il contenuto di magnesio, l’intensità del colore, la tonalità e molte altre:X.head()Il dataset del vino contiene tre diversi tipi di vino:wine_info.target_names array(, dtype='<U7′)Ora creiamo un DataFrame che contiene sia le caratteristiche che il contenuto del dataset:df = X.join(pd.Series(y, name=’class’))Possiamo dividere il processo di Analisi Discriminante Lineare in 5 passi come segue:Passo 1 – Calcolare le matrici di dispersione all’interno della classe e tra le classi.Passo 2 – Calcolare gli autovettori e i loro autovalori corrispondenti per le matrici di dispersione.Passo 3 – Ordinare gli autovalori e selezionare i primi k.Fase 4 – Creare una nuova matrice che conterrà gli autovettori mappati ai k autovalori.Fase 5 – Ottenere nuove caratteristiche prendendo il prodotto di punti dei dati e la matrice della fase 4.Matrice di dispersione all’interno della classePer calcolare la matrice di dispersione all’interno della classe, è possibile utilizzare la seguente espressione matematica:dove, c = numero totale di classi distinte edove, x = un campione (cioè una riga). Ora creiamo un vettore con i valori medi di ogni caratteristica:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‘class’):feature_means1 = rows.mean()feature_means1I vettori medi (mi ) sono ora inseriti nelle equazioni precedenti per ottenere la matrice di dispersione all’interno della classe:withinclass_scatter_matrix = np.zeri((13,13))for c, rows in df.groupby(‘class’):rows = rows.drop(, axis=1)s = np.zeros((13,13))for index, row in rows.iterrows():x, mc = row.values.reshape(13,1),feature_means1.values.reshape(13,1)s += (x – mc).dot((x – mc).T)withinclass_scatter_matrix += sBetween-class scatter matrixPossiamo calcolare la between-class scatter matrix usando la seguente espressione matematica:dove,andfeature_means2 = df.mean()betweenclass_scatter_matrix = np.zeros((13,13))for c in feature_means1: n = len(df.loc == c].index) mc, m = feature_means1.values.reshape(13,1), feature_means2.values.reshape(13,1)betweenclass_scatter_matrix += n * (mc – m).dot((mc – m).T)Ora risolveremo il problema degli autovalori generalizzati per ottenere i discriminanti lineari per:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Ordineremo gli autovalori dal più alto al più basso poiché gli autovalori con i valori più alti portano la maggior parte delle informazioni sulla distribuzione dei dati. Poi, per prima cosa k autovettori. Infine, metteremo gli autovalori in un array temporaneo per assicurarci che gli autovalori corrispondano agli stessi autovettori dopo l’ordinamento:eigen_pairs = ), eigen_vectors) for i in range(len(eigen_values))]eigen_pairs = sorted(eigen_pairs, key=lambda x: x, reverse=True)for pair in eigen_pairs:print(pair)237.4612319830225146.982859387586841.4317197551638386e-141.2141209883217706e-141.2141209883217706e-148.279823065850476e-157.105427357601002e-156.0293733655173466e-156.0293733655173466e-154.737608877108813e-154.737608877108813e-152.4737196789039026e-159.84629525010022e-16Ora trasformeremo i valori in percentuale poiché è difficile capire quanta della varianza è spiegata da ogni componente.sum_of_eigen_values = sum(eigen_values)print(‘Explained Variance’)for i, pair in enumerate(eigen_pairs): print(‘Eigenvector {}: {}’.format(i, (pair/sum_of_eigen_values).real))Varianza spiegataEigenvector 0: 0.8348256799387275Eigenvector 1: 0.1651743200612724Eigenvector 2: 5.033396012077518e-17Eigenvector 3: 4.268399397827047e-17Eigenvector 4: 4.268399397827047e-17Eigenvector 5: 2.9108789097898625e-17Eigenvector 6: 2.498004906118145e-17Eigenvector 7: 2.119704204950956e-17Eigenvector 8: 2.119704204950956e-17Eigenvector 9: 1.665567688286435e-17Eigenvettore 10: 1.665567688286435e-17Eigenvettore 11: 8.696681541121664e-18Eigenvettore 12: 3.4615924706522496e-18Per prima cosa, creeremo una nuova matrice W utilizzando i primi due autovettori:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realNext, salveremo il prodotto di punti di X e W in una nuova matrice Y:Y = X∗Wdove, X = matrice n x d con n campioni e d dimensioni. Y = matrice n x k con n campioni e k dimensioni.In termini semplici, Y è la nuova matrice o il nuovo spazio delle caratteristiche.X_lda = np.array(X.dot(W_matrix))Il nostro prossimo lavoro è quello di codificare ogni classe un membro per incorporare le etichette di classe nel nostro grafico. Infine, tracciamo i dati come una funzione delle due componenti LDA usando un colore diverso per ogni classe: plt.xlabel(‘LDA1’)plt.ylabel(‘LDA2′)plt.scatter(X_lda,X_lda,c=y,cmap=’rainbow’,alpha=0.7,edgecolors=’b’)<matplotlib.collections.PathCollection at 0x7fd08a20e908>Come implementare LDA usando scikit-learn? Per implementare LDA usando scikit-learn, lavoriamo con lo stesso dataset del vino. Potete anche ottenerlo dal repository UCI sull’apprendimento automatico. Potete usare la classe predefinita LinearDiscriminant Analysis messa a nostra disposizione dalla libreria scikit-learn per implementare LDA piuttosto che implementare da zero ogni volta:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Per ottenere la varianza corrispondente a ogni componente, potete accedere alla seguente proprietà:lda.explained_variance_ratio_array()Di nuovo, tracceremo le due componenti LDA proprio come abbiamo fatto prima:plt.xlabel(‘LDA1’)plt.ylabel(‘LDA2′)plt.scatter(X_lda,X_lda, c=y,cmap=’rainbow’, alpha=0.7,edgecolors=’b’)<matplotlib.collections.PathCollection at 0x7fd089f60358>Linear Discriminant Analysis vs PCABelow sono le differenze tra LDA e PCA:PCA ignora le etichette di classe e si concentra sul trovare le componenti principali che massimizzano la varianza in un dato dato dato. Quindi è un algoritmo non supervisionato. D’altra parte, LDA è un algoritmo supervisionato che intende trovare i discriminanti lineari che rappresentano gli assi che massimizzano la separazione tra le diverse classi. Tuttavia, PCA esegue meglio quando la dimensione del campione è relativamente piccola. Un esempio potrebbe essere il confronto tra le accuratezze di classificazione utilizzate nella classificazione delle immagini.Sia LDA che PCA sono utilizzati in caso di riduzione della dimensionalità. Creiamo e adattiamo un’istanza della classe PCA:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Di nuovo, per visualizzare i valori in percentuale per una migliore comprensione, accederemo alla proprietà explained_variance_ratio_:pca.explained_variance_ratio_array()Chiaramente, la PCA ha selezionato le componenti che saranno in grado di conservare più informazioni e ignora quelle che massimizzano la separazione tra le classi.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bOra per creare un modello di classificazione usando le componenti LDA come caratteristiche, divideremo i dati in set di dati di allenamento e set di dati di test:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)La prossima cosa che faremo è creare un albero di decisione. Poi, prevederemo la categoria di ogni test campione e creeremo una matrice di confusione per valutare le prestazioni del modello LDA:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Quindi è chiaro che il Decision Tree Classifier ha classificato correttamente tutto nel dataset di test.Quali sono le estensioni di LDA? LDA è considerato un metodo molto semplice ed efficace, specialmente per le tecniche di classificazione. Dal momento che è semplice e ben compreso, ha un sacco di estensioni e variazioni:Quadratic Discriminant Analysis(QDA) – Quando ci sono più variabili di input, ogni classe utilizza la propria stima di varianza e covarianza.Flexible Discriminant Analysis(FDA) – Questa tecnica viene eseguita quando una combinazione non lineare di input viene utilizzata come spline.Analisi Discriminante Regolarizzata (RDA) – Modera l’influenza delle varie variabili in LDA regolarizzando la stima della covarianza.Applicazioni reali di LDAS Alcune delle applicazioni pratiche di LDA sono elencate di seguito:Riconoscimento dei volti – LDA è usato nel riconoscimento dei volti per ridurre il numero di attributi a un numero più gestibile prima della classificazione effettiva. Le dimensioni che vengono generate sono una combinazione lineare di pixel che forma un modello. Questi sono chiamati volti di Fisher.Medico – È possibile utilizzare LDA per classificare la malattia del paziente come lieve, moderata o grave. La classificazione viene fatta in base ai vari parametri del paziente e alla sua traiettoria medica. Identificazione dei clienti – È possibile ottenere le caratteristiche dei clienti eseguendo un semplice sondaggio con domande e risposte. LDA aiuta a identificare e selezionare ciò che descrive le proprietà di un gruppo di clienti che sono più propensi a comprare un particolare articolo in un centro commerciale. RiassuntoDiamo un’occhiata agli argomenti che abbiamo trattato in questo articolo: Riduzione della dimensionalità e necessità di LDA Funzionamento di un modello LDA Rappresentazione, apprendimento, previsione e preparazione dei dati in LDA Implementazione di un modello LDA Implementazione di LDA utilizzando scikit-learn LDA vs PCA Estensioni e applicazioni di LDA L’analisi discriminante lineare in Python è un approccio molto semplice e ben compreso di classificazione nell’apprendimento automatico. Anche se ci sono altre tecniche di riduzione della dimensionalità come la Regressione Logistica o PCA, ma LDA è preferita in molti casi speciali di classificazione. Se vuoi essere un esperto nell’apprendimento automatico, la conoscenza dell’Analisi Discriminante Lineare ti porterebbe a quella posizione senza sforzo. Iscriviti ai nostri corsi di Data Science e Machine Learning per avere opzioni di carriera più lucrative in questo panorama e diventare un Data Scientist certificato.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.