Mikä on LDA: Linear Discriminant Analysis for Machine Learning
By Priyankur Sarkar
Linear Discriminant Analysis eli LDA on dimensioiden pienentämistekniikka. Sitä käytetään esikäsittelyvaiheena koneoppimisessa ja kuvioiden luokittelun sovelluksissa. LDA:n tavoitteena on projisoida korkeampiulotteisessa avaruudessa olevat piirteet alempiulotteiseen avaruuteen, jotta vältetään ulottuvuuden kirous ja vähennetään resursseja ja ulottuvuuskustannuksia.Alkuperäisen tekniikan kehitti Ronald A. Fisher vuonna 1936 ja se sai nimekseen Linear Discriminant tai Fisherin diskriminantianalyysi. Alkuperäinen lineaarinen diskriminanttimenetelmä kuvattiin kahden luokan tekniikaksi. Myöhemmin C.R. Rao yleisti moniluokkaisen version nimellä Multiple Discriminant Analysis. Niihin kaikkiin viitataan yksinkertaisesti nimellä Linear Discriminant Analysis.LDA on valvottu luokittelutekniikka, jota pidetään osana kilpailukykyisten koneoppimismallien luomista. Tätä ulottuvuuden pienentämisen luokkaa käytetään esimerkiksi kuvantunnistuksessa ja markkinoinnin ennakoivassa analyysissä.Mitä on ulottuvuuden pienentäminen?Dimensioiden pienentämistekniikat ovat tärkeitä koneoppimisen, tiedonlouhinnan, bioinformatiikan ja tiedonhaun sovelluksissa. Päätavoitteena on poistaa tarpeettomat ja riippuvaiset piirteet muuttamalla tietokokonaisuus matalampiulotteiseen avaruuteen.Yksinkertaisesti sanottuna ne vähentävät tietyn tietokokonaisuuden ulottuvuuksia (eli muuttujia) säilyttäen samalla suurimman osan tiedoista.Moniulotteinen data koostuu useista piirteistä, joilla on korrelaatio keskenään. Voit piirtää moniulotteisen datan vain 2 tai 3 ulottuvuuteen ulottuvuuksien vähentämisen avulla. Sen avulla tiedot voidaan esittää selkeällä tavalla, jonka maallikko voi helposti ymmärtää.Mitkä ovat logistisen regression rajoitukset?Logistinen regressio on yksinkertainen ja tehokas lineaarinen luokittelualgoritmi. Sillä on kuitenkin joitakin haittoja, jotka ovat johtaneet vaihtoehtoisten luokittelualgoritmien, kuten LDA:n, käyttöönottoon. Logistisen regression rajoituksia ovat seuraavat:Kahden luokan ongelmat – Logistista regressiota käytetään perinteisesti kahden luokan ja binääristen luokitusongelmien ratkaisemiseen. Vaikka sitä voidaan ekstrapoloida ja käyttää moniluokkaiseen luokitteluun, sitä tehdään harvoin. Toisaalta lineaarista diskriminaatioanalyysiä pidetään parempana valintana aina, kun tarvitaan moniluokkaista luokittelua, ja binääriluokituksissa käytetään sekä logistista regressiota että LDA:ta. epävakaa hyvin erotettujen luokkien kanssa – Logistinen regressio voi olla epävakaa, kun luokat ovat hyvin erotettuja. Tällöin LDA tulee kyseeseen.Epävakaa, kun esimerkkejä on vähän – Jos esimerkkejä, joista parametrit estimoidaan, on vähän, logistisesta regressiosta tulee epävakaa. Lineaarinen diskriminaatioanalyysi on kuitenkin parempi vaihtoehto, koska sillä on taipumus olla vakaa myös tällaisissa tapauksissa.Miten LDA-mallia lähestytään käytännössä?Mieti tilannetta, jossa olet piirtänyt kahden muuttujan välisen suhteen, jossa jokainen väri edustaa eri luokkaa. Toinen esitetään punaisella värillä ja toinen sinisellä.Jos olet halukas vähentämään ulottuvuuksien lukumäärän yhteen, voit vain projisoida kaiken x-akselille alla esitetyllä tavalla: Tämä lähestymistapa jättää huomiotta toisen ominaisuuden tarjoaman hyödyllisen tiedon. Voit kuitenkin käyttää LDA:ta sen piirtämiseen. LDA:n etuna on, että se käyttää molempien ominaisuuksien tietoja luodakseen uuden akselin, joka puolestaan minimoi varianssin ja maksimoi kahden muuttujan luokkaetäisyyden.Miten LDA toimii?LDA keskittyy ensisijaisesti projisoimaan korkeamman ulottuvuuden avaruudessa olevat ominaisuudet alempiin ulottuvuuksiin. Tähän päästään kolmessa vaiheessa: Ensin on laskettava luokkien välinen erotettavuus, joka on eri luokkien keskiarvojen välinen etäisyys. Tätä kutsutaan luokkien väliseksi varianssiksi.Toiseksi lasketaan kunkin luokan keskiarvon ja otoksen välinen etäisyys. Lopuksi rakennetaan alempiulotteinen avaruus, joka maksimoi luokkien välisen varianssin ja minimoi luokkien sisäisen varianssin. P:tä pidetään alempiulotteisen avaruuden projektiona, jota kutsutaan myös Fisherin kriteeriksi.Miten LDA-mallit esitetään?LDA:n esittäminen on melko suoraviivaista. Malli koostuu aineistosi tilastollisista ominaisuuksista, jotka on laskettu kullekin luokalle. Samat ominaisuudet lasketaan monimuuttujaisen Gaussin yli, jos kyseessä on useita muuttujia. Monimuuttujia ovat keskiarvot ja kovariaattimatriisi. ennusteet tehdään antamalla tilastolliset ominaisuudet LDA-yhtälöön. Ominaisuudet estimoidaan tiedoista. Lopuksi mallin arvot tallennetaan tiedostoon LDA-mallin luomiseksi.Miten LDA-mallit oppivat?LDA-mallin tekemät oletukset datastasi:Jokainen datan muuttuja on piirrettynä kellokäyrän muotoinen eli gaussinen.Kunkin muuttujan arvot vaihtelevat keskiarvon ympärillä keskimäärin saman verran eli kullakin ominaisuudella on sama varianssi.LDA-malli kykenee estimoimaan datastasi keskiarvon ja varianssin kullekin luokka-asteelle näiden oletusten avulla.Kunkin syötteen keskiarvo kullekin luokalle voidaan laskea jakamalla arvojen summa arvojen kokonaismäärällä: Keskiarvo =Sum(x)/Nkjossa Keskiarvo = x:n keskiarvo luokassa N = lukumäärä k = lukumäärä Sum(x) = kunkin syötteen x arvojen summa.Varianssi lasketaan kaikkien luokkien yli kunkin arvon keskiarvosta poikkeamisen neliön keskiarvona:Σ²=Sum((x – M)²)/(N – k)missä Σ² = varianssi kaikkien syötteiden x yli. N = instanssien lukumäärä. k = luokkien lukumäärä. Sum((x – M)²) = kaikkien (x – M)² arvojen summa. M = syötteen x keskiarvo.Miten LDA-malli tekee ennusteita?LDA-mallit käyttävät Bayesin teoreemaa todennäköisyyksien estimointiin. Ne tekevät ennusteita sen todennäköisyyden perusteella, että uusi syötetietoaineisto kuuluu kuhunkin luokkaan. Luokkaa, jonka todennäköisyys on suurin, pidetään lähtöluokkana, ja sen jälkeen LDA-malli tekee ennusteen. Ennuste tehdään yksinkertaisesti käyttämällä Bayesin teoreemaa, joka arvioi tulosluokan todennäköisyyden syötteen perusteella. Niissä käytetään myös kunkin luokan todennäköisyyttä ja kuhunkin luokkaan kuuluvan datan todennäköisyyttä: P(Y=x|X=x) = / missä x = tulo. k = tulosluokka. Plk = Nk/n eli kunkin harjoitusaineistossa havaitun luokan perustodennäköisyys. Sitä kutsutaan myös Bayesin teoreeman ennakkotodennäköisyydeksi. fk(x) = arvioitu todennäköisyys sille, että x kuuluu luokkaan k. f(x) piirretään käyttäen Gaussin jakaumafunktiota, ja sitten se liitetään yllä olevaan yhtälöön, ja tuloksena saadaan seuraava yhtälö: Dk(x) = x∗(keskiarvo/Σ²) – (keskiarvo²/(2*Σ²)) + ln(PIk)Dk(x) on nimeltään luokan k diskriminaatiofunktio, koska syötteen x, keskiarvo, Σ² ja Plk on kaikki estimoitu datasta ja luokka, jolla on suurin arvo, otetaan huomioon lähtötietojen luokittelussa. Miten valmistella dataa LDA:ta varten?Joitakin ehdotuksia, jotka kannattaa pitää mielessä, kun valmistelet dataa LDA-mallin rakentamista varten: LDA:ta käytetään pääasiassa luokitusongelmissa, joissa on kategorinen tulosmuuttuja. Se mahdollistaa sekä binäärisen luokittelun että moniluokkaisen luokittelun.Standardi LDA-malli hyödyntää syötemuuttujien Gaussin jakaumaa. Sinun tulisi tarkistaa kunkin attribuutin univariaattiset jakaumat ja muuttaa ne Gaussin näköisemmäksi jakaumaksi. Käytä esimerkiksi eksponenttijakaumalle log- ja juurifunktiota ja vinoutuneille jakaumille BoxCox-funktiota.Ulkopuoliset jakaumat voivat vinouttaa LDA:ssa luokkien erottamiseen käytettäviä primitiivisiä tilastoja, joten ne kannattaa mieluummin poistaa.Koska LDA olettaa, että kullakin syötemuuttujalla on sama varianssi, on aina parempi vakioida aineisto ennen LDA-mallin käyttämistä. Pidä keskiarvo 0:na ja keskihajonta 1:nä.Miten toteuttaa LDA-malli tyhjästä?Voit toteuttaa lineaarisen diskriminaatioanalyysin mallin tyhjästä Pythonilla. Aloitetaan tuomalla malliin tarvittavat kirjastot: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_matrixKoska työskentelemme wine-tietokannan kanssa, voit hankkia sen UCI:n koneoppimisen arkistosta. Pythonin scikit-learn-kirjasto tarjoaa wrapper-funktion sen lataamiseen: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)Viinitietokanta koostuu 178 rivistä, joissa kussakin on 13 saraketta:X.shape(178, 13)Viinitietokannan attribuutit koostuvat erilaisista ominaisuuksista, kuten viinin alkoholipitoisuudesta, magnesiumpitoisuudesta, värin voimakkuudesta, värisävystä ja monista muista:X.head()Viinitietokanta sisältää kolme erilaista viiniä:wine_info.target_names array(, dtype='<U7′)Nyt luodaan DataFrame, joka sisältää sekä piirteet että tietokannan sisällön:df = X.join(pd.Series(y, name=’class’))Voimme jakaa lineaarisen diskriminaatioanalyysin prosessin viiteen vaiheeseen seuraavasti: Vaihe 1 – Luokan sisäisten ja luokkien välisten hajontamatriisien laskeminen.Vaihe 2 – Hajontamatriisien omavektoreiden ja niitä vastaavien ominaissuureiden laskeminen.Vaihe 3 – Ominaissuureiden lajittelu ja parhaiden k:n valitseminen.Vaihe 4 – Uuden matriisin luominen, joka sisältää k:een ominaisarvoon yhdistetyt ominaisvektorit.Vaihe 5 – Uusien ominaisuuksien saaminen ottamalla datan ja vaiheen 4 matriisin pistepotentiaali.Luokan sisäinen hajontamatriisiLaskemaan luokan sisäisen hajontamatriisin voit käyttää seuraavaa matemaattista lauseketta:missä, c = erillisten luokkien kokonaislukumäärä ja missä, x = näyte (eli rivi). n = näytteiden kokonaismäärä tietyn luokan sisällä.Nyt luodaan vektori, jossa on kunkin ominaisuuden keskiarvot:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(’class’):feature_means1 = rows.mean()feature_means1Keskiarvovektorit (mi ) kytketään nyt edellä oleviin yhtälöihin, jotta saadaan luokkien sisäinen hajontamatriisi: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 += sLuokkien välinen hajontamatriisiVoidaan laskea luokkien välinen hajontamatriisi käyttämällä seuraavaa matemaattista lauseketta: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)Nyt ratkaistaan yleistetty itseisarvo-ongelma lineaaristen diskriminantien saamiseksi:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Lajittelemme ominaissuureet suurimmasta pienimpään, koska suurimmat arvot omaavat ominaissuureet kantavat eniten tietoa datan jakaumasta on tehty. Seuraavaksi tarkastelemme ensin k ominaisvektoria. Lopuksi sijoitamme ominaissuureet väliaikaiseen matriisiin varmistaaksemme, että ominaissuureet vastaavat samoja omavektoreita, kun lajittelu on tehty: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.8462952525010022e-16Muutetaan nyt arvot prosenttiluvuiksi, koska on vaikea ymmärtää, kuinka suuren osan varianssista kukin komponentti selittää.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))Selitetty varianssiEigenvektori 0: 0.834825256799387275Eigenvektori 1: 0.1651743200612724Eigenvektori 2: 5.03333396012077518e-17Eigenvektori 3: 4.268399397827047e-17Eigenvektori 4: 4.268399397827047e-17Eigenvektori 5: 2.9108789097898625e-17Eigenvektori 6: 2.49800494906118145e-17Eigenvektori 7: 2.119704204950956e-17Eigenvektori 8: 2.119704204950956e-17Eigenvektori 9: 1.665567688286435e-17Eigenvektori 10: 1.665567688286435e-17Eigenvektori 11: 8.696681541121664e-18Eigenvektori 12: 3.4615924706522496e-18Luotaan ensin uusi matriisi W käyttäen kahta ensimmäistä ominaisvektoria:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realJatkossa tallennamme X:n ja W:n pistetuoton uudeksi matriisiksi Y:Y = X∗Wjossa, X = n x d matriisi, jossa on n näytettä ja d ulottuvuutta. Y = n x k matriisi, jossa on n otosta ja k ulottuvuutta.Yksinkertaistettuna Y on uusi matriisi tai uusi ominaisuusavaruus.X_lda = np.array(X.dot(W_matrix))Seuraavaksi koodaamme jokaiselle luokalle jäsenen, jotta voimme sisällyttää luokkatunnisteet kuvaajaamme. Tämä tehdään, koska matplotlib ei pysty käsittelemään kategorisia muuttujia suoraan.Lopuksi piirrämme datan kahden LDA-komponentin funktiona käyttäen eri väriä jokaiselle luokalle: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>Miten toteutetaan LDA scikit-learnin avulla?Jotta voidaan toteuttaa LDA scikit-learnin avulla, työskennellään saman viinitietokannan kanssa. Voit myös saada sen UCI:n koneoppimisen arkistosta. Voit käyttää scikit-learn-kirjaston käyttöömme antamaa valmiiksi määriteltyä luokkaa LinearDiscriminant Analysis LDA:n toteuttamiseen sen sijaan, että toteuttaisit LDA:n joka kerta tyhjästä:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Kunkin komponenttia vastaavan varianssin saamiseksi saat käyttöösi seuraavan ominaisuuden:lda.explained_variance_ratio_array()Piirretään taas kaksi LDA-komponenttia kuten aiemmin: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>Lineaarinen diskriminaatioanalyysi vs PCABelow are the differences between LDA and PCA:PCA ignores class labels and focuses on finding the principal components that maximizes the variance in a given data. Näin ollen se on valvomaton algoritmi. Toisaalta LDA on valvottu algoritmi, jonka tarkoituksena on löytää lineaariset diskriminanttitekijät, jotka edustavat niitä akseleita, jotka maksimoivat erottelun eri luokkien välillä.LDA suoriutuu usean luokan luokittelutehtävistä paremmin kuin PCA. PCA toimii kuitenkin paremmin, kun otoskoko on suhteellisen pieni. Esimerkkinä voidaan mainita kuvien luokittelussa käytettävien luokittelutarkkuuksien vertailu.Sekä LDA:ta että PCA:ta käytetään dimensionaalisuuden vähentämisessä. PCA:ta käytetään ensin LDA:n jälkeen.Luodaan ja sovitetaan PCA-luokan instanssi:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Jälleen kerran, jotta voimme tarkastella arvoja prosentteina paremman ymmärryksen saamiseksi, käytämme selitetyn varianssin suhde (explained_variance_ratio_) -ominaisuutta:pca.explained_variance_ratio_array()On selvää, että PCA valitsi ne komponentit, jotka pystyvät säilyttämään eniten tietoa, ja jätti huomiotta ne komponentit, jotka maksimoivat luokkien välisen erottelun.plt.xlabel(’PCA1’)plt.ylabel(’PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bNyt luodaksemme luokittelumallin käyttäen LDA-komponentteja ominaisuuksina, jaamme datan harjoittelu- ja testaustietoaineistoihin:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Seuraavaksi luomme päätöspuun. Sitten ennustamme kunkin näytetestin luokan ja luomme sekoitusmatriisin LDA-mallin suorituskyvyn arvioimiseksi:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])On siis selvää, että päätöspuu-luokittelija on luokitellut kaiken testiaineistossa olevan oikein.Mitkä ovat LDA:n laajennukset?LDA:ta pidetään hyvin yksinkertaisena ja tehokkaana menetelmänä erityisesti luokittelutekniikoissa. Koska se on yksinkertainen ja hyvin ymmärretty, niin sillä on paljon laajennuksia ja variaatioita: Quadratic Discriminant Analysis (QDA) – Kun on useita tulomuuttujia, kukin luokka käyttää omaa varianssin ja kovarianssin estimaattia.Flexible Discriminant Analysis (FDA) – Tämä tekniikka suoritetaan, kun käytetään epälineaarista tulomuuttujien yhdistelmää splineina.Regularized Discriminant Analysis(RDA) – Se lieventää eri muuttujien vaikutusta LDA:ssa regularisoimalla kovarianssin estimaatin.LD:n reaaliaikaiset sovelluksetJoitakin LDA:n käytännön sovelluksia on lueteltu seuraavassa: Kasvontunnistus – LDA:ta käytetään kasvontunnistuksessa vähentämään attribuuttien määrää hallittavampaan määrään ennen varsinaista luokittelua. Muodostetut ulottuvuudet ovat pikselien lineaarinen yhdistelmä, joka muodostaa mallin. Näitä kutsutaan Fisherin kasvoiksi.Lääketiede – LDA:n avulla voidaan luokitella potilaan sairaus lieväksi, keskivaikeaksi tai vaikeaksi. Luokittelu tehdään potilaan eri parametrien ja hänen lääketieteellisen kehityskaarensa perusteella. Asiakkaiden tunnistaminen – Voit saada asiakkaiden piirteet suorittamalla yksinkertaisen kysymys-vastaus-kyselyn. LDA auttaa tunnistamaan ja valitsemaan, mikä kuvaa niiden asiakasryhmien ominaisuuksia, jotka todennäköisimmin ostavat tietyn tuotteen ostoskeskuksessa. YhteenvetoKatsotaanpa tässä artikkelissa käsiteltyjä aiheita: Dimensioiden vähentäminen ja LDA:n tarve LDA-mallin työskentely LDA-mallin esittäminen, oppiminen, ennustaminen ja tietojen valmistelu LDA:ssa LDA-mallin toteuttaminen LDA:n toteuttaminen scikit-learnin avulla LDA vs. PCA LDA:n laajennukset ja sovellukset Lineaarinen diskriminaatioanalyysi Pythonissa on hyvin yksinkertainen ja hyvin ymmärretty luokittelun lähestymistapa koneoppimisessa. Vaikka on olemassa muitakin dimensioiden pienentämistekniikoita, kuten logistinen regressio tai PCA, mutta LDA:ta suositaan monissa erityisissä luokittelutapauksissa. Jos haluat olla koneoppimisen asiantuntija, lineaarisen diskriminaatioanalyysin tuntemus vie sinut siihen asemaan vaivattomasti. Ilmoittaudu datatieteen ja koneoppimisen kursseillemme saadaksesi lisää tuottoisia uravaihtoehtoja tässä maisemassa ja tullaksesi sertifioiduksi datatieteilijäksi.