Ce este LDA: Linear Discriminant Analysis for Machine Learning
De Priyankur Sarkar
Linear Discriminant Analysis sau LDA este o tehnică de reducere a dimensionalității. Este utilizată ca etapă de preprocesare în Machine Learning și în aplicațiile de clasificare a tiparelor. Scopul LDA este de a proiecta caracteristicile dintr-un spațiu cu dimensiuni mai mari într-un spațiu cu dimensiuni mai mici pentru a evita blestemul dimensionalității și, de asemenea, pentru a reduce resursele și costurile dimensionale. tehnica originală a fost dezvoltată în anul 1936 de Ronald A. Fisher și a fost numită Linear Discriminant sau Fisher’s Discriminant Analysis. Discriminantul liniar original a fost descris ca o tehnică cu două clase. Versiunea cu mai multe clase a fost generalizată ulterior de C.R Rao sub denumirea de analiză discriminantă multiplă. Toate acestea sunt denumite pur și simplu Analiză Discriminantă Lineară.LDA este o tehnică de clasificare supravegheată care este considerată o parte a elaborării modelelor competitive de învățare automată. Această categorie de reducere a dimensionalității este utilizată în domenii precum recunoașterea imaginilor și analiza predictivă în marketing.Ce este reducerea dimensionalității?Tehnicile de reducere a dimensionalității sunt importante în aplicațiile de învățare automată, minerit de date, bioinformatică și recuperare a informațiilor. Obiectivul principal este de a elimina caracteristicile redundante și dependente prin schimbarea setului de date într-un spațiu cu dimensiuni mai mici.În termeni simpli, acestea reduc dimensiunile (adică variabilele) într-un anumit set de date, păstrând în același timp majoritatea datelor.Datele multidimensionale cuprind mai multe caracteristici care au o corelație între ele. Prin reducerea dimensionalității, puteți reprezenta datele multidimensionale în doar 2 sau 3 dimensiuni. Aceasta permite ca datele să fie prezentate într-o manieră explicită, care poate fi ușor de înțeles de către un profan.Care sunt limitările regresiei logistice?Regresia logistică este un algoritm de clasificare liniară simplu și puternic. Cu toate acestea, are unele dezavantaje care au condus la algoritmi de clasificare alternativi, cum ar fi LDA. Unele dintre limitările regresiei logistice sunt următoarele: Probleme cu două clase – Regresia logistică este utilizată în mod tradițional pentru probleme de clasificare cu două clase și binare. Deși poate fi extrapolat și utilizat pentru clasificarea în mai multe clase, acest lucru se realizează rareori. Pe de altă parte, analiza discriminantă liniară este considerată o alegere mai bună ori de câte ori este necesară clasificarea în mai multe clase, iar în cazul clasificărilor binare, se aplică atât regresia logistică, cât și LDA.Instabilitate în cazul claselor bine separate – Regresia logistică poate fi lipsită de stabilitate atunci când clasele sunt bine separate. Aici intervine LDA.Instabilă cu puține exemple – În cazul în care există puține exemple din care trebuie estimați parametrii, regresia logistică devine instabilă. Cu toate acestea, analiza discriminantă liniară este o opțiune mai bună, deoarece tinde să fie stabilă chiar și în astfel de cazuri.Cum să aveți o abordare practică a unui model LDA?Luați în considerare o situație în care ați trasat relația dintre două variabile în care fiecare culoare reprezintă o clasă diferită. Una este reprezentată cu o culoare roșie, iar cealaltă cu albastru.Dacă sunteți dispus să reduceți numărul de dimensiuni la 1, puteți doar să proiectați totul pe axa x, așa cum se arată mai jos: Această abordare neglijează orice informație utilă furnizată de cea de-a doua caracteristică. Cu toate acestea, puteți utiliza LDA pentru a o reprezenta grafic. Avantajul LDA este că utilizează informațiile din ambele caracteristici pentru a crea o nouă axă care, la rândul său, minimizează variația și maximizează distanța de clasă a celor două variabile.Cum funcționează LDA?LDA se concentrează în primul rând pe proiectarea caracteristicilor din spațiul cu dimensiuni mai mari în dimensiuni mai mici. Puteți realiza acest lucru în trei etape: În primul rând, trebuie să calculați separabilitatea dintre clase, care reprezintă distanța dintre media diferitelor clase. Aceasta se numește varianța între clase.În al doilea rând, trebuie să calculați distanța dintre media și eșantionul fiecărei clase. Aceasta se numește, de asemenea, varianța în interiorul clasei.În cele din urmă, construiți spațiul cu dimensiuni mai mici care maximizează varianța între clase și minimizează varianța în interiorul clasei. P este considerată ca fiind proiecția spațiului inferior-dimensional, numită și criteriul lui Fisher.Cum sunt reprezentate modelele LDA?Reprezentarea LDA este destul de simplă. Modelul constă în proprietățile statistice ale datelor dvs. care au fost calculate pentru fiecare clasă. Aceleași proprietăți sunt calculate pe Gaussianul multivariat în cazul unor variabile multiple. Multivariatele sunt mediile și matricea de covariate.Predicțiile se fac prin furnizarea proprietăților statistice în ecuația LDA. Proprietățile sunt estimate din datele dumneavoastră. În cele din urmă, valorile modelului sunt salvate în fișier pentru a crea modelul LDA.Cum învață modelele LDA?Ipotezele făcute de un model LDA cu privire la datele dvs.:Fiecare variabilă din date are forma unei curbe în clopot atunci când este reprezentată grafic, adică gaussiană.Valorile fiecărei variabile variază în jurul mediei cu aceeași valoare medie, adică fiecare atribut are aceeași varianță.Modelul LDA este capabil să estimeze media și varianța din datele dvs. pentru fiecare clasă cu ajutorul acestor ipoteze.Valoarea medie a fiecărei intrări pentru fiecare dintre clase poate fi calculată prin împărțirea sumei valorilor la numărul total de valori:Mean =Sum(x)/Nkunde Mean = valoarea medie a lui x pentru clasa N = numărul de k = numărul de Sum(x) = suma valorilor fiecărei intrări x.Varianța se calculează pentru toate clasele ca medie a pătratului diferenței dintre fiecare valoare și medie:Σ²=Sum((x – M)²)/(N – k)unde Σ² = varianța pentru toate intrările x. N = numărul de instanțe. k = numărul de clase. Sum((x – M)²) = Suma valorilor tuturor (x – M)². M = media pentru intrarea x.Cum face un model LDA predicții?Modelele LDA utilizează teorema lui Bayes pentru a estima probabilitățile. Acestea fac predicții pe baza probabilității ca un nou set de date de intrare să aparțină fiecărei clase. Clasa care are cea mai mare probabilitate este considerată clasa de ieșire și apoi LDA face o predicție. Predicția este realizată prin simpla utilizare a teoremei Bayes, care estimează probabilitatea clasei de ieșire în funcție de datele de intrare. De asemenea, se utilizează probabilitatea fiecărei clase și probabilitatea ca datele să aparțină fiecărei clase: P(Y=x|X=x) = / Unde x = intrare. k = clasa de ieșire. Plk = Nk/n sau probabilitatea de bază a fiecărei clase observate în datele de instruire. Se numește, de asemenea, probabilitate anterioară în Teorema lui Bayes. fk(x) = probabilitatea estimată ca x să aparțină clasei k. F(x) este reprezentată grafic folosind o funcție de distribuție gaussiană și apoi este introdusă în ecuația de mai sus, iar rezultatul pe care îl obținem este următoarea ecuație: Dk(x) = x∗(medie/Σ²) – (medie²/(2*Σ²)) + ln(PIk)Dk(x) se numește funcția discriminantă pentru clasa k, având în vedere că intrarea x, media, Σ² și Plk sunt toate estimate din date, iar clasa care se calculează ca având cea mai mare valoare va fi luată în considerare în clasificarea ieșirii. Cum se pregătesc datele pentru LDA?Câteva sugestii pe care ar trebui să le aveți în vedere atunci când vă pregătiți datele pentru a construi modelul LDA:LDA este utilizat în principal în probleme de clasificare în care aveți o variabilă de ieșire categorică. Permite atât clasificarea binară, cât și clasificarea în mai multe clase.Modelul LDA standard utilizează distribuția gaussiană a variabilelor de intrare. Ar trebui să verificați distribuțiile univariate ale fiecărui atribut și să le transformați într-o distribuție cu aspect mai gaussian. De exemplu, pentru distribuția exponențială, folosiți funcția log și funcția rădăcină, iar pentru distribuțiile înclinate folosiți BoxCox. valorile aberante pot înclina statisticile primitive folosite pentru a separa clasele în LDA, așa că este preferabil să le eliminați. întrucât LDA presupune că fiecare variabilă de intrare are aceeași varianță, este întotdeauna mai bine să vă standardizați datele înainte de a folosi un model LDA. Mențineți media la 0 și deviația standard la 1.Cum se implementează un model LDA de la zero?Puteți implementa un model de analiză discriminantă liniară de la zero folosind Python. Să începem prin a importa bibliotecile care sunt necesare pentru model: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_matrixDin moment ce vom lucra cu setul de date despre vin, îl puteți obține de la depozitul de învățare automată UCI. Biblioteca scikit-learn din Python oferă o funcție wrapper pentru descărcarea acestuia: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)Setul de date despre vin cuprinde 178 de rânduri cu 13 coloane fiecare:X.shape(178, 13)Atributele setului de date privind vinul cuprind diverse caracteristici, cum ar fi conținutul de alcool al vinului, conținutul de magneziu, intensitatea culorii, nuanța și multe altele:X.head()Setul de date privind vinul conține trei tipuri diferite de vin:wine_info.target_names array(, dtype='<U7′)Acum creăm un DataFrame care va conține atât caracteristicile, cât și conținutul setului de date:df = X.join(pd.Series(y, name=’class’))Putem împărți procesul de analiză discriminantă liniară în 5 etape, după cum urmează:Etapa 1 – Calcularea matricelor de dispersie în interiorul clasei și între clase.Etapa 2 – Calcularea vectorilor proprii și a valorilor proprii corespunzătoare acestora pentru matricile de dispersie.Etapa 3 – Sortarea valorilor proprii și selectarea primelor k.Pasul 4 – Crearea unei noi matrici care va conține vectorii proprii cartografiate la cele k valori proprii.Pasul 5 – Obținerea de noi caracteristici prin realizarea produsului punctual al datelor și al matricei de la pasul 4.Matrice de dispersie în interiorul clasei Pentru a calcula matricea de dispersie în interiorul clasei, puteți utiliza următoarea expresie matematică:unde, c = numărul total de clase distincte șiunde, x = un eșantion (adică un rând). n = numărul total de eșantioane dintr-o anumită clasă.Acum creăm un vector cu valorile medii ale fiecărei caracteristici:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‘class’):feature_means1 = rows.mean()feature_means1Vectori medii (mi ) sunt acum introduși în ecuațiile de mai sus pentru a obține matricea de dispersie în interiorul clasei:withinclass_scatter_matrix = np.zeros((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 += sMatrice de împrăștiere între clase Putem calcula matricea de împrăștiere între clase folosind următoarea expresie matematică:unde,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)Acum vom rezolva problema generalizată a valorilor proprii pentru a obține discriminanții liniari pentru:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Vom sorta valorile proprii de la cele mai mari la cele mai mici, deoarece valorile proprii cu cele mai mari valori poartă cele mai multe informații despre distribuția datelor se face. În continuare, mai întâi vom k vectori proprii. În cele din urmă, vom plasa valorile proprii într-o matrice temporară pentru a ne asigura că valorile proprii corespund acelorași vectori proprii după sortare: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.8462952525010022e-16Acum vom transforma valorile în procente deoarece este dificil de înțeles cât de mult din varianță este explicată de fiecare componentă.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))Explained VarianceEigenvector 0: 0.8348256799387275Eigenvector 1: 0.1651743200612724Eigenvector 2: 5.033396012077518e-17Eigenvector 3: 4.26839939397827047e-17Vector propriu 4: 4.26839939397827047e-17Vector propriu 5: 2.9108789097898625e-17Vector propriu 6: 2.498004906118145e-17Vector propriu 7: 2.11970420494950956e-17Vector propriu 8: 2.11970420494950956e-17Vector propriu 9: 1.66556567688286435e-17Eigenvector 10: 1.665567688286435e-17Eigenvector 11: 8.696681541121664e-18Eigenvector 12: 3.4615924706522496e-18În primul rând, vom crea o nouă matrice W folosind primii doi vectori proprii:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realÎn continuare, vom salva produsul în puncte al lui X și W într-o nouă matrice Y:Y = X∗Wunde, X = matrice n x d cu n eșantioane și d dimensiuni. Y = matrice n x k cu n eșantioane și k dimensiuni.În termeni simpli, Y este noua matrice sau noul spațiu al caracteristicilor.X_lda = np.array(X.dot(W_matrix))Următoarea noastră activitate este de a codifica fiecare clasă un membru pentru a încorpora etichetele de clasă în graficul nostru. Acest lucru se face deoarece matplotlib nu poate gestiona direct variabilele categoriale.În cele din urmă, vom reprezenta grafic datele ca o funcție a celor două componente LDA folosind culori diferite pentru fiecare clasă: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>Cum se implementează LDA folosind scikit-learn?Pentru a implementa LDA folosind scikit-learn, să lucrăm cu același set de date despre vin. Îl puteți obține, de asemenea, de la UCI machine learning repository. Puteți utiliza clasa predefinită LinearDiscriminant Analysis pusă la dispoziția noastră de biblioteca scikit-learn pentru a implementa LDA, mai degrabă decât să o implementați de fiecare dată de la zero:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Pentru a obține varianța corespunzătoare fiecărei componente, puteți accesa următoarea proprietate:lda.explained_variance_ratio_ratio_array()Din nou, vom reprezenta grafic cele două componente LDA așa cum am făcut-o înainte: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 PCAÎn cele ce urmează sunt prezentate diferențele dintre LDA și PCA:PCA ignoră etichetele de clasă și se concentrează pe găsirea componentelor principale care maximizează varianța în cadrul unor date date date. Astfel, este un algoritm nesupravegheat. Pe de altă parte, LDA este un algoritm supravegheat care intenționează să găsească discriminanții liniari care reprezintă acele axe care maximizează separarea între diferite clase.LDA realizează sarcini de clasificare multiclasă mai bune decât PCA. Cu toate acestea, PCA funcționează mai bine atunci când dimensiunea eșantionului este relativ mică. Un exemplu ar fi comparațiile între preciziile de clasificare care sunt utilizate în clasificarea imaginilor.Atât LDA, cât și PCA sunt utilizate în cazul reducerii dimensionalității. PCA este urmată de LDA.Să creăm și să ajustăm o instanță a clasei PCA:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Din nou, pentru a vizualiza valorile în procente pentru o mai bună înțelegere, vom accesa proprietatea explained_variance_ratio_ property:pca.explained_variance_ratio_array()În mod clar, PCA a selectat componentele care vor putea reține cele mai multe informații și le ignoră pe cele care maximizează separarea dintre clase.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bAcum, pentru a crea un model de clasificare utilizând componentele LDA ca caracteristici, vom împărți datele în seturi de date de instruire și seturi de date de testare:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Următorul lucru pe care îl vom face este să creăm un arbore de decizie. Apoi, vom prezice categoria fiecărui eșantion de test și vom crea o matrice de confuzie pentru a evalua performanța modelului LDA:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Astfel, este clar că Decision Tree Classifier a clasificat corect toate datele din setul de date de testare.Care sunt extensiile LDA?LDA este considerată o metodă foarte simplă și eficientă, în special pentru tehnicile de clasificare. Deoarece este simplă și bine înțeleasă, are o mulțime de extensii și variații:Quadratic Discriminant Analysis (QDA) – Atunci când există mai multe variabile de intrare, fiecare clasă utilizează propria estimare a varianței și covarianței.Flexible Discriminant Analysis (FDA) – Această tehnică se realizează atunci când o combinație neliniară de intrări este utilizată ca spline.Regularized Discriminant Analysis(RDA) (Analiza discriminantă regularizată) – Aceasta moderează influența diverselor variabile în LDA prin regularizarea estimării covarianței.Aplicații reale ale LDASunt enumerate mai jos unele dintre aplicațiile practice ale LDA:Recunoașterea fețelor – LDA este utilizată în recunoașterea fețelor pentru a reduce numărul de atribute la un număr mai ușor de gestionat înainte de clasificarea efectivă. Dimensiunile care sunt generate sunt o combinație liniară de pixeli care formează un șablon. Acestea se numesc fețele lui Fisher.Medical – Puteți utiliza LDA pentru a clasifica boala pacientului ca fiind ușoară, moderată sau severă. Clasificarea se face pe baza diferiților parametri ai pacientului și a traiectoriei sale medicale. Identificarea clienților – Puteți obține caracteristicile clienților prin efectuarea unui sondaj simplu cu întrebări și răspunsuri. LDA ajută la identificarea și selecția care descrie proprietățile unui grup de clienți care sunt cel mai probabil să cumpere un anumit articol într-un centru comercial. RezumatSă aruncăm o privire la subiectele pe care le-am acoperit în acest articol: Reducerea dimensionalității și necesitatea LDA Funcționarea unui model LDA Reprezentarea, învățarea, predicția și pregătirea datelor în LDA Implementarea unui model LDA Implementarea LDA folosind scikit-learn LDA vs PCA Extensii și aplicații ale LDA Analiza discriminantă liniară în Python este o abordare foarte simplă și bine înțeleasă a clasificării în învățarea automată. Deși există și alte tehnici de reducere a dimensionalității, cum ar fi Logistic Regression sau PCA, dar LDA este preferată în multe cazuri speciale de clasificare. Dacă doriți să fiți un expert în învățare automată, cunoașterea Analizei Discriminante Liniare vă va conduce la această poziție fără efort. Înscrieți-vă la cursurile noastre de Știința datelor și învățare automată pentru mai multe opțiuni de carieră profitabile în acest peisaj și deveniți un cercetător de date certificat.