Co je to LDA: Lineární diskriminační analýza pro strojové učení
Autor: Priyankur Sarkar
Lineární diskriminační analýza neboli LDA je technika snižování dimenzionality. Používá se jako krok před zpracováním ve strojovém učení a aplikacích klasifikace vzorů. Cílem LDA je promítnout rysy v prostoru vyšších dimenzí do prostoru nižších dimenzí, aby se zabránilo prokletí dimenzionality a také se snížily zdroje a náklady na dimenze. původní technika byla vyvinuta v roce 1936 Ronaldem A. Fisherem a byla pojmenována Lineární diskriminační nebo Fisherova diskriminační analýza. Původní lineární diskriminační analýza byla popsána jako technika dvou tříd. Verzi pro více tříd později zobecnil C. R. Rao jako vícenásobnou diskriminační analýzu. Všechny jsou jednoduše označovány jako Lineární diskriminační analýza. lDA je dohlížená klasifikační technika, která je považována za součást tvorby konkurenčních modelů strojového učení. Tato kategorie redukce dimenzionality se používá v oblastech, jako je rozpoznávání obrazu a prediktivní analýza v marketingu. co je redukce dimenzionality?Techniky redukce dimenzionality jsou důležité v aplikacích strojového učení, dolování dat, bioinformatiky a vyhledávání informací. Jejich hlavním programem je odstranění nadbytečných a závislých rysů změnou souboru dat na prostor s nižší dimenzí. zjednodušeně řečeno, redukují dimenze (tj. proměnné) v daném souboru dat při zachování většiny dat. vícerozměrná data obsahují více rysů, které mají mezi sebou korelaci. Pomocí redukce dimenzionality lze vícerozměrná data vykreslit v pouhých 2 nebo 3 dimenzích. To umožňuje prezentovat data jednoznačným způsobem, který je snadno pochopitelný i pro laika.Jaká jsou omezení logistické regrese?Logistická regrese je jednoduchý a výkonný lineární klasifikační algoritmus. Má však některé nevýhody, které vedly k zavedení alternativních klasifikačních algoritmů, jako je LDA. Některá omezení logistické regrese jsou následující:Problémy dvou tříd – Logistická regrese se tradičně používá pro problémy dvou tříd a binární klasifikace. Ačkoli ji lze extrapolovat a použít při klasifikaci více tříd, provádí se to jen zřídka. Naproti tomu lineární diskriminační analýza je považována za lepší volbu vždy, když je požadována klasifikace více tříd, a v případě binární klasifikace se používá jak logistická regrese, tak LDA. nestabilní při dobře oddělených třídách – Logistická regrese může postrádat stabilitu, když jsou třídy dobře oddělené. Zde nastupuje LDA. nestabilní s malým počtem příkladů – Pokud je málo příkladů, ze kterých se mají odhadovat parametry, stává se logistická regrese nestabilní. Lineární diskriminační analýza je však lepší volbou, protože i v takových případech bývá stabilní. jak prakticky přistupovat k modelu LDA Uvažujme situaci, kdy jste vykreslili vztah mezi dvěma proměnnými, kde každá barva představuje jinou třídu. Jedna je znázorněna červenou barvou a druhá modrou. pokud jste ochotni snížit počet dimenzí na 1, můžete vše pouze promítnout na osu x, jak je znázorněno níže: Tento přístup zanedbává veškeré užitečné informace, které poskytuje druhá funkce. K jejímu vykreslení však můžete použít metodu LDA. Výhodou LDA je, že využívá informace z obou rysů k vytvoření nové osy, která zase minimalizuje rozptyl a maximalizuje vzdálenost tříd obou proměnných. jak LDA funguje: LDA se zaměřuje především na promítání rysů v prostoru vyšších dimenzí do dimenzí nižších. Toho lze dosáhnout ve třech krocích: Nejprve je třeba vypočítat separabilitu mezi třídami, což je vzdálenost mezi průměry různých tříd. Tomu se říká rozptyl mezi třídami.2. Za druhé, vypočítat vzdálenost mezi průměrem a vzorkem každé třídy. Této vzdálenosti se také říká rozptyl uvnitř třídy. nakonec zkonstruujte prostor nižší dimenze, který maximalizuje rozptyl mezi třídami a minimalizuje rozptyl uvnitř třídy. P se považuje za projekci dolnodimenzionálního prostoru a nazývá se také Fisherovo kritérium.Jak se reprezentují modely LDA?Reprezentace LDA je poměrně jednoduchá. Model se skládá ze statistických vlastností vašich dat, které byly vypočteny pro každou třídu. V případě více proměnných se stejné vlastnosti počítají nad vícerozměrným Gaussem. Vícerozměrnými veličinami jsou průměry a kovariátní matice. předpovědi se provádějí zadáním statistických vlastností do rovnice LDA. Vlastnosti se odhadují z dat. Nakonec se hodnoty modelu uloží do souboru a vytvoří se model LDA. jak se modely LDA učí? předpoklady modelu LDA o vašich datech: Každá proměnná v datech má při vykreslení tvar zvonové křivky, tj. gaussovské. hodnoty každé proměnné se v průměru liší kolem průměru o stejnou hodnotu, tj. každý atribut má stejný rozptyl. model LDA je s pomocí těchto předpokladů schopen odhadnout průměr a rozptyl z vašich dat pro každou třídu.Střední hodnotu každého vstupu pro každou ze tříd lze vypočítat vydělením součtu hodnot celkovým počtem hodnot:Mean =Sum(x)/Nkde Mean = střední hodnota x pro třídu N = počet k = počet Sum(x) = součet hodnot každého vstupu x.Rozptyl se vypočítá pro všechny třídy jako průměr čtverce rozdílu každé hodnoty od průměru:Σ²=Sum((x – M)²)/(N – k)kde Σ² = rozptyl pro všechny vstupy x. N = počet případů. k = počet tříd. Součet((x – M)²) = součet hodnot všech (x – M)². M = průměr pro vstup x. Jak model LDA provádí předpovědi?Modely LDA používají k odhadu pravděpodobnosti Bayesovu větu. Předpovědi provádějí na základě pravděpodobnosti, že nový soubor vstupních dat patří do každé třídy. Třída, která má nejvyšší pravděpodobnost, je považována za výstupní třídu a poté LDA provede předpověď. Předpověď se provádí jednoduše pomocí Bayesovy věty, která odhaduje pravděpodobnost výstupní třídy vzhledem ke vstupním údajům. Využívá také pravděpodobnost každé třídy a pravděpodobnost, že data patří do každé třídy: P(Y=x|X=x) = / Kde x = vstup. k = výstupní třída. Plk = Nk/n neboli základní pravděpodobnost každé třídy pozorované v trénovacích datech. Nazývá se také priorní pravděpodobnost v Bayesově větě. fk(x) = odhadovaná pravděpodobnost příslušnosti x ke třídě k. F(x) se vykreslí pomocí Gaussovy distribuční funkce a poté se dosadí do výše uvedené rovnice a výsledkem je následující rovnice:Dk(x) = x∗(mean/Σ²) – (mean²/(2*Σ²)). + ln(PIk)Dk(x) se nazývá diskriminační funkce pro třídu k vzhledem k tomu, že vstup x, průměr, Σ² a Plk jsou odhadnuty z dat a třída je vypočtena jako třída s největší hodnotou, bude uvažována ve výstupní klasifikaci. Jak připravit data z LDA: Několik doporučení, která byste měli mít na paměti při přípravě dat pro sestavení modelu LDA: LDA se používá hlavně v klasifikačních problémech, kde máte kategoriální výstupní proměnnou. Umožňuje jak binární klasifikaci, tak klasifikaci více tříd: Standardní model LDA využívá Gaussovo rozdělení vstupních proměnných. Měli byste zkontrolovat jednorozměrná rozdělení jednotlivých atributů a transformovat je na více Gaussovsky vypadající rozdělení. Například pro exponenciální rozdělení použijte funkci log a kořen a pro zkosená rozdělení použijte funkci BoxCox. odlehlé hodnoty mohou zkreslit primitivní statistiky používané k rozdělení tříd v modelu LDA, proto je vhodnější je odstranit. protože model LDA předpokládá, že každá vstupní proměnná má stejný rozptyl, je vždy lepší před použitím modelu LDA data standardizovat. Udržujte průměr na hodnotě 0 a směrodatnou odchylku na hodnotě 1. Jak implementovat model LDA od nuly?Model lineární diskriminační analýzy můžete implementovat od nuly pomocí jazyka Python. Začněme importem knihoven potřebných pro 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_matrixProtože budeme pracovat se sadou dat wine, můžete ji získat z repozitáře UCI machine learning. Knihovna scikit-learn v jazyce Python poskytuje obalovou funkci pro jeho stažení: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)Datová sada vín se skládá ze 178 řádků po 13 sloupcích:X.shape(178, 13)Atributy souboru dat o víně se skládají z různých vlastností, jako je obsah alkoholu ve víně, obsah hořčíku, intenzita barvy, odstín a mnoho dalších:X.head()Soubor dat o víně obsahuje tři různé druhy vína:wine_info.target_names array(, dtype='<U7′)Nyní vytvoříme DataFrame, který bude obsahovat vlastnosti i obsah souboru dat:df = X.join(pd.Series(y, name=’class‘))Proces lineární diskriminační analýzy můžeme rozdělit do následujících 5 kroků:Krok 1 – Výpočet matic rozptylu uvnitř třídy a mezi třídami.Krok 2 – Výpočet vlastních vektorů a jim odpovídajících vlastních čísel pro matice rozptylu.Krok 3 – Seřazení vlastních čísel a výběr nejlepších k.Krok 4 – Vytvoření nové matice, která bude obsahovat vlastní vektory přiřazené ke k vlastním hodnotám. krok 5 – Získání nových rysů pomocí bodového součinu dat a matice z kroku 4. Matice rozptylu v rámci třídyPro výpočet matice rozptylu v rámci třídy lze použít následující matematický výraz:kde c = celkový počet různých tříd a kde x = vzorek (tj. řádek). n = celkový počet vzorků v rámci dané třídy.Nyní vytvoříme vektor se středními hodnotami jednotlivých rysů:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‚class‘):feature_means1 = rows.mean()feature_means1Střední vektory (mi ) nyní dosadíme do výše uvedených rovnic a získáme matici rozptylu uvnitř třídy:withinclass_scatter_matrix = np.nuly((13,13))for c, rows in df.groupby(‚class‘):rows = rows.drop(, axis=1)s = np.nuly((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 rozptylu mezi třídamiMatrix rozptylu mezi třídami můžeme vypočítat pomocí následujícího matematického výrazu:kde,afeature_means2 = df.mean()betweenclass_scatter_matrix = np.zero((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)Nyní vyřešíme zobecněný problém vlastních hodnot, abychom získali lineární diskriminanty pro:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Vlastní hodnoty seřadíme od nejvyšší po nejnižší, protože vlastní hodnoty s nejvyššími hodnotami nesou nejvíce informací o rozložení dat je hotovo. Dále budeme nejprve k vlastním vektorům. Nakonec umístíme vlastní hodnoty do dočasného pole, abychom se ujistili, že vlastní hodnoty budou po dokončení třídění mapovány na stejné vlastní vektory: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. Vlastní_páry = eigen_pairs.4612319830225146.982859387586841.4317197551638386e-141.2141209883217706e-141.2141209883217706e-148.279823065850476e-157.105427357601002e-156.0293733655173466e-156.0293733655173466e-154.737608877108813e-154.737608877108813e-152.4737196789039026e-159.84629525010022e-16Nyní převedeme hodnoty na procenta, protože je obtížné pochopit, jak velkou část rozptylu vysvětlují jednotlivé komponenty.sum_of_eigen_values = sum(eigen_values)print(‚Explained Variance‘)for i, pair in enumerate(eigen_pairs): print(‚Eigenvector {}: {}“.format(i, (pair/sum_vlastnich_hodnot).real))Vysvětlená varianceVlastní vektor 0: 0,8348256799387275Vlastní vektor 1: 0,1651743200612724Vlastní vektor 2: 5,033396012077518e-17Vlastní vektor 3: 4.268399397827047e-17Vlastní vektor 4: 4.268399397827047e-17Vlastní vektor 5: 2.9108789097898625e-17Vlastní vektor 6: 2.498004906118145e-17Vlastní vektor 7: 2.119704204950956e-17Vlastní vektor 8: 2.119704204950956e-17Vlastní vektor 9: 1.665567688286435e-17Vlastní vektor 10: 1.665567688286435e-17Vlastní vektor 11: 8.696681541121664e-18Vlastní vektor 12: 3.4615924706522496e-18Nejprve vytvoříme novou matici W pomocí prvních dvou vlastních vektorů:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realDále uložíme bodový součin X a W do nové matice Y:Y = X∗Wkde, X = matice n x d s n vzorky a d rozměry. Y = matice n x k s n vzorky a rozměry k.Zjednodušeně řečeno, Y je nová matice nebo nový příznakový prostor.X_lda = np.array(X.dot(W_matrix))Naší další prací je zakódovat každé třídě člen, abychom mohli do našeho grafu začlenit štítky tříd. To provedeme proto, že matplotlib neumí přímo pracovat s kategoriálními proměnnými.nakonec vykreslíme data jako funkci dvou členů LDA, přičemž pro každou třídu použijeme jinou barvu: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 implementovat LDA pomocí scikit-learnPro implementaci LDA pomocí scikit-learn budeme pracovat se stejnou sadou dat o víně. Můžete jej také získat z úložiště strojového učení UCI. K implementaci LDA můžete použít předdefinovanou třídu LinearDiscriminant Analysis, kterou nám zpřístupnila knihovna scikit-learn, místo toho, abyste ji pokaždé implementovali od začátku:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Chcete-li získat rozptyl odpovídající každé komponentě, můžete přistupovat k následující vlastnosti:lda.explained_variance_ratio_array()Opět vykreslíme obě složky LDA stejně jako předtím: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>Lineární diskriminační analýza vs PCABNíže jsou uvedeny rozdíly mezi LDA a PCA:PCA ignoruje označení tříd a zaměřuje se na nalezení hlavních komponent, které maximalizují rozptyl v daných datech. Jedná se tedy o nesupervisovaný algoritmus. Na druhou stranu LDA je algoritmus pod dohledem, jehož cílem je najít lineární diskriminanty, které představují ty osy, které maximalizují oddělení různých tříd.LDA plní lépe úlohy klasifikace více tříd než PCA. PCA však funguje lépe, pokud je velikost vzorku relativně malá. Příkladem může být porovnání přesnosti klasifikace, které se používá při klasifikaci obrázků. jak LDA, tak PCA se používají v případě redukce dimenzionality. PCA je na prvním místě následována LDA.Vytvořme a fitujme instanci třídy PCA:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Pro lepší pochopení si opět zobrazíme hodnoty v procentech, přistoupíme k vlastnosti explained_variance_ratio_:pca.explained_variance_ratio_array()Je zřejmé, že PCA vybrala komponenty, které budou schopny zachovat nejvíce informací, a ignoruje ty, které maximalizují rozdělení mezi třídami.plt.xlabel(‚PCA1‘)plt.ylabel(‚PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow‘, alpha=0.7, edgecolors=’bPro vytvoření klasifikačního modelu s použitím komponent LDA jako rysů nyní rozdělíme data na trénovací a testovací datové sady:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Dále vytvoříme rozhodovací strom. Poté předpovíme kategorii každého vzorku testu a vytvoříme matici záměny pro vyhodnocení výkonnosti modelu LDA:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Je tedy zřejmé, že klasifikátor rozhodovacího stromu správně klasifikoval vše v souboru testovacích dat.Jaká jsou rozšíření LDA?LDA je považován za velmi jednoduchou a účinnou metodu, zejména pro klasifikační techniky. Protože je jednoduchá a dobře pochopitelná, tak má mnoho rozšíření a variant:Kvadratická diskriminační analýza (QDA) – Když existuje více vstupních proměnných, každá z tříd používá vlastní odhad rozptylu a kovariance.Flexibilní diskriminační analýza (FDA) – Tato technika se provádí, když se jako splajny používá nelineární kombinace vstupů.Regularizovaná diskriminační analýza(RDA) – zmírňuje vliv různých proměnných v LDA pomocí regularizace odhadu kovariance.Reálné aplikace LDNěkteré praktické aplikace LDA jsou uvedeny níže:Rozpoznávání obličejů – LDA se používá při rozpoznávání obličejů ke snížení počtu atributů na zvládnutelnější počet před vlastní klasifikací. Vytvořené rozměry jsou lineární kombinací pixelů, které tvoří šablonu. Ty se nazývají Fisherovy tváře. lékařství – Pomocí LDA lze klasifikovat onemocnění pacienta jako mírné, středně závažné nebo závažné. Klasifikace se provádí na základě různých parametrů pacienta a jeho zdravotní dráhy. Identifikace zákazníků – Rysy zákazníků můžete získat provedením jednoduchého průzkumu otázek a odpovědí. LDA pomáhá při identifikaci a výběru, který popisuje vlastnosti skupiny zákazníků, kteří si s největší pravděpodobností koupí konkrétní zboží v nákupním centru. ShrnutíPodívejme se na témata, kterým jsme se věnovali v tomto článku: Redukce dimenzionality a potřeba LDA Práce s modelem LDA Reprezentace, učení, predikce a příprava dat v LDA Implementace modelu LDA Implementace LDA pomocí scikit-learn LDA vs PCA Rozšíření a aplikace LDA Lineární diskriminační analýza v Pythonu je velmi jednoduchý a dobře pochopený přístup klasifikace ve strojovém učení. Existují sice i jiné techniky redukce dimenzionality, jako je logistická regrese nebo PCA, ale v mnoha speciálních případech klasifikace se dává přednost LDA. Pokud se chcete stát expertem v oblasti strojového učení, znalost Lineární diskriminační analýzy by vás na tuto pozici dovedla bez námahy. Zapište se do našich kurzů datové vědy a strojového učení, abyste získali další lukrativní možnosti kariéry v tomto prostředí a stali se certifikovaným datovým vědcem.