Wat is LDA: Linear Discriminant Analysis for Machine Learning
Door Priyankur Sarkar
Linear Discriminant Analysis of LDA is een techniek voor dimensionaliteitsreductie. Het wordt gebruikt als een pre-processing stap in Machine Learning en toepassingen van patroonclassificatie. Het doel van LDA is de kenmerken in een hoger dimensionale ruimte te projecteren op een lager dimensionale ruimte om de vloek van de dimensionaliteit te vermijden en ook de middelen en dimensionale kosten te verminderen.De oorspronkelijke techniek werd ontwikkeld in het jaar 1936 door Ronald A. Fisher en kreeg de naam Lineaire Discriminant of Fisher’s Discriminant Analyse. De oorspronkelijke Lineaire Discriminant werd beschreven als een tweeklassentechniek. De multiklassenversie werd later door C.R Rao veralgemeend tot Meervoudige Discriminantanalyse. Zij worden alle eenvoudigweg Lineaire Discriminantanalyse genoemd.LDA is een classificatietechniek onder supervisie die wordt beschouwd als een onderdeel van het vervaardigen van concurrerende machine-leermodellen. Deze categorie van dimensionaliteitsreductie wordt gebruikt op gebieden zoals beeldherkenning en voorspellende analyse in marketing.Wat is dimensionaliteitsreductie? De technieken van dimensionaliteitsreductie zijn belangrijk in toepassingen van Machine Learning, Data Mining, Bioinformatica, en Information Retrieval. Het hoofddoel is de overbodige en afhankelijke kenmerken te verwijderen door de dataset in een lager-dimensionale ruimte te veranderen.Eenvoudig gezegd, ze verminderen de dimensies (d.w.z. variabelen) in een bepaalde dataset met behoud van de meeste gegevens.Multi-dimensionale gegevens bestaan uit meerdere kenmerken die een correlatie met elkaar hebben. Met dimensionaliteitsreductie kunt u multidimensionale gegevens in slechts 2 of 3 dimensies plotten. Het maakt het mogelijk de gegevens op een expliciete manier weer te geven die voor een leek gemakkelijk te begrijpen is.Wat zijn de beperkingen van Logistische Regressie? Logistische Regressie is een eenvoudig en krachtig lineair classificatiealgoritme. Het heeft echter enkele nadelen die hebben geleid tot alternatieve classificatie-algoritmen zoals LDA. Enkele van de beperkingen van Logistische Regressie zijn de volgende:Twee-klassen problemen – Logistische Regressie wordt traditioneel gebruikt voor twee-klassen en binaire classificatieproblemen. Hoewel het kan worden geëxtrapoleerd en gebruikt in multi-class classificatie, wordt dit zelden uitgevoerd. Anderzijds wordt Lineaire Discriminerende Analyse beschouwd als een betere keuze wanneer multi-class classificatie vereist is en in het geval van binaire classificaties worden zowel logistische regressie als LDA toegepast.Instabiel bij goed gescheiden klassen – Logistische regressie kan een gebrek aan stabiliteit vertonen wanneer de klassen goed gescheiden zijn. Dit is waar LDA om de hoek komt kijken.Instabiel bij weinig voorbeelden – Als er weinig voorbeelden zijn waarvan de parameters moeten worden geschat, wordt logistische regressie instabiel. Lineaire Discriminantanalyse is echter een betere optie omdat ze zelfs in dergelijke gevallen stabiel blijft.Hoe kan een LDA-model praktisch worden benaderd? Beschouw een situatie waarin u de relatie tussen twee variabelen hebt uitgezet, waarbij elke kleur een andere klasse voorstelt. De ene wordt weergegeven met een rode kleur en de andere met blauw.Als u bereid bent om het aantal dimensies te reduceren tot 1, kunt u gewoon alles projecteren op de x-as zoals hieronder weergegeven: Deze aanpak verwaarloost alle nuttige informatie van het tweede kenmerk. U kunt echter LDA gebruiken om het te plotten. Het voordeel van LDA is dat het de informatie van beide features gebruikt om een nieuwe as te creëren die op zijn beurt de variantie minimaliseert en de klasse-afstand van de twee variabelen maximaliseert.Hoe werkt LDA? LDA richt zich in de eerste plaats op het projecteren van de features in de ruimte met een hogere dimensie naar lagere dimensies. Dit kan in drie stappen worden bereikt: ten eerste moet het scheidend vermogen tussen de klassen worden berekend, dat is de afstand tussen het gemiddelde van de verschillende klassen. Ten tweede berekent u de afstand tussen het gemiddelde en de steekproef van elke klasse. Tenslotte construeert u de laagdimensionale ruimte die de tussen-klasse variantie maximaliseert en de binnen-klasse variantie minimaliseert. P wordt beschouwd als de projectie van de laagdimensionale ruimte, ook Fisher’s criterium genoemd. Hoe worden LDA-modellen voorgesteld? De voorstelling van LDA is vrij rechttoe rechtaan. Het model bestaat uit de statistische eigenschappen van uw gegevens die voor elke klasse zijn berekend. Dezelfde eigenschappen worden berekend over de multivariate Gaussian in het geval van meerdere variabelen. De multivariaten zijn de gemiddelden en de covariatenmatrix. Voorspellingen worden gedaan door de statistische eigenschappen in de LDA-vergelijking op te nemen. De eigenschappen worden geschat op basis van uw gegevens. Tenslotte worden de modelwaarden opgeslagen in een bestand om het LDA-model te creëren.Hoe leren LDA-modellen? De veronderstellingen die een LDA-model maakt over uw gegevens:Elke variabele in de gegevens heeft de vorm van een klokcurve wanneer ze wordt uitgezet, d.w.z. Gaussiaans.De waarden van elke variabele variëren gemiddeld evenveel rond het gemiddelde, d.w.z. elke eigenschap heeft dezelfde variantie.Het LDA-model is in staat om het gemiddelde en de variantie van uw gegevens voor elke klasse te schatten met behulp van deze veronderstellingen.De gemiddelde waarde van elke input voor elk van de klassen kan worden berekend door de som van de waarden te delen door het totale aantal waarden:Mean =Sum(x)/Nkwaar Mean = gemiddelde waarde van x voor klasse N = aantal k = aantal Sum(x) = som van de waarden van elke input x.De variantie wordt berekend over alle klassen als het gemiddelde van het kwadraat van het verschil van elke waarde ten opzichte van het gemiddelde:Σ²=Sum((x – M)²)/(N – k)waarbij Σ² = Variantie over alle inputs x. N = aantal instanties. k = aantal klassen. Som((x – M)²) = som van de waarden van alle (x – M)². M = gemiddelde voor input x. Hoe doet een LDA-model voorspellingen? LDA-modellen gebruiken de stelling van Bayes om waarschijnlijkheden in te schatten. Zij doen voorspellingen op basis van de waarschijnlijkheid dat een nieuwe input dataset tot elke klasse behoort. De klasse met de hoogste waarschijnlijkheid wordt beschouwd als de outputklasse en vervolgens doet de LDA een voorspelling. De voorspelling wordt eenvoudigweg gedaan met behulp van de stelling van Bayes, die de waarschijnlijkheid van de outputklasse schat, gegeven de input. Zij maken ook gebruik van de waarschijnlijkheid van elke klasse en de waarschijnlijkheid dat de gegevens tot elke klasse behoren: P(Y=x|X=x) = / Waarbij x = input. k = outputklasse. Plk = Nk/n of basiswaarschijnlijkheid van elke klasse die in de opleidingsgegevens wordt waargenomen. Het wordt ook prior probability genoemd in de stelling van Bayes. fk(x) = geschatte waarschijnlijkheid dat x tot klasse k behoort. De f(x) wordt uitgezet met behulp van een Gaussische verdelingsfunctie en dan in bovenstaande vergelijking gestopt en het resultaat is de volgende vergelijking:Dk(x) = x∗(gemiddelde/Σ²) – (gemiddelde²/(2*Σ²)) + ln(PIk)De Dk(x) wordt de discriminantfunctie voor klasse k genoemd, gegeven input x, gemiddelde, Σ² en Plk worden alle geschat uit de data en de klasse wordt berekend als die de grootste waarde heeft, zal in aanmerking worden genomen bij de outputclassificatie. Hoe bereid je gegevens voor op LDA? Enkele suggesties die je in gedachten moet houden bij het voorbereiden van je gegevens om je LDA-model te bouwen: LDA wordt hoofdzakelijk gebruikt bij classificatieproblemen waarbij je een categorische outputvariabele hebt. Het laat zowel binaire classificatie als multi-class classificatie toe.Het standaard LDA model maakt gebruik van de Gaussische Distributie van de input variabelen. Je moet de univariate verdelingen van elk attribuut controleren en ze omzetten in een meer Gaussiaans aandoende verdeling. Gebruik bijvoorbeeld voor de exponentiële verdeling de log- en wortelfunctie en voor scheve verdelingen BoxCox.Uitschieters kunnen de primitieve statistieken die in LDA worden gebruikt om klassen te scheiden, scheef trekken, dus het verdient de voorkeur ze te verwijderen.Aangezien LDA ervan uitgaat dat elke inputvariabele dezelfde variantie heeft, is het altijd beter uw gegevens te standaardiseren voordat u een LDA-model gebruikt. Houd het gemiddelde op 0 en de standaardafwijking op 1. Hoe implementeer je een LDA model vanuit het niets? Je kunt een Lineaire Discriminant Analyse model vanuit het niets implementeren met Python. Laten we beginnen met het importeren van de bibliotheken die nodig zijn voor het 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_matrixOmdat we zullen werken met de wijn dataset, kan je deze verkrijgen van de UCI machine learning repository. De scikit-learn bibliotheek in Python biedt een wrapper functie om het te downloaden: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)De wijn dataset bestaat uit 178 rijen van 13 kolommen elk:X.shape(178, 13)De attributen van de wijndataset bestaan uit verschillende kenmerken zoals alcoholgehalte van de wijn, magnesiumgehalte, kleurintensiteit, tint en nog veel meer:X.head()De wijndataset bevat drie verschillende soorten wijn:wine_info.target_names array(, dtype='<U7′)Nu maken we een DataFrame dat zowel de kenmerken als de inhoud van de dataset zal bevatten:df = X.join(pd.Series(y, name=’class’))We kunnen het proces van Lineaire Discriminant Analyse als volgt in 5 stappen verdelen:Stap 1 – Het berekenen van de binnen- en tussen-klasse verspreidingsmatrices.Stap 2 – Het berekenen van de eigenvectoren en hun corresponderende eigenwaarden voor de verspreidingsmatrices.Stap 3 – Het sorteren van de eigenwaarden en het selecteren van de top k.Stap 4 – Het creëren van een nieuwe matrix die de eigenvectoren toegewezen aan de k eigenwaarden zal bevatten.Stap 5 – Het verkrijgen van nieuwe kenmerken door het dot-product te nemen van de gegevens en de matrix van stap 4.Binnen-klasse scatter matrixOm de binnen-klasse scatter matrix te berekenen, kunt u gebruik maken van de volgende wiskundige uitdrukking:waar, c = totaal aantal verschillende klassen en waar, x = een monster (d.w.z. een rij). n = totaal aantal monsters binnen een bepaalde klasse.Nu maken we een vector met de gemiddelde waarden van elk kenmerk:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‘class’):feature_means1 = rows.mean()feature_means1De gemiddelde vectoren (mi ) worden nu in de bovenstaande vergelijkingen gestopt om de binnen-klasse verspreidingsmatrix te verkrijgen:withinclass_scatter_matrix = np.nullen((13,13))voor c, rijen in df.groupby(‘klasse’):rows = rows.drop(, as=1)s = np.nullen((13,13))voor index, rij in rows.iterrows():x, mc = rij.waarden.reshape(13,1),feature_means1.waarden.reshape(13,1)s += (x – mc).dot((x – mc).T)withinclass_scatter_matrix += sTussen-klasse spreidingsmatrixWe kunnen de tussen-klasse spreidingsmatrix berekenen met behulp van de volgende wiskundige uitdrukking:where,andfeature_means2 = df.gemiddelde()tussenklasse_scatter_matrix = np.nullen((13,13))voor 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 zullen we het veralgemeende eigenwaardeprobleem oplossen om de lineaire discriminanten te verkrijgen voor:eigen_waarden, eigen_vectoren = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))We zullen de eigenwaarden sorteren van de hoogste naar de laagste, aangezien de eigenwaarden met de hoogste waarden de meeste informatie over de verdeling van de gegevens dragen is gedaan. Vervolgens zullen we eerst k eigenvectoren. Tenslotte zullen we de eigenwaarden in een tijdelijke array plaatsen om er zeker van te zijn dat de eigenwaarden bij dezelfde eigenvectoren horen nadat het sorteren gedaan is: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 zullen we de waarden omzetten in percentage aangezien het moeilijk is om te begrijpen hoeveel van de variantie verklaard wordt door elke component.sum_of_eigen_values = sum(eigen_values)print(‘Explained Variance’)for i, pair in enumerate(eigen_pairs): print(‘Eigenvector {}: {}’.format(i, (paar/som_van_eigen_waarden).reëel))Verklaarde variantieEigenvector 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-17Eigenvector 10: 1,665567688286435e-17Eigenvector 11: 8,696681541121664e-18Eigenvector 12: 3,4615924706522496e-18Eerst maken we een nieuwe matrix W met behulp van de eerste twee eigenvectoren:W_matrix = np.hstack((eigen_paren.reshape(13,1), eigen_paren.reshape(13,1)).realNaar aanleiding van de eerste twee eigenvectoren maken we een nieuwe matrix W:Y = X∗Wwaarbij, X = n x d matrix met n sample en d dimensies. Y = n x k matrix met n sample en k dimensies.Eenvoudig gezegd, Y is de nieuwe matrix of de nieuwe feature space.X_lda = np.array(X.dot(W_matrix))Ons volgende werk is om elke klasse een lid te coderen om de klasse labels op te nemen in onze plot. Dit wordt gedaan omdat matplotlib niet direct kan omgaan met categorische variabelen.Tenslotte plotten we de gegevens als een functie van de twee LDA-componenten met verschillende kleuren voor elke 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>Hoe implementeer je LDA met scikit-learn? Laten we voor de implementatie van LDA met scikit-learn werken met dezelfde wijndataset. Je kunt deze ook verkrijgen van de UCI machine learning repository. Je kunt de voorgedefinieerde klasse LinearDiscriminant Analysis gebruiken die ons ter beschikking wordt gesteld door de scikit-learn bibliotheek om LDA te implementeren in plaats van telkens vanaf nul te moeten beginnen:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Om de variantie te verkrijgen die overeenkomt met elke component, kun je de volgende eigenschap gebruiken:lda.explained_variance_ratio_array()Nogmaals, we zullen de twee LDA-componenten plotten zoals we eerder deden: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>Lineaire Discriminantanalyse vs PCABlaar zijn de verschillen tussen LDA en PCA:PCA negeert klasselabels en concentreert zich op het vinden van de hoofdcomponenten die de variantie in een gegeven data maximaliseren. Het is dus een algoritme zonder toezicht. Anderzijds is LDA een algoritme met supervisie dat de lineaire discriminanten wil vinden die de assen voorstellen die de scheiding tussen de verschillende klassen maximaliseren. LDA voert betere multiklassenclassificatietaken uit dan PCA. PCA presteert echter beter wanneer de steekproefomvang relatief klein is. Een voorbeeld hiervan zijn vergelijkingen tussen de classificatienauwkeurigheid bij beeldclassificatie. Zowel LDA als PCA worden gebruikt bij dimensionaliteitsreductie. PCA wordt eerst gebruikt, gevolgd door LDA.Laten we een instantie van de PCA klasse creëren en passen:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Om de waarden in percentages te zien voor een beter begrip, zullen we de verklaarde_variantie_ratio_ eigenschap openen:pca.explained_variance_ratio_array()Het is duidelijk dat PCA de componenten selecteert die de meeste informatie kunnen vasthouden en diegene negeert die de scheiding tussen de klassen maximaliseren.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bOm nu een classificatiemodel te maken met de LDA componenten als features, zullen we de data verdelen in training datasets en testing datasets:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Het volgende wat we zullen doen is een Decision Tree maken. Daarna voorspellen we de categorie van elke test en creëren we een verwarringsmatrix om de prestaties van het LDA-model te evalueren:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Het is dus duidelijk dat de Decision Tree Classifier alles in de test dataset correct heeft geclassificeerd.Wat zijn de uitbreidingen van LDA?LDA wordt beschouwd als een zeer eenvoudige en effectieve methode, vooral voor classificatietechnieken. Omdat het eenvoudig en goed begrepen is, kent het veel uitbreidingen en variaties:Quadratic Discriminant Analysis(QDA) – Wanneer er meerdere ingangsvariabelen zijn, gebruikt elk van de klassen zijn eigen schatting van variantie en covariantie.Flexible Discriminant Analysis(FDA) – Deze techniek wordt uitgevoerd wanneer een niet-lineaire combinatie van ingangen wordt gebruikt als splines.Regularized Discriminant Analysis(RDA) – Deze techniek matigt de invloed van verschillende variabelen in LDA door de schatting van de covariantie te regulariseren.Real-Life Applications of LDASommige van de praktische toepassingen van LDA zijn hieronder opgesomd:Gezichtsherkenning – LDA wordt gebruikt in gezichtsherkenning om het aantal attributen te reduceren tot een beter hanteerbaar aantal vóór de eigenlijke classificatie. De dimensies die worden gegenereerd zijn een lineaire combinatie van pixels die een sjabloon vormen. Deze worden Fisher’s gezichten genoemd.Medisch – U kunt LDA gebruiken om de ziekte van de patiënt te classificeren als mild, matig of ernstig. De classificatie wordt gedaan op basis van de verschillende parameters van de patiënt en zijn medische traject. Klantidentificatie – U kunt de kenmerken van klanten verkrijgen door een eenvoudige vraag en antwoord enquête uit te voeren. LDA helpt bij het identificeren en selecteren van de eigenschappen van een groep klanten die het meest waarschijnlijk een bepaald artikel in een winkelcentrum zullen kopen. SamenvattingLaten we eens kijken naar de onderwerpen die we in dit artikel hebben behandeld: Dimensionaliteitsreductie en noodzaak van LDA Werking van een LDA-model Representatie, leren, voorspellen en voorbereiden van gegevens in LDA Implementatie van een LDA-model Implementatie van LDA met behulp van scikit-learn LDA vs PCA Uitbreidingen en toepassingen van LDA De Lineaire Discriminant Analyse in Python is een zeer eenvoudige en goed begrepen benadering van classificatie in machine learning. Hoewel er andere technieken zijn om de dimensionaliteit te verminderen, zoals Logistische Regressie of PCA, heeft LDA de voorkeur in vele speciale classificatie gevallen. Als je een expert in machinaal leren wilt worden, zou kennis van Lineaire Discriminant Analyse je moeiteloos naar die positie leiden. Schrijf je in voor onze Data Science en Machine Learning cursussen voor meer lucratieve carrièremogelijkheden in dit landschap en word een gecertificeerde Data Scientist.