Was ist LDA: Lineare Diskriminanzanalyse für maschinelles Lernen
Von Priyankur Sarkar
Die lineare Diskriminanzanalyse oder LDA ist ein Verfahren zur Dimensionalitätsreduktion. Sie wird als Vorverarbeitungsschritt beim maschinellen Lernen und bei Anwendungen der Musterklassifikation eingesetzt. Ziel der LDA ist es, die Merkmale im höherdimensionalen Raum auf einen niedrigerdimensionalen Raum zu projizieren, um den Fluch der Dimensionalität zu vermeiden und Ressourcen und Dimensionskosten zu reduzieren. 1936 wurde die ursprüngliche Technik von Ronald A. Fisher entwickelt und Linear Discriminant oder Fisher’s Discriminant Analysis genannt. Die ursprüngliche lineare Diskriminanzanalyse wurde als Zwei-Klassen-Technik beschrieben. Die Mehrklassenversion wurde später von C. R. Rao als Mehrfachdiskriminanzanalyse verallgemeinert. Sie alle werden einfach als Lineare Diskriminanzanalyse bezeichnet. LDA ist eine überwachte Klassifizierungstechnik, die als Teil der Erstellung von wettbewerbsfähigen maschinellen Lernmodellen gilt. Diese Kategorie der Dimensionalitätsreduktion wird in Bereichen wie der Bilderkennung und der prädiktiven Analyse im Marketing eingesetzt.Was ist Dimensionalitätsreduktion?Die Techniken der Dimensionalitätsreduktion sind wichtig für Anwendungen des maschinellen Lernens, des Data Mining, der Bioinformatik und des Information Retrieval. Vereinfacht ausgedrückt, werden die Dimensionen (d. h. Variablen) in einem bestimmten Datensatz reduziert, wobei die meisten Daten erhalten bleiben.Mehrdimensionale Daten umfassen mehrere Merkmale, die miteinander korrelieren. Mit der Dimensionalitätsreduktion können Sie mehrdimensionale Daten in nur 2 oder 3 Dimensionen darstellen. Die logistische Regression ist ein einfacher und leistungsstarker linearer Klassifizierungsalgorithmus. Er hat jedoch einige Nachteile, die zu alternativen Klassifizierungsalgorithmen wie LDA geführt haben. Einige der Einschränkungen der logistischen Regression sind folgende: Zwei-Klassen-Probleme – Die logistische Regression wird traditionell für Zwei-Klassen- und binäre Klassifikationsprobleme verwendet. Obwohl sie extrapoliert und für die Klassifizierung von mehreren Klassen verwendet werden kann, wird dies nur selten getan. Andererseits wird die lineare Diskriminanzanalyse als die bessere Wahl angesehen, wenn eine Mehrklassen-Klassifizierung erforderlich ist, und im Falle binärer Klassifizierungen werden sowohl die logistische Regression als auch die LDA angewandt.Instabil bei gut getrennten Klassen – Der logistischen Regression kann es an Stabilität mangeln, wenn die Klassen gut voneinander getrennt sind. Instabil bei wenigen Beispielen – Wenn es nur wenige Beispiele gibt, aus denen die Parameter geschätzt werden sollen, wird die logistische Regression instabil. Die Lineare Diskriminanzanalyse ist jedoch die bessere Wahl, da sie auch in solchen Fällen stabil ist.Wie kann man ein LDA-Modell praktisch anwenden?Stellen Sie sich eine Situation vor, in der Sie die Beziehung zwischen zwei Variablen aufgezeichnet haben, wobei jede Farbe für eine andere Klasse steht. Wenn Sie bereit sind, die Anzahl der Dimensionen auf 1 zu reduzieren, können Sie einfach alles auf die x-Achse projizieren, wie unten dargestellt: Bei diesem Ansatz werden alle hilfreichen Informationen vernachlässigt, die das zweite Merkmal liefert. Sie können jedoch LDA verwenden, um es darzustellen. Der Vorteil von LDA besteht darin, dass es Informationen aus beiden Merkmalen verwendet, um eine neue Achse zu erstellen, die wiederum die Varianz minimiert und den Klassenabstand der beiden Variablen maximiert.Wie funktioniert LDA?LDA konzentriert sich in erster Linie auf die Projektion der Merkmale im höherdimensionalen Raum auf niedrigere Dimensionen. Dies kann in drei Schritten erreicht werden: Zunächst muss die Trennbarkeit zwischen den Klassen berechnet werden, d. h. der Abstand zwischen den Mittelwerten der verschiedenen Klassen. Zweitens muss der Abstand zwischen dem Mittelwert und der Stichprobe jeder Klasse berechnet werden. Schließlich wird der niedrigere dimensionale Raum konstruiert, der die Varianz zwischen den Klassen maximiert und die Varianz innerhalb der Klassen minimiert. P wird als die Projektion des niederdimensionalen Raums betrachtet, auch Fisher-Kriterium genannt.Wie werden LDA-Modelle dargestellt?Die Darstellung von LDA ist ziemlich einfach. Das Modell besteht aus den statistischen Eigenschaften Ihrer Daten, die für jede Klasse berechnet wurden. Im Falle mehrerer Variablen werden dieselben Eigenschaften über den multivariaten Gauß berechnet. Die multivariaten Variablen sind die Mittelwerte und die Kovariatenmatrix, die in die LDA-Gleichung eingesetzt werden. Die Eigenschaften werden aus Ihren Daten geschätzt. Schließlich werden die Modellwerte in einer Datei gespeichert, um das LDA-Modell zu erstellen.Wie lernen LDA-Modelle?Die Annahmen, die ein LDA-Modell über Ihre Daten macht:Jede Variable in den Daten hat die Form einer Glockenkurve, wenn sie aufgetragen wird, d.h. Gauß.Die Werte jeder Variablen schwanken im Durchschnitt um den Mittelwert um den gleichen Betrag, d.h. jedes Attribut hat die gleiche Varianz.Das LDA-Modell ist in der Lage, den Mittelwert und die Varianz aus Ihren Daten für jede Klasse mit Hilfe dieser Annahmen zu schätzen.Der Mittelwert jeder Eingabe für jede der Klassen kann berechnet werden, indem die Summe der Werte durch die Gesamtzahl der Werte geteilt wird:Mittelwert =Summe(x)/Nkwobei Mittelwert = Mittelwert von x für die Klasse N = Anzahl von k = Anzahl von Summe(x) = Summe der Werte jeder Eingabe x.Die Varianz wird über alle Klassen als Durchschnitt des Quadrats der Differenz jedes Wertes zum Mittelwert berechnet:Σ²=Sum((x – M)²)/(N – k)wobei Σ² = Varianz über alle Eingaben x. N = Anzahl der Instanzen. k = Anzahl der Klassen. Summe((x – M)²) = Summe der Werte von allen (x – M)². M = Mittelwert für Eingabe x.Wie macht ein LDA-Modell Vorhersagen?LDA-Modelle verwenden das Bayes-Theorem, um Wahrscheinlichkeiten zu schätzen. Sie machen Vorhersagen auf der Grundlage der Wahrscheinlichkeit, dass ein neuer Eingabedatensatz zu jeder Klasse gehört. Die Klasse mit der höchsten Wahrscheinlichkeit wird als Ausgangsklasse betrachtet, und das LDA-Modell trifft dann eine Vorhersage. Die Vorhersage erfolgt einfach durch die Anwendung des Bayes’schen Theorems, das die Wahrscheinlichkeit der Ausgangsklasse angesichts der Eingabe schätzt. Sie verwenden auch die Wahrscheinlichkeit jeder Klasse und die Wahrscheinlichkeit, dass die Daten zu jeder Klasse gehören: P(Y=x|X=x) = / wobei x = Eingabe. k = Ausgabeklasse. Plk = Nk/n oder Basiswahrscheinlichkeit für jede in den Trainingsdaten beobachtete Klasse. fk(x) = geschätzte Wahrscheinlichkeit der Zugehörigkeit von x zur Klasse k. f(x) wird mit einer Gaußschen Verteilungsfunktion aufgetragen und dann in die obige Gleichung eingesetzt. Das Ergebnis ist die folgende Gleichung:Dk(x) = x∗(Mittelwert/Σ²) – (Mittelwert²/(2*Σ²)) + ln(PIk)Dk(x) wird als Diskriminanzfunktion für die Klasse k bezeichnet, wenn die Eingabe x, der Mittelwert, Σ² und Plk aus den Daten geschätzt werden und die Klasse mit dem größten Wert bei der Klassifizierung der Ausgabe berücksichtigt wird. Einige Vorschläge, die Sie bei der Vorbereitung Ihrer Daten für die Erstellung Ihres LDA-Modells beachten sollten: LDA wird hauptsächlich bei Klassifizierungsproblemen verwendet, bei denen Sie eine kategoriale Ausgangsvariable haben. Das Standard-LDA-Modell nutzt die Gaußsche Verteilung der Eingabevariablen. Sie sollten die univariaten Verteilungen der einzelnen Attribute überprüfen und sie in eine Gauß-Verteilung umwandeln, die besser aussieht. Da LDA davon ausgeht, dass jede Eingabevariable die gleiche Varianz hat, ist es immer besser, Ihre Daten zu standardisieren, bevor Sie ein LDA-Modell verwenden. Halten Sie den Mittelwert auf 0 und die Standardabweichung auf 1.Wie implementiert man ein LDA-Modell von Grund auf?Sie können ein Modell der linearen Diskriminanzanalyse von Grund auf mit Python implementieren. Beginnen wir mit dem Importieren der Bibliotheken, die für das Modell benötigt werden: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 wir mit dem Wein-Datensatz arbeiten werden, können Sie ihn aus dem UCI-Repository für maschinelles Lernen beziehen. Die scikit-learn-Bibliothek in Python bietet eine Wrapper-Funktion zum Herunterladen: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)Der Weindatensatz besteht aus 178 Zeilen mit jeweils 13 Spalten:X.shape(178, 13)Die Attribute des Weindatensatzes umfassen verschiedene Merkmale wie den Alkoholgehalt des Weins, den Magnesiumgehalt, die Farbintensität, den Farbton und vieles mehr:X.head()Der Weindatensatz enthält drei verschiedene Weinsorten:wine_info.target_names array(, dtype='<U7′)Jetzt erstellen wir einen DataFrame, der sowohl die Merkmale als auch den Inhalt des Datensatzes enthält:df = X.join(pd.Series(y, name=’class‘))Wir können den Prozess der linearen Diskriminanzanalyse wie folgt in 5 Schritte unterteilen:Schritt 1 – Berechnung der klasseninternen und klassenübergreifenden Streumatrizen.Schritt 2 – Berechnung der Eigenvektoren und der entsprechenden Eigenwerte für die Streumatrizen.Schritt 3 – Sortieren der Eigenwerte und Auswahl der besten k.Schritt 4 – Erstellung einer neuen Matrix, die die den k Eigenwerten zugeordneten Eigenvektoren enthält.Schritt 5 – Gewinnung neuer Merkmale durch Bildung des Punktprodukts aus den Daten und der Matrix aus Schritt 4.Klasseninterne StreumatrixUm die klasseninterne Streumatrix zu berechnen, können Sie den folgenden mathematischen Ausdruck verwenden:c = Gesamtzahl der unterschiedlichen Klassen undx = eine Stichprobe (d. h. eine Zeile). Nun erstellen wir einen Vektor mit den Mittelwerten jedes Merkmals:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‚class‘):feature_means1 = rows.mean()feature_means1Die Mittelwertvektoren (mi ) werden nun in die obigen Gleichungen eingefügt, um die klasseninterne Streumatrix zu erhalten: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 += sZwischenklassen-StreuungsmatrixWir können die Zwischenklassen-Streuungsmatrix mit dem folgenden mathematischen Ausdruck berechnen:wobei,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)Nun lösen wir das verallgemeinerte Eigenwertproblem, um die linearen Diskriminanten zu erhalten für:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Wir sortieren die Eigenwerte von den höchsten zu den niedrigsten, da die Eigenwerte mit den höchsten Werten die meisten Informationen über die Verteilung der Daten tragen, ist fertig. Als nächstes werden wir zunächst k Eigenvektoren bilden. Zum Schluss werden die Eigenwerte in einem temporären Array abgelegt, um sicherzustellen, dass die Eigenwerte nach der Sortierung denselben Eigenvektoren zugeordnet sind: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-16Nun werden wir die Werte in Prozent umwandeln, da es schwierig ist zu verstehen, wie viel der Varianz durch jede Komponente erklärt wird.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))Erklärte VarianzEigenvektor 0: 0.8348256799387275Eigenvektor 1: 0.1651743200612724Eigenvektor 2: 5.033396012077518e-17Eigenvektor 3: 4.268399397827047e-17Eigenvektor 4: 4.268399397827047e-17Eigenvektor 5: 2.9108789097898625e-17Eigenvektor 6: 2.498004906118145e-17Eigenvektor 7: 2.119704204950956e-17Eigenvektor 8: 2.119704204950956e-17Eigenvektor 9: 1.665567688286435e-17Eigenvektor 10: 1.665567688286435e-17Eigenvektor 11: 8.696681541121664e-18Eigenvektor 12: 3.4615924706522496e-18Zunächst erstellen wir eine neue Matrix W unter Verwendung der ersten beiden Eigenvektoren:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realNächste speichern wir das Punktprodukt von X und W in eine neue Matrix Y:Y = X∗Wwobei X = n x d Matrix mit n Stichproben und d Dimensionen. Y = n x k-Matrix mit n Stichproben und k Dimensionen.Y ist, einfach ausgedrückt, die neue Matrix oder der neue Merkmalsraum.X_lda = np.array(X.dot(W_matrix))Unsere nächste Aufgabe besteht darin, für jede Klasse ein Mitglied zu kodieren, um die Klassenbeschriftungen in unser Diagramm aufzunehmen. Schließlich stellen wir die Daten als Funktion der beiden LDA-Komponenten dar, wobei wir für jede Klasse eine andere Farbe verwenden: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>Wie implementiert man LDA mit scikit-learn?Um LDA mit scikit-learn zu implementieren, arbeiten wir mit dem gleichen Weindatensatz. Sie können ihn auch aus dem UCI-Repository für maschinelles Lernen beziehen. Sie können die vordefinierte Klasse LinearDiscriminant Analysis verwenden, die uns von der scikit-learn-Bibliothek zur Verfügung gestellt wird, um LDA zu implementieren, anstatt jedes Mal von Grund auf neu zu implementieren:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Um die jeder Komponente entsprechende Varianz zu erhalten, können Sie auf die folgende Eigenschaft zugreifen:lda.explained_variance_ratio_array()Auch hier werden wir die beiden LDA-Komponenten wie zuvor darstellen: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 PCABenachstehend die Unterschiede zwischen LDA und PCA:PCA ignoriert Klassenbezeichnungen und konzentriert sich darauf, die Hauptkomponenten zu finden, die die Varianz in den gegebenen Daten maximiert. Es handelt sich also um einen unüberwachten Algorithmus. Andererseits ist LDA ein überwachter Algorithmus, der darauf abzielt, die linearen Diskriminanten zu finden, die die Achsen darstellen, die die Trennung zwischen den verschiedenen Klassen maximieren.LDA führt bessere Mehrklassen-Klassifizierungsaufgaben durch als PCA. Allerdings schneidet PCA besser ab, wenn die Stichprobengröße vergleichsweise klein ist. Ein Beispiel hierfür ist der Vergleich der Klassifizierungsgenauigkeit bei der Bildklassifizierung, bei der sowohl LDA als auch PCA zur Dimensionalitätsreduktion eingesetzt werden. PCA wird zuerst verwendet, gefolgt von LDA.Lassen Sie uns eine Instanz der PCA-Klasse erstellen und anpassen:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Um die Werte in Prozent zum besseren Verständnis anzuzeigen, greifen wir auf die Eigenschaft explained_variance_ratio_ zu:pca.explained_variance_ratio_array()Offensichtlich hat die PCA die Komponenten ausgewählt, die die meisten Informationen beibehalten können, und diejenigen ignoriert, die die Trennung zwischen den Klassen maximieren.plt.xlabel(‚PCA1‘)plt.ylabel(‚PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow‘, alpha=0.7, edgecolors=’bUm nun ein Klassifizierungsmodell zu erstellen, das die LDA-Komponenten als Merkmale verwendet, teilen wir die Daten in Trainings- und Testdatensätze auf:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Als nächstes erstellen wir einen Entscheidungsbaum. Dann werden wir die Kategorie jeder Testprobe vorhersagen und eine Konfusionsmatrix erstellen, um die Leistung des LDA-Modells zu bewerten:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Es ist also klar, dass der Entscheidungsbaum-Klassifikator alles im Testdatensatz richtig klassifiziert hat.Was sind die Erweiterungen von LDA?LDA gilt als eine sehr einfache und effektive Methode, insbesondere für Klassifizierungsverfahren. Da sie einfach und gut verständlich ist, gibt es viele Erweiterungen und Variationen: Quadratic Discriminant Analysis (QDA) – Wenn es mehrere Eingangsvariablen gibt, verwendet jede der Klassen ihre eigene Schätzung der Varianz und Kovarianz.Regularisierte Diskriminanzanalyse (RDA) – Sie mildert den Einfluss verschiedener Variablen in der LDA, indem sie die Schätzung der Kovarianz reguliert. Einige praktische Anwendungen der LDA sind im Folgenden aufgeführt: Gesichtserkennung – Die LDA wird in der Gesichtserkennung verwendet, um die Anzahl der Attribute vor der eigentlichen Klassifizierung auf eine überschaubare Anzahl zu reduzieren. Die erzeugten Dimensionen sind eine lineare Kombination von Pixeln, die eine Vorlage bilden. Diese werden als Fisher-Gesichter bezeichnet. Medizinisch – Sie können LDA verwenden, um die Krankheit eines Patienten als leicht, mittelschwer oder schwer zu klassifizieren. Die Klassifizierung erfolgt anhand der verschiedenen Parameter des Patienten und seines medizinischen Verlaufs. Kundenidentifikation – Sie können die Merkmale von Kunden durch eine einfache Frage- und Antwortumfrage ermitteln. LDA hilft bei der Identifizierung und Auswahl, die die Eigenschaften einer Gruppe von Kunden beschreibt, die am wahrscheinlichsten einen bestimmten Artikel in einem Einkaufszentrum kaufen. ZusammenfassungLassen Sie uns einen Blick auf die Themen werfen, die wir in diesem Artikel behandelt haben: Dimensionalitätsreduktion und Notwendigkeit von LDA Funktionsweise eines LDA-Modells Darstellung, Lernen, Vorhersage und Aufbereitung von Daten in LDA Implementierung eines LDA-Modells Implementierung von LDA mit scikit-learn LDA vs. PCA Erweiterungen und Anwendungen von LDA Die lineare Diskriminanzanalyse in Python ist ein sehr einfacher und gut verstandener Ansatz zur Klassifizierung im maschinellen Lernen. Es gibt zwar auch andere Techniken zur Dimensionalitätsreduktion wie Logistische Regression oder PCA, aber LDA wird in vielen speziellen Klassifikationsfällen bevorzugt. Wenn Sie ein Experte im Bereich des maschinellen Lernens werden wollen, werden Sie mit der Kenntnis der linearen Diskriminanzanalyse mühelos dorthin gelangen. Melden Sie sich in unseren Kursen für Datenwissenschaft und maschinelles Lernen an, um weitere lukrative Karrieremöglichkeiten in diesem Bereich zu erhalten und ein zertifizierter Data Scientist zu werden.