Hvad er LDA: Linear Discriminant Analysis for Machine Learning
Af Priyankur Sarkar
Linear Discriminant Analysis eller LDA er en dimensionalitetsreduktionsteknik. Den anvendes som et forbehandlingstrin i maskinlæring og applikationer til mønsterklassificering. Målet med LDA er at projicere funktionerne i et højere dimensionelt rum på et lavere dimensionelt rum for at undgå dimensionalitetens forbandelse og også reducere ressourcer og dimensionelle omkostninger. den oprindelige teknik blev udviklet i 1936 af Ronald A. Fisher og blev kaldt Linear Discriminant eller Fisher’s Discriminant Analysis. Den oprindelige lineære diskriminant blev beskrevet som en toklasseteknik. Den flerklassede version blev senere generaliseret af C.R. Rao som Multiple Discriminant Analysis. De er alle blot omtalt som Linear Discriminant Analysis. LDA er en overvåget klassifikationsteknik, der betragtes som en del af udformningen af konkurrencedygtige maskinlæringsmodeller. Denne kategori af dimensionalitetsreduktion anvendes på områder som billedgenkendelse og prædiktiv analyse inden for markedsføring.Hvad er dimensionalitetsreduktion?Teknikkerne til dimensionalitetsreduktion er vigtige i applikationer inden for maskinlæring, datamining, bioinformatik og informationssøgning. Hovedformålet er at fjerne de overflødige og afhængige funktioner ved at ændre datasættet til et mindre dimensionelt rum.I enkle vendinger reducerer de dimensionerne (dvs. variabler) i et bestemt datasæt, mens de fleste af dataene bevares.Flerdimensionelle data omfatter flere funktioner, der har en korrelation med hinanden. Du kan plotte flerdimensionale data i kun 2 eller 3 dimensioner med dimensionalitetsreduktion. Det giver mulighed for at præsentere dataene på en eksplicit måde, som let kan forstås af en lægmand.Hvad er begrænsningerne ved logistisk regression?Logistisk regression er en enkel og kraftfuld lineær klassifikationsalgoritme. Den har dog nogle ulemper, som har ført til alternative klassifikationsalgoritmer som LDA. Nogle af begrænsningerne ved logistisk regression er følgende: To-klasses problemer – Logistisk regression anvendes traditionelt til to-klasses og binære klassifikationsproblemer. Selv om den kan ekstrapoleres og anvendes til klassifikation af flere klasser, er det sjældent, at det sker. På den anden side anses Linear Discriminant Analysis for at være et bedre valg, når der kræves flerklasseklassifikation, og i tilfælde af binære klassifikationer anvendes både logistisk regression og LDA.Ustabilt med veladskilte klasser – Logistisk regression kan mangle stabilitet, når klasserne er veladskilte. Det er her LDA kommer ind i billedet. ustabil med få eksempler – Hvis der er få eksempler, som parametrene skal estimeres ud fra, bliver logistisk regression ustabil. Linear Discriminant Analysis er dog en bedre mulighed, fordi den har en tendens til at være stabil selv i sådanne tilfælde.Hvordan får man en praktisk tilgang til en LDA-model?Overvej en situation, hvor du har plottet forholdet mellem to variabler, hvor hver farve repræsenterer en anden klasse. Den ene er vist med en rød farve og den anden med en blå. hvis du er villig til at reducere antallet af dimensioner til 1, kan du bare projicere alt til x-aksen som vist nedenfor: Denne fremgangsmåde negligerer alle nyttige oplysninger, som den anden egenskab giver. Du kan dog bruge LDA til at plotte den. Fordelen ved LDA er, at den bruger oplysninger fra begge funktioner til at skabe en ny akse, som igen minimerer variansen og maksimerer klasseafstanden mellem de to variabler.Hvordan virker LDA?LDA fokuserer primært på at projicere funktionerne i et rum med højere dimensioner til lavere dimensioner. Det kan man opnå i tre trin: For det første skal man beregne separabiliteten mellem klasserne, som er afstanden mellem middelværdien af de forskellige klasser. Dette kaldes variansen mellem klasserne.For det andet skal du beregne afstanden mellem middelværdien og stikprøven for hver klasse. Det kaldes også variansen inden for klassen.Endelig skal du konstruere det lavere dimensionelle rum, som maksimerer variansen mellem klasserne og minimerer variansen inden for klasserne. P betragtes som projektionen af det lavere dimensionelle rum, også kaldet Fisher’s kriterium.Hvordan er LDA-modellerne repræsenteret?Repræsentationen af LDA er ret ligetil. Modellen består af de statistiske egenskaber ved dine data, som er blevet beregnet for hver klasse. De samme egenskaber beregnes over den multivariate Gaussian i tilfælde af flere variabler. De multivariate variabler er middelværdier og covariatmatrix. forudsigelser foretages ved at angive de statistiske egenskaber i LDA-ligningen. Egenskaberne estimeres ud fra dine data. Til sidst gemmes modelværdierne i en fil for at skabe LDA-modellen.Hvordan lærer LDA-modellerne?De antagelser, som en LDA-model gør sig om dine data: Hver variabel i dataene har form som en klokkekurve, når den plottes, dvs. en Gaussisk.Værdierne af hver variabel varierer omkring middelværdien med det samme beløb i gennemsnit, dvs. hver egenskab har den samme varians.LDA-modellen er i stand til at estimere middelværdien og variansen fra dine data for hver klasse ved hjælp af disse antagelser.Middelværdien af hvert input for hver af klasserne kan beregnes ved at dividere summen af værdierne med det samlede antal værdier: Middel =Sum(x)/Nkwhvor Middel = middelværdi af x for klassen N = antal k = antal Sum(x) = summen af værdierne for hvert input x.Variansen beregnes på tværs af alle klasser som gennemsnittet af kvadratet på forskellen mellem hver værdi og middelværdien: Σ²=Sum((x – M)²)/(N – k)hvor Σ² = Varians på tværs af alle input x. N = antal forekomster. k = antal klasser. Sum((x – M)²) = summen af værdierne af alle (x – M)². M = middelværdi for input x.Hvordan foretager en LDA-model forudsigelser?LDA-modeller anvender Bayes’ teorem til at estimere sandsynligheder. De foretager forudsigelser på grundlag af sandsynligheden for, at et nyt inputdatasæt tilhører hver klasse. Den klasse, der har den højeste sandsynlighed, betragtes som udgangsklassen, hvorefter LDA’en foretager en forudsigelse. Forudsigelsen foretages simpelthen ved hjælp af Bayes’ teorem, som estimerer sandsynligheden for udgangsklassen på baggrund af inputdataene. De gør også brug af sandsynligheden for hver klasse og sandsynligheden for, at dataene tilhører hver klasse: P(Y=x|X=x) = / Hvor x = input. k = outputklasse. Plk = Nk/n eller basissandsynligheden for hver klasse, der er observeret i træningsdataene. Det kaldes også prior sandsynlighed i Bayes’ sætning. fk(x) = anslået sandsynlighed for, at x tilhører klasse k. f(x) plottes ved hjælp af en Gaussisk fordelingsfunktion, og derefter indsættes den i ligningen ovenfor, og resultatet er følgende ligning: Dk(x) = x∗(middel/Σ²) – (middel²/(2*Σ²)). + ln(PIk)Dk(x) kaldes diskriminantfunktionen for klasse k, idet input x, middelværdi, Σ² og Plk alle er estimeret ud fra dataene, og den klasse, der beregnes som havende den største værdi, vil blive taget i betragtning i outputklassifikationen. Hvordan forbereder man data fra LDA?Nogle forslag, du bør huske på, når du forbereder dine data til at opbygge din LDA-model: LDA bruges hovedsageligt i klassifikationsproblemer, hvor du har en kategorisk udgangsvariabel. Den muliggør både binær klassifikation og klassifikation af flere klasser.Standard LDA-modellen gør brug af den gaussiske fordeling af inputvariablerne. Du bør kontrollere de univariate fordelinger for hver attribut og omdanne dem til en mere Gaussisk udseende fordeling. For den eksponentielle fordeling skal du f.eks. bruge log- og rodfunktionen, og for skæve fordelinger skal du bruge BoxCox. outliers kan skævvride de primitive statistikker, der bruges til at adskille klasser i LDA, så det er at foretrække at fjerne dem. da LDA antager, at hver inputvariabel har samme varians, er det altid bedre at standardisere dine data, før du bruger en LDA-model. Hold middelværdien på 0 og standardafvigelsen på 1. Hvordan implementerer man en LDA-model fra bunden?Du kan implementere en LDA-model (Linear Discriminant Analysis) fra bunden ved hjælp af Python. Lad os starte med at importere de biblioteker, der er nødvendige for modellen: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_matrixDa vi vil arbejde med vin-datasættet, kan du få det fra UCI’s machine learning repository. Scikit-learn-biblioteket i Python indeholder en wrapper-funktion til at hente det: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)Vin-datasættet består af 178 rækker med 13 kolonner i hver:X.shape(178, 13)Attributterne i vin-datasættet består af forskellige egenskaber såsom vinens alkoholindhold, magnesiumindhold, farveintensitet, nuance og mange flere:X.head()Vin-datasættet indeholder tre forskellige slags vin:wine_info.target_names array(, dtype='<U7′)Nu opretter vi et DataFrame, der vil indeholde både egenskaberne og indholdet af datasættet:df = X.join(pd.Series(y, name=’class’))Vi kan opdele processen med lineær diskriminantanalyse i 5 trin som følger:Trin 1 – Beregning af spredningsmatricerne inden for klassen og mellem klasserne.Trin 2 – Beregning af egenvektorer og deres tilsvarende egenværdier for spredningsmatricerne.Trin 3 – Sortering af egenværdierne og udvælgelse af de bedste k.Trin 4 – Oprettelse af en ny matrix, som vil indeholde de egenvektorer, der er knyttet til de k egenværdier.Trin 5 – Fremskaffelse af nye træk ved at tage prikproduktet af dataene og matrixen fra trin 4.Spredningsmatrix inden for klassenFor at beregne spredningsmatrixen inden for klassen kan man bruge følgende matematiske udtryk:hvor c = det samlede antal forskellige klasser og hvor x = en prøve (dvs. en række). n = det samlede antal prøver inden for en given klasse.Nu opretter vi en vektor med middelværdierne for hver funktion:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‘class’):feature_means1 = rows.mean()feature_means1Middelvektorerne (mi ) sættes nu ind i ovenstående ligninger for at få within-class scatter matrix: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 += sMatrix for spredning mellem klasserVi kan beregne matrixen for spredning mellem klasser ved hjælp af følgende matematiske udtryk:hvor,andfeature_means2 = df.mean()betweenclass_scatter_matrix = np.zeros((13,13))for c i 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)Nu skal vi løse det generaliserede egenværdiproblem for at få de lineære diskriminanter for:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Vi vil sortere egenværdierne fra de højeste til de laveste, da egenværdierne med de højeste værdier bærer mest information om fordelingen af data er udført. Dernæst vil vi først k egenvektorer. Til sidst vil vi placere egenværdierne i et midlertidigt array for at sikre os, at egenværdierne kortlægges til de samme egenvektorer, når sorteringen er udført: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-16Nu vil vi omdanne værdierne til procent, da det er svært at forstå, hvor stor en del af variansen der forklares af hver komponent.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))Forklaret variansEigenvektor 0: 0.83482525679999387275Eigenvektor 1: 0.1651743200612724Eigenvektor 2: 5.033396012077577518e-17Eigenvektor 3: 4.2683993939397827047e-17Eigenvektor 4: 4.26839939397827047e-17Eigenvektor 5: 2.9108789097898625e-17Eigenvektor 6: 2.498004906118145e-17Eigenvektor 7: 2.11970420494950956e-17Eigenvektor 8: 2.11970420494950956e-17Eigenvektor 9: 1.66556768688286435e-17Eigenvektor 10: 1.66556768688286435e-17Eigenvektor 11: 8.6966868154111121664e-18Eigenvektor 12: 3.461592470656522496e-18Først vil vi oprette en ny matrix W ved hjælp af de to første egenvektorer:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1)))).realNæste skridt er at gemme prikproduktet af X og W i en ny matrix Y:Y = X∗Whvor X = n x d matrix med n prøver og d dimensioner. Y = n x k matrix med n prøve og k dimensioner.I enkle vendinger er Y den nye matrix eller det nye feature space.X_lda = np.array(X.dot(W_matrix))Vores næste arbejde er at kode hver klasse et medlem for at inkorporere klasselabels i vores plot. Dette gøres, fordi matplotlib ikke kan håndtere kategoriske variabler direkte.Endelig plotter vi dataene som en funktion af de to LDA-komponenter ved at bruge forskellige farver for hver klasse: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>Hvordan implementeres LDA ved hjælp af scikit-learn?For at implementere LDA ved hjælp af scikit-learn skal vi arbejde med det samme vin-datasæt. Du kan også få det fra UCI’s maskinlæringsrepositorium. Du kan bruge den foruddefinerede klasse LinearDiscriminant Analysis, som scikit-learn-biblioteket har stillet til rådighed for os, til at implementere LDA i stedet for at implementere fra bunden hver gang:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)For at få variansen svarende til hver komponent kan du få adgang til følgende egenskab:lda.explained_variance_ratio_array()Igen vil vi plotte de to LDA-komponenter ligesom før: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 PCABernedenfor er forskellene mellem LDA og PCA:PCA ignorerer klasselabels og fokuserer på at finde de hovedkomponenter, der maksimerer variansen i en given data. Det er således en uovervåget algoritme. På den anden side er LDA en overvåget algoritme, der har til formål at finde de lineære diskriminanter, som repræsenterer de akser, der maksimerer adskillelsen mellem forskellige klasser.LDA udfører bedre klassifikationsopgaver med flere klasser end PCA. PCA klarer sig dog bedre, når stikprøvestørrelsen er forholdsvis lille. Et eksempel kunne være sammenligninger mellem klassifikationsnøjagtigheder, der anvendes i billedklassifikation.Både LDA og PCA anvendes i tilfælde af dimensionalitetsreduktion. PCA er først efterfulgt af LDA.Lad os oprette og tilpasse en instans af PCA-klassen:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Igen, for at få vist værdierne i procent for en bedre forståelse, vil vi få adgang til explained_variance_ratio_ egenskaben:pca.explained_variance_ratio_array()Det er tydeligt, at PCA har udvalgt de komponenter, som vil være i stand til at bevare mest information og ignorerer dem, som maksimerer adskillelsen mellem klasserne.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bNu skal vi for at skabe en klassifikationsmodel ved hjælp af LDA-komponenterne som features opdele dataene i træningsdatasæt og testdatasæt:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Det næste, vi skal gøre, er at skabe et beslutningstræ. Derefter vil vi forudsige kategorien for hver testprøve og oprette en forvekslingsmatrix for at evaluere LDA-modellens ydeevne:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Det er altså tydeligt, at Decision Tree Classifier har klassificeret alt i testdatasættet korrekt.Hvad er udvidelserne til LDA?LDA anses for at være en meget enkel og effektiv metode, især til klassifikationsteknikker. Da den er enkel og velforstået, så har den mange udvidelser og variationer:Quadratic Discriminant Analysis(QDA) – Når der er flere inputvariabler, bruger hver af klasserne sit eget estimat af varians og kovarians.Flexible Discriminant Analysis(FDA) – Denne teknik udføres, når en ikke-lineær kombination af input bruges som splines.Regularized Discriminant Analysis(RDA) – Den modererer indflydelsen af forskellige variabler i LDA ved at regulere estimatet af kovariansen.Anvendelser af LD i det virkelige livNogle af de praktiske anvendelser af LDA er anført nedenfor: Ansigtsgenkendelse – LDA anvendes i ansigtsgenkendelse til at reducere antallet af attributter til et mere håndterbart antal før den egentlige klassificering. De dimensioner, der genereres, er en lineær kombination af pixels, der danner en skabelon. Disse kaldes Fisher’s ansigter.Medicinsk – Du kan bruge LDA til at klassificere patientens sygdom som mild, moderat eller alvorlig. Klassifikationen foretages på baggrund af de forskellige parametre for patienten og hans medicinske forløb. Kundeidentifikation – Du kan få fat i kundernes karakteristika ved at udføre en simpel spørgeskemaundersøgelse med spørgsmål og svar. LDA hjælper med at identificere og udvælge, som beskriver egenskaberne ved en gruppe af kunder, der er mest tilbøjelige til at købe en bestemt vare i et indkøbscenter. SammenfatningLad os tage et kig på de emner, vi har dækket i denne artikel: Dimensionalitetsreduktion og behov for LDA Arbejde med en LDA-model Repræsentation, læring, forudsigelse og forberedelse af data i LDA Gennemførelse af en LDA-model Gennemførelse af LDA ved hjælp af scikit-learn LDA vs PCA Udvidelser og anvendelser af LDA Den lineære diskriminantanalyse i Python er en meget enkel og velforstået tilgang til klassificering i maskinlæring. Selv om der er andre dimensionalitetsreduktionsteknikker som logistisk regression eller PCA, men LDA foretrækkes i mange specielle klassifikationstilfælde. Hvis du ønsker at blive ekspert i maskinlæring, vil viden om Linear Discriminant Analysis føre dig ubesværet til denne position. Tilmeld dig vores kurser i datavidenskab og maskinlæring for at få flere lukrative karrieremuligheder i dette landskab og blive en certificeret datavidenskabsmand.