Vad är LDA? Linear Discriminant Analysis for Machine Learning
Av Priyankur Sarkar
Linear Discriminant Analysis eller LDA är en teknik för dimensionalitetsminskning. Den används som ett förbehandlingssteg vid maskininlärning och tillämpningar av mönsterklassificering. Målet med LDA är att projicera funktionerna i ett högdimensionellt rum till ett lägre dimensionellt rum för att undvika dimensionalitetens förbannelse och även minska resurser och dimensionskostnader. 1936 utvecklades den ursprungliga tekniken av Ronald A. Fisher och kallades Linear Discriminant eller Fisher’s Discriminant Analysis. Den ursprungliga linjära diskriminanten beskrevs som en tvåklassig teknik. Versionen med flera klasser generaliserades senare av C.R Rao som Multiple Discriminant Analysis. De kallas alla helt enkelt för Linear Discriminant Analysis. LDA är en övervakad klassificeringsteknik som anses vara en del av att skapa konkurrenskraftiga modeller för maskininlärning. Denna kategori av dimensionalitetsreducering används inom områden som bildigenkänning och prediktiv analys inom marknadsföring.Vad är dimensionalitetsreducering?Teknikerna för dimensionalitetsreducering är viktiga i tillämpningar inom maskininlärning, datautvinning, bioinformatik och informationsåtervinning. Huvudsyftet är att ta bort överflödiga och beroende funktioner genom att ändra datamängden till ett lägre dimensionellt utrymme.Enkelt uttryckt minskar de dimensionerna (dvs. variablerna) i en viss datamängd samtidigt som de behåller de flesta av uppgifterna.Mångdimensionella data består av flera funktioner som har en korrelation med varandra. Du kan plotta flerdimensionella data i endast 2 eller 3 dimensioner med hjälp av dimensionalitetsreducering. Det gör det möjligt att presentera data på ett explicit sätt som lätt kan förstås av en lekman.Vilka är begränsningarna för logistisk regression?Logistisk regression är en enkel och kraftfull linjär klassificeringsalgoritm. Den har dock vissa nackdelar som har lett till alternativa klassificeringsalgoritmer som LDA. Några av begränsningarna med logistisk regression är följande: Tvåklassiga problem – Logistisk regression används traditionellt för tvåklassiga och binära klassificeringsproblem. Även om den kan extrapoleras och användas för klassificering av flera klasser, görs detta sällan. Å andra sidan anses Linear Discriminant Analysis vara ett bättre val när det krävs klassificering av flera klasser och när det gäller binära klassificeringar tillämpas både logistisk regression och LDA.Instabil med väl separerade klasser – Logistisk regression kan sakna stabilitet när klasserna är väl separerade. Det är här LDA kommer in i bilden.Instabil med få exempel – Om det finns få exempel från vilka parametrarna ska uppskattas blir logistisk regression instabil. Linear Discriminant Analysis är dock ett bättre alternativ eftersom den tenderar att vara stabil även i sådana fall.Hur man har ett praktiskt förhållningssätt till en LDA-modell?Tänk på en situation där du har plottat sambandet mellan två variabler där varje färg representerar en annan klass. Den ena visas med en röd färg och den andra med en blå. om du är villig att reducera antalet dimensioner till 1 kan du bara projicera allt på x-axeln som visas nedan: Detta tillvägagångssätt försummar all användbar information som tillhandahålls av den andra egenskapen. Du kan dock använda LDA för att plotta den. Fördelen med LDA är att den använder information från båda funktionerna för att skapa en ny axel som i sin tur minimerar variansen och maximerar klassavståndet mellan de två variablerna.Hur fungerar LDA?LDA fokuserar i första hand på att projicera funktionerna i ett rum med högre dimensioner till lägre dimensioner. Du kan uppnå detta i tre steg: För det första måste du beräkna separerbarheten mellan klasser, vilket är avståndet mellan medelvärdet för olika klasser. Detta kallas variansen mellan klasserna.För det andra ska du beräkna avståndet mellan medelvärdet och urvalet för varje klass. Det kallas också för variansen inom klassen.Slutligen ska du konstruera det lägre dimensionella rummet som maximerar variansen mellan klasserna och minimerar variansen inom klassen. P betraktas som projektionen av det lägre dimensionella utrymmet, även kallad Fishers kriterium.Hur representeras LDA-modeller?Representationen av LDA är ganska okomplicerad. Modellen består av de statistiska egenskaperna hos dina data som har beräknats för varje klass. Samma egenskaper beräknas över den multivariata Gaussian i fallet med flera variabler. De multivariata variablerna är medelvärden och kovariatmatris. förutsägelser görs genom att tillhandahålla de statistiska egenskaperna i LDA-ekvationen. Egenskaperna uppskattas utifrån dina data. Slutligen sparas modellvärdena i en fil för att skapa LDA-modellen.Hur lär sig LDA-modeller?De antaganden som en LDA-modell gör om dina data: Varje variabel i data har formen av en klockkurva när den plottas, det vill säga en Gauss. värdena för varje variabel varierar runt medelvärdet med samma mängd i genomsnitt, det vill säga varje egenskap har samma varians. LDA-modellen kan skatta medelvärdet och variansen från dina data för varje klass med hjälp av dessa antaganden.Medelvärdet av varje indata för varje klass kan beräknas genom att dividera summan av värdena med det totala antalet värden:Medel =Sum(x)/Nvarvid Medel = medelvärdet av x för klassen N = antal k = antal Sum(x) = summan av värdena för varje indata x.Variansen beräknas för alla klasser som genomsnittet av kvadraten på skillnaden mellan varje värde och medelvärdet: Σ²=Sum((x – M)²)/(N – k)där Σ² = Varians för alla ingångar x. N = antal instanser. k = antal klasser. Sum((x – M)²) = Summan av värdena för alla (x – M)². M = medelvärde för input x.Hur gör en LDA-modell förutsägelser?LDA-modeller använder Bayes’ teorem för att uppskatta sannolikheter. De gör förutsägelser baserat på sannolikheten för att ett nytt inmatningsdataset tillhör varje klass. Den klass som har den högsta sannolikheten betraktas som utgångsklass och sedan gör LDA-modellen en förutsägelse. Förutsägelsen görs helt enkelt med hjälp av Bayes’ teorem som uppskattar sannolikheten för utgångsklassen med tanke på indata. De använder sig också av sannolikheten för varje klass och sannolikheten för att uppgifterna tillhör varje klass: P(Y=x|X=x) = / Där x = indata. k = utgångsklass. Plk = Nk/n eller grundsannolikheten för varje klass som observerats i träningsdata. Det kallas också för prioritets sannolikhet i Bayes’ sats. fk(x) = uppskattad sannolikhet för att x tillhör klass k. f(x) plottas med hjälp av en gaussisk fördelningsfunktion och sätts sedan in i ekvationen ovan och resultatet blir följande ekvation: Dk(x) = x∗(medelvärde/Σ²) – (medelvärde²/(2*Σ²)). + ln(PIk)Dk(x) kallas diskriminantfunktionen för klass k, eftersom indata x, medelvärde, Σ² och Plk alla uppskattas från data och den klass som beräknas ha det största värdet kommer att beaktas i klassificeringen av utdata. Hur man förbereder data från LDA?Några förslag som du bör ha i åtanke när du förbereder dina data för att bygga din LDA-modell: LDA används främst i klassificeringsproblem där du har en kategorisk utgångsvariabel. Den möjliggör både binär klassificering och flerklassig klassificering.Standardmodellen för LDA använder sig av den gaussiska fördelningen av indatavariablerna. Du bör kontrollera de univariata fördelningarna för varje attribut och omvandla dem till en fördelning som ser mer ut som Gauss. För exponentialfördelningen använder du till exempel log- och rotfunktion och för skeva fördelningar använder du BoxCox. outliers kan snedvrida den primitiva statistiken som används för att separera klasser i LDA, så det är att föredra att ta bort dem. eftersom LDA utgår från att varje inmatningsvariabel har samma varians, är det alltid bättre att standardisera dina data innan du använder en LDA-modell. Låt medelvärdet vara 0 och standardavvikelsen 1. Hur implementerar man en LDA-modell från grunden?Du kan implementera en modell för linjär diskriminantanalys från grunden med hjälp av Python. Låt oss börja med att importera de bibliotek som behövs för 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_matrixDå vi kommer att arbeta med vin-dataset kan du hämta det från UCI:s arkiv för maskininlärning. Biblioteket scikit-learn i Python tillhandahåller en omslagsfunktion för att hämta 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)Vindatasetetetet består av 178 rader med 13 kolumner vardera:X.shape(178, 13)Vinets attribut består av olika egenskaper som vinets alkoholhalt, magnesiumhalt, färgintensitet, nyans och många fler:X.head()Vinet innehåller tre olika sorters vin:wine_info.target_names array(, dtype='<U7′)Nu skapar vi ett DataFrame som kommer att innehålla både egenskaperna och innehållet i datasetetet:df = X.join(pd.Series(y, name=’class’))Vi kan dela upp processen för linjär diskriminantanalys i fem steg enligt följande:Steg 1 – Beräkning av spridningsmatriserna inom och mellan klasserna.Steg 2 – Beräkning av egenvektorer och motsvarande egenvärden för spridningsmatriserna.Steg 3 – Sortering av egenvärdena och val av de bästa k.Steg 4 – Skapa en ny matris som kommer att innehålla de egenvektorer som motsvarar de k egenvärdena.Steg 5 – Få fram nya egenskaper genom att ta punktprodukten av data och matrisen från steg 4.Spridningsmatris inom klassenFör att beräkna spridningsmatrisen inom klassen kan du använda följande matematiska uttryck:där c = det totala antalet distinkta klasser och där x = ett prov (dvs. en rad). n = totalt antal prover inom en viss klass.Nu skapar vi en vektor med medelvärdena för varje egenskap:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(’class’))feature_means1 = rows.mean()feature_means1Medelvektorerna (mi ) sätts nu in i ekvationerna ovan för att erhålla spridningsmatrisen inom klassen: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 += sMatris för spridning mellan klasserVi kan beräkna matrisen för spridning mellan klasser med hjälp av följande matematiska uttryck:där,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)Nu ska vi lösa det generaliserade egenvärdesproblemet för att få fram de linjära diskriminanterna för:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Vi kommer att sortera egenvärdena från de högsta till de lägsta eftersom egenvärden med de högsta värdena bär på mest information om fördelningen av data är gjort. Därefter kommer vi först k egenvektorer. Slutligen kommer vi att placera egenvärdena i en tillfällig array för att se till att egenvärdena mappas till samma egenvektorer när sorteringen är klar: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 omvandlar vi värdena till procent eftersom det är svårt att förstå hur mycket av variansen som förklaras av varje 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))Förklarad variansEigenvektor 0: 0.8348256799387275Eigenvektor 1: 0.1651743200612724Eigenvektor 2: 5.033396012077518e-17Eigenvektor 3: 4.26839939397827047e-17Eigenvektor 4: 4.26839939397827047e-17Eigenvektor 5: 2.9108789097898625e-17Eigenvektor 6: 2.498004906118145e-17Eigenvektor 7: 2.119704204950956e-17Eigenvektor 8: 2.11970420494950956e-17Eigenvektor 9: 1.665567688286435e-17Eigenvektor 10: 1.66556768688286435e-17Eigenvektor 11: 8.69668154111121664e-18Eigenvektor 12: 3.4615924706522496e-18Först skapar vi en ny matris W med hjälp av de två första egenvektorerna:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realNästa steg är att spara punktprodukten av X och W i en ny matris Y:Y = X∗Wvarvid X = n x d matris med n prov och d dimensioner. Y = n x k matris med n prov och k dimensioner.I enkla termer är Y den nya matrisen eller det nya funktionsutrymmet.X_lda = np.array(X.dot(W_matrix))Vårt nästa arbete är att koda varje klass en medlem för att införliva klassbeteckningarna i vår plot. Detta görs eftersom matplotlib inte kan hantera kategoriska variabler direkt.Slutligen plottar vi data som en funktion av de två LDA-komponenterna och använder olika färger för varje klass: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>Hur implementerar man LDA med hjälp av scikit-learn?För att implementera LDA med hjälp av scikit-learn, låt oss arbeta med samma vin-dataset. Du kan också få tag på det från UCI:s förråd för maskininlärning. Du kan använda den fördefinierade klassen LinearDiscriminant Analysis som scikit-learn-biblioteket har gjort tillgänglig för oss för att implementera LDA i stället för att implementera från början varje gång:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)För att få fram den varians som motsvarar varje komponent kan du få tillgång till följande egenskap:lda.explained_variance_ratio_array()Återigen kommer vi att plotta de två LDA-komponenterna precis som tidigare: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 PCABedömda skillnader mellan LDA och PCA:PCA ignorerar klassbeteckningar och fokuserar på att hitta den huvudkomponent som maximerar variansen i en given data. Det är alltså en oövervakad algoritm. Å andra sidan är LDA en övervakad algoritm som syftar till att hitta linjära diskriminanter som representerar de axlar som maximerar separationen mellan olika klasser.LDA utför bättre klassificeringsuppgifter för flera klasser än PCA. PCA fungerar dock bättre när urvalet är jämförelsevis litet. Ett exempel är jämförelser mellan klassificeringsnoggrannheter som används vid bildklassificering.Både LDA och PCA används vid dimensionalitetsreduktion. PCA är först följt av LDA.Låt oss skapa och anpassa en instans av PCA-klassen:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)För att återigen visa värdena i procent för en bättre förståelse kommer vi att få tillgång till egenskapen explained_variance_ratio_:pca.explained_variance_ratio_array()Det är uppenbart att PCA har valt ut de komponenter som kan behålla mest information och ignorerar de komponenter som maximerar separationen mellan klasserna.plt.xlabel(’PCA1’)plt.ylabel(’PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bNu för att skapa en klassificeringsmodell med LDA-komponenterna som funktioner delar vi upp data i träningsdataset och testdataset:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Nästa sak vi ska göra är att skapa ett beslutsträd. Därefter kommer vi att förutsäga kategorin för varje provtest och skapa en förvirringsmatris för att utvärdera LDA-modellens prestanda:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Det är alltså uppenbart att Decision Tree Classifier har klassificerat allt i testdatasetetet korrekt.Vad finns det för utvidgningar av LDA?LDA anses vara en mycket enkel och effektiv metod, särskilt för klassificeringstekniker. Eftersom den är enkel och välförstådd har den många utvidgningar och varianter: Quadratic Discriminant Analysis (QDA) – När det finns flera ingående variabler använder varje klass sin egen skattning av varians och kovarians.Flexible Discriminant Analysis (FDA) – Den här tekniken utförs när en icke-linjär kombination av ingående variabler används som splines.Regularized Discriminant Analysis (RDA) – Den modererar inflytandet av olika variabler i LDA genom att reglera skattningen av kovariansen. verkliga tillämpningar av LDASom några av de praktiska tillämpningarna av LDA listas nedan: Ansiktsigenkänning – LDA används vid ansiktsigenkänning för att reducera antalet attribut till ett mer lätthanterligt antal före den egentliga klassificeringen. De dimensioner som genereras är en linjär kombination av pixlar som bildar en mall. Dessa kallas Fisher’s faces.Medicinska – Du kan använda LDA för att klassificera patientens sjukdom som mild, måttlig eller allvarlig. Klassificeringen görs utifrån patientens olika parametrar och hans medicinska utveckling. Kundidentifiering – Du kan få fram kundernas egenskaper genom att utföra en enkel enkät med frågor och svar. LDA hjälper till att identifiera och välja ut som beskriver egenskaperna hos en grupp kunder som med största sannolikhet kommer att köpa en viss vara i ett köpcentrum. SammanfattningLåt oss ta en titt på de ämnen som vi har behandlat i den här artikeln: Dimensionality Reduction and need for LDA Working of an LDA model Representation, Learning, Prediction and preparing data in LDA Implementation of an LDA model Implementation of LDA using scikit-learn LDA vs PCA Extensions and Applications of LDA Den linjära diskriminantanalysen i Python är en mycket enkel och välförståelig metod för klassificering inom maskininlärning. Även om det finns andra dimensionalitetsreducerande tekniker som logistisk regression eller PCA, är LDA att föredra i många speciella klassificeringsfall. Om du vill bli expert på maskininlärning skulle kunskap om Linear Discriminant Analysis leda dig till den positionen utan ansträngning. Anmäl dig till våra kurser i datavetenskap och maskininlärning för fler lukrativa karriärmöjligheter i detta landskap och bli en certifierad datavetare.