Co to jest LDA: Linear Discriminant Analysis for Machine Learning

What is LDA: Linear Discriminant Analysis for Machine Learning

By Priyankur Sarkar

Linear Discriminant Analysis lub LDA jest techniką redukcji wymiarowości. Jest ona używana jako krok wstępnego przetwarzania w uczeniu maszynowym i zastosowaniach klasyfikacji wzorców. Celem LDA jest rzutowanie cech w przestrzeni o wyższym wymiarze na przestrzeń o niższym wymiarze w celu uniknięcia przekleństwa wymiarowości, a także zmniejszenia zasobów i kosztów wymiaru. Oryginalna technika została opracowana w 1936 roku przez Ronalda A. Fishera i została nazwana Liniową Analizą Dyskryminacyjną lub Analizą Dyskryminacyjną Fishera. Oryginalna liniowa analiza dyskryminacyjna była opisana jako technika dwuklasowa. Wersja wieloklasowa została później uogólniona przez C.R Rao jako Wieloklasowa Analiza Dyskryminacyjna. Wszystkie one są po prostu określane jako Linear Discriminant Analysis.LDA jest nadzorowaną techniką klasyfikacji, która jest uważana za część rzemiosła konkurencyjnych modeli uczenia maszynowego. Ta kategoria redukcji wymiarowości jest wykorzystywana w takich dziedzinach jak rozpoznawanie obrazów i analiza predykcyjna w marketingu.Czym jest redukcja wymiarowości? Techniki redukcji wymiarowości są ważne w zastosowaniach uczenia maszynowego, eksploracji danych, bioinformatyki i wyszukiwania informacji. Głównym celem jest usunięcie zbędnych i zależnych cech poprzez zmianę zbioru danych na przestrzeń o niższym wymiarze.W prostych słowach, redukują one wymiary (tj. zmienne) w danym zbiorze danych, zachowując większość danych.Dane wielowymiarowe składają się z wielu cech mających korelację ze sobą. Możesz wykreślić wielowymiarowe dane w zaledwie 2 lub 3 wymiarach z redukcją wymiarowości. Pozwala to na przedstawienie danych w sposób jednoznaczny, który może być łatwo zrozumiany przez laika.Jakie są ograniczenia regresji logistycznej? Regresja logistyczna jest prostym i wydajnym algorytmem klasyfikacji liniowej. Ma ona jednak pewne wady, które doprowadziły do powstania alternatywnych algorytmów klasyfikacyjnych, takich jak LDA. Niektóre z ograniczeń regresji logistycznej są następujące:Problemy dwuklasowe – Regresja logistyczna jest tradycyjnie używana dla problemów klasyfikacji dwuklasowej i binarnej. Chociaż może być ekstrapolowana i używana w klasyfikacji wieloklasowej, jest to rzadko wykonywane. Z drugiej strony, Liniowa Analiza Dyskryminacyjna jest uważana za lepszy wybór, gdy wymagana jest klasyfikacja wieloklasowa, a w przypadku klasyfikacji binarnej stosuje się zarówno regresję logistyczną, jak i LDA. Niestabilna przy niewielu przykładach – Jeśli istnieje niewiele przykładów, na podstawie których mają zostać oszacowane parametry, regresja logistyczna staje się niestabilna. Jednak liniowa analiza dyskryminacyjna jest lepszą opcją, ponieważ ma tendencję do bycia stabilną nawet w takich przypadkach.Jak mieć praktyczne podejście do modelu LDA? Rozważmy sytuację, w której wykreśliliśmy związek pomiędzy dwoma zmiennymi, gdzie każdy kolor reprezentuje inną klasę. Jeśli jesteś skłonny zredukować liczbę wymiarów do 1, możesz po prostu rzutować wszystko na oś x, jak pokazano poniżej: Takie podejście pomija wszelkie pomocne informacje dostarczane przez drugą cechę. Można jednak użyć LDA do jej wykreślenia. Zaletą LDA jest to, że wykorzystuje ona informacje z obu cech do stworzenia nowej osi, która z kolei minimalizuje wariancję i maksymalizuje odległość klasową dwóch zmiennych.Jak działa LDA? LDA koncentruje się przede wszystkim na rzutowaniu cech w przestrzeni o wyższym wymiarze na niższy wymiar. Można to osiągnąć w trzech krokach:Po pierwsze, należy obliczyć separowalność pomiędzy klasami, która jest odległością pomiędzy średnimi różnych klas. Jest to tak zwana wariancja międzyklasowa.Po drugie, należy obliczyć odległość między średnią a próbką każdej klasy. Jest to również nazywane wariancją wewnątrzklasową.Wreszcie, skonstruuj przestrzeń niższego wymiaru, która maksymalizuje wariancję międzyklasową i minimalizuje wariancję wewnątrzklasową. P jest traktowane jako projekcja przestrzeni dolnowymiarowej, nazywana również kryterium Fishera.Jak reprezentowane są modele LDA? Reprezentacja LDA jest dość prosta. Model składa się z właściwości statystycznych danych, które zostały obliczone dla każdej klasy. W przypadku wielu zmiennych te same właściwości są obliczane na wielowymiarowym Gaussian. Wielowymiarowe są środki i macierz kowariancji. Przewidywania są dokonywane poprzez dostarczenie właściwości statystycznych do równania LDA. Właściwości te są szacowane na podstawie danych użytkownika. Na koniec, wartości modelu są zapisywane do pliku w celu utworzenia modelu LDA.Jak uczą się modele LDA? Założenia modelu LDA dotyczące danych:Każda zmienna w danych ma kształt krzywej dzwonowej, gdy jest wykreślona, tj. Gaussian.Wartości każdej zmiennej różnią się wokół średniej o taką samą ilość średnio, tj. każdy atrybut ma taką samą wariancję.Model LDA jest w stanie oszacować średnią i wariancję z danych dla każdej klasy z pomocą tych założeń.Średnia wartość każdego wejścia dla każdej z klas może być obliczona poprzez podzielenie sumy wartości przez całkowitą liczbę wartości:Mean =Sum(x)/Nkwhere Mean = średnia wartość x dla klasy N = liczba k = liczba Sum(x) = suma wartości każdego wejścia x.Wariancja jest obliczana dla wszystkich klas jako średnia kwadratu różnicy każdej wartości od średniej:Σ²=Sum((x – M)²)/(N – k)gdzie Σ² = wariancja dla wszystkich danych wejściowych x. N = liczba instancji. k = liczba klas. Suma((x – M)²) = Suma wartości wszystkich (x – M)². M = średnia dla wejścia x.Jak model LDA dokonuje przewidywań? Modele LDA wykorzystują Twierdzenie Bayesa do szacowania prawdopodobieństw. Dokonują one przewidywań na podstawie prawdopodobieństwa, że nowy zestaw danych wejściowych należy do każdej klasy. Klasa, która ma najwyższe prawdopodobieństwo jest uważana za klasę wyjściową, a następnie LDA dokonuje predykcji. Przewidywanie odbywa się po prostu poprzez użycie twierdzenia Bayesa, które szacuje prawdopodobieństwo klasy wyjściowej, biorąc pod uwagę dane wejściowe. Wykorzystuje się również prawdopodobieństwo każdej klasy i prawdopodobieństwo danych należących do każdej klasy: P(Y=x|X=x) = / Gdzie x = dane wejściowe. k = klasa wyjściowa. Plk = Nk/n lub prawdopodobieństwo bazowe każdej klasy zaobserwowanej w danych treningowych. fk(x) = szacowane prawdopodobieństwo przynależności x do klasy k. F(x) jest wykreślane przy użyciu funkcji rozkładu gaussowskiego, a następnie jest wstawiane do powyższego równania i otrzymujemy następujące równanie: Dk(x) = x∗(średnia/Σ²) – (średnia²/(2*Σ²)) + ln(PIk)Dk(x) jest nazywane funkcją dyskryminacyjną dla klasy k, biorąc pod uwagę dane wejściowe x, średnia, Σ² i Plk są szacowane z danych i klasa jest obliczana jako mająca największą wartość, będzie brana pod uwagę w klasyfikacji wyjściowej. Jak przygotować dane do LDA? Kilka sugestii, o których należy pamiętać przygotowując dane do budowy modelu LDA: LDA jest głównie używana w problemach klasyfikacyjnych, gdzie mamy do czynienia z kategoryczną zmienną wyjściową. Pozwala on zarówno na klasyfikację binarną jak i wieloklasową.Standardowy model LDA wykorzystuje rozkład gaussowski zmiennych wejściowych. Powinieneś sprawdzić rozkłady jednowariantowe każdego atrybutu i przekształcić je w rozkład bardziej wyglądający jak gaussowski. Na przykład, dla rozkładu wykładniczego, użyj funkcji log i root, a dla rozkładów skośnych użyj BoxCox.Wartości odstające mogą przekrzywić prymitywne statystyki używane do oddzielenia klas w LDA, więc lepiej jest je usunąć.Ponieważ LDA zakłada, że każda zmienna wejściowa ma taką samą wariancję, zawsze lepiej jest znormalizować dane przed użyciem modelu LDA. Utrzymuj średnią równą 0 i odchylenie standardowe równe 1.Jak zaimplementować model LDA od podstaw? Możesz zaimplementować model Liniowej Analizy Dyskryminacyjnej od podstaw używając Pythona. Zacznijmy od zaimportowania bibliotek, które są wymagane do modelu: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_matrixPonieważ będziemy pracować ze zbiorem danych wine, można go uzyskać z repozytorium uczenia maszynowego UCI. Biblioteka scikit-learn w Pythonie udostępnia funkcję wrappera do jego pobrania: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)Zbiór danych o winie składa się ze 178 wierszy po 13 kolumn każdy:X.shape(178, 13)Atrybuty zbioru danych o winie składają się z różnych cech, takich jak zawartość alkoholu w winie, zawartość magnezu, intensywność koloru, odcień i wiele innych:X.head()Zbiór danych o winie zawiera trzy różne rodzaje wina:wine_info.target_names array(, dtype='<U7′)Teraz utworzymy DataFrame, który będzie zawierał zarówno cechy jak i zawartość zbioru danych:df = X.join(pd.Series(y, name=’class’))Proces Liniowej Analizy Dyskryminacyjnej możemy podzielić na 5 kroków w następujący sposób:Krok 1 – Obliczenie macierzy rozproszenia wewnątrz- i międzyklasowego.Krok 2 – Obliczenie wektorów własnych i odpowiadających im wartości własnych dla macierzy rozproszenia.Krok 3 – Sortowanie wartości własnych i wybranie najlepszych k.Krok 4 – Utworzenie nowej macierzy, która będzie zawierać wektory własne odwzorowane na k wartości własnych.Krok 5 – Uzyskanie nowych cech poprzez wykonanie iloczynu kropkowego danych i macierzy z kroku 4.Macierz rozproszenia wewnątrzklasowegoAby obliczyć macierz rozproszenia wewnątrzklasowego, można użyć następującego wyrażenia matematycznego:gdzie, c = całkowita liczba odrębnych klas i gdzie, x = próbka (tj. wiersz). n = całkowita liczba próbek w obrębie danej klasy.Teraz tworzymy wektor ze średnimi wartościami każdej cechy:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(’class’):feature_means1 = rows.mean()feature_means1Wektory średnich (mi ) są teraz wstawiane do powyższych równań, aby otrzymać macierz rozrzutu wewnątrzklasowego: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 += sMacierz rozrzutu międzyklasowegoMacierz rozrzutu międzyklasowego możemy obliczyć za pomocą następującego wyrażenia matematycznego:where,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)Teraz rozwiążemy uogólniony problem wartości własnych, aby uzyskać liniowe wyróżniki dla:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Posortujemy wartości własne od najwyższej do najniższej, ponieważ wartości własne o najwyższych wartościach niosą najwięcej informacji o rozkładzie danych. Następnie, najpierw k wektory własne. Na koniec umieścimy wartości własne w tablicy tymczasowej, aby upewnić się, że wartości własne odwzorowują te same wektory własne po zakończeniu sortowania: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-16Teraz przekształcimy te wartości na procenty, ponieważ trudno jest zrozumieć jak duża część wariancji jest wyjaśniona przez każdy składnik.sum_of_eigen_values = suma(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.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-18Najpierw utworzymy nową macierz W wykorzystując dwa pierwsze wektory własne:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realNastępnie zapiszemy iloczyn punktowy X i W w nowej macierzy Y:Y = X∗Where, X = n x d matrix with n sample and d dimensions. Y = n x k macierz z n próbkami i k wymiarami.W prostych słowach, Y jest nową macierzą lub nową przestrzenią cech.X_lda = np.array(X.dot(W_matrix))Naszą następną pracą jest zakodowanie każdej klasy jako członka w celu włączenia etykiet klas do naszej działki. Robimy to, ponieważ matplotlib nie może bezpośrednio obsługiwać zmiennych kategorycznych.Na koniec, wykreślamy dane jako funkcję dwóch składowych LDA używając innego koloru dla każdej klasy: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>Jak zaimplementować LDA używając scikit-learn? Aby zaimplementować LDA używając scikit-learn, popracujmy z tym samym zbiorem danych o winie. Można go również uzyskać z repozytorium uczenia maszynowego UCI. Do implementacji LDA można użyć predefiniowanej klasy LinearDiscriminant Analysis udostępnionej nam przez bibliotekę scikit-learn, zamiast implementować ją za każdym razem od zera:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Aby uzyskać wariancję odpowiadającą każdej składowej, można uzyskać dostęp do następującej właściwości:lda.explained_variance_ratio_array()Ponownie, wykreślimy dwie składowe LDA tak jak zrobiliśmy to wcześniej: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 PCAB Poniżej przedstawiamy różnice pomiędzy LDA i PCA:PCA ignoruje etykiety klas i skupia się na znalezieniu głównych składowych, które maksymalizują wariancję w danych. Jest to więc algorytm bez nadzoru. Z drugiej strony, LDA jest nadzorowanym algorytmem, który ma na celu znalezienie liniowych wyróżników, które reprezentują te osie, które maksymalizują separację pomiędzy różnymi klasami. LDA wykonuje lepsze zadania klasyfikacji wieloklasowej niż PCA. Jednak PCA działa lepiej, gdy rozmiar próbki jest stosunkowo mały. Przykładem może być porównanie dokładności klasyfikacji, które są używane w klasyfikacji obrazów.Zarówno LDA i PCA są używane w przypadku redukcji wymiarowości. PCA jest pierwsze, a następnie LDA.Utwórzmy i dopasujmy instancję klasy PCA:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Ponownie, aby wyświetlić wartości w procentach dla lepszego zrozumienia, uzyskamy dostęp do właściwości explained_variance_ratio_:pca.explained_variance_ratio_array()Wyraźnie widać, że PCA wybrała te składowe, które będą w stanie zachować najwięcej informacji i ignoruje te, które maksymalizują separację między klasami.plt.xlabel(’PCA1′)plt.ylabel(’PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bTeraz, aby stworzyć model klasyfikacyjny wykorzystujący składowe LDA jako cechy, podzielimy dane na zbiory treningowe i testowe:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Kolejną rzeczą, którą zrobimy jest stworzenie drzewa decyzyjnego. Następnie, będziemy przewidywać kategorię każdego przykładowego testu i utworzymy macierz konfuzji, aby ocenić wydajność modelu LDA:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Widać więc wyraźnie, że klasyfikator drzewa decyzyjnego poprawnie sklasyfikował wszystko w testowym zbiorze danych.Jakie są rozszerzenia LDA? LDA jest uważana za bardzo prostą i efektywną metodę, szczególnie w przypadku technik klasyfikacji. Ponieważ jest prosta i dobrze rozumiana, więc ma wiele rozszerzeń i odmian:Quadratic Discriminant Analysis(QDA) – Gdy istnieje wiele zmiennych wejściowych, każda z klas używa własnej estymaty wariancji i kowariancji.Flexible Discriminant Analysis(FDA) – Technika ta jest wykonywana, gdy nieliniowa kombinacja wejść jest używana jako splajny.Regularized Discriminant Analysis(RDA) – moderuje wpływ różnych zmiennych w LDA poprzez regularyzację estymaty kowariancji.Real-Life Applications of LDASome z praktycznych zastosowań LDA są wymienione poniżej:Rozpoznawanie twarzy – LDA jest używana w rozpoznawaniu twarzy w celu zredukowania liczby atrybutów do bardziej zarządzalnej liczby przed właściwą klasyfikacją. Wymiary, które są generowane to liniowa kombinacja pikseli, która tworzy szablon. Są to tzw. twarze Fishera. Medyczne – LDA można wykorzystać do klasyfikacji chorób pacjentów jako łagodne, umiarkowane lub ciężkie. Klasyfikacja jest dokonywana na podstawie różnych parametrów pacjenta i jego trajektorii medycznej. Identyfikacja klienta – Możesz uzyskać cechy klientów poprzez wykonanie prostej ankiety z pytaniami i odpowiedziami. LDA pomaga w identyfikacji i wyborze, który opisuje właściwości grupy klientów, którzy są najbardziej prawdopodobne, aby kupić konkretny przedmiot w centrum handlowym. PodsumowaniePrzyjrzyjmy się zagadnieniom, które poruszyliśmy w tym artykule: Redukcja wymiarowości i zapotrzebowanie na LDA Praca modelu LDA Reprezentacja, uczenie, predykcja i przygotowanie danych w LDA Implementacja modelu LDA Implementacja LDA przy użyciu scikit-learn LDA vs PCA Rozszerzenia i zastosowania LDA Liniowa analiza dyskryminacyjna w Pythonie jest bardzo prostym i dobrze rozumianym podejściem do klasyfikacji w uczeniu maszynowym. Chociaż istnieją inne techniki redukcji wymiarowości, takie jak regresja logistyczna lub PCA, ale LDA jest preferowana w wielu szczególnych przypadkach klasyfikacji. Jeśli chcesz być ekspertem w uczeniu maszynowym, wiedza o liniowej analizie dyskryminacyjnej doprowadzi Cię do tej pozycji bez wysiłku. Zapisz się na nasze kursy Data Science i Machine Learning, aby uzyskać więcej lukratywnych opcji kariery w tym krajobrazie i stać się certyfikowanym Data Scientist.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.