Mi az LDA: Linear Discriminant Analysis for Machine Learning
By Priyankur Sarkar
Linear Discriminant Analysis vagy LDA egy dimenziócsökkentő technika. Ezt előfeldolgozási lépésként használják a gépi tanulásban és a mintaosztályozás alkalmazásaiban. Az LDA célja, hogy a magasabb dimenziós térben lévő jellemzőket egy alacsonyabb dimenziós térre vetítse, hogy elkerülje a dimenzió átkát, valamint csökkentse az erőforrásokat és a dimenziós költségeket. 1936-ban Ronald A. Fisher fejlesztette ki az eredeti technikát, amelyet lineáris diszkriminanciának vagy Fisher diszkriminancia-elemzésnek neveztek el. Az eredeti lineáris diszkriminanciát kétosztályos technikaként írták le. A többosztályos változatot később C.R Rao általánosította Multiple Discriminant Analysis néven. Mindegyiket egyszerűen csak Lineáris diszkriminancia-elemzésnek nevezik. az LDA egy felügyelt osztályozási technika, amelyet a versenyképes gépi tanulási modellek kézműves kidolgozásának részeként tartanak számon. A dimenziócsökkentésnek ezt a kategóriáját olyan területeken használják, mint a képfelismerés és a prediktív elemzés a marketingben.Mi a dimenziócsökkentés?A dimenziócsökkentés technikái fontosak a gépi tanulás, az adatbányászat, a bioinformatika és az információ-visszakeresés alkalmazásaiban. A fő program a redundáns és függő jellemzők eltávolítása az adathalmaz alacsonyabb dimenziójú térbe történő átváltásával.Egyszerűen fogalmazva, csökkentik a dimenziókat (azaz a változókat) egy adott adathalmazban, miközben az adatok nagy részét megtartják.A többdimenziós adatok több olyan jellemzőt tartalmaznak, amelyek egymással korrelálnak. A dimenziócsökkentéssel a többdimenziós adatokat mindössze 2 vagy 3 dimenzióban ábrázolhatja. Ez lehetővé teszi az adatok explicit módon történő bemutatását, amely egy laikus számára is könnyen érthető.Mik a logisztikus regresszió korlátai?A logisztikus regresszió egy egyszerű és hatékony lineáris osztályozási algoritmus. Van azonban néhány hátránya, amelyek alternatív osztályozási algoritmusokhoz, például az LDA-hoz vezettek. A logisztikus regresszió néhány korlátja a következő:Kétosztályos problémák – A logisztikus regressziót hagyományosan kétosztályos és bináris osztályozási problémákra használják. Bár extrapolálható és használható többosztályos osztályozásra, ezt ritkán végzik el. Másrészt a Lineáris diszkriminancia-elemzést jobb választásnak tartják, ha többosztályos osztályozásra van szükség, és bináris osztályozások esetén mind a logisztikus regressziót, mind az LDA-t alkalmazzák. instabil jól elkülönített osztályok esetén – A logisztikus regressziónak hiányozhat a stabilitása, ha az osztályok jól elkülönítettek. Itt jön be az LDA.Instabil kevés példával – Ha kevés példa van, amelyből a paramétereket meg kell becsülni, a logisztikus regresszió instabillá válik. A lineáris diszkriminancia-elemzés azonban jobb választás, mert még ilyen esetekben is hajlamos stabilnak lenni.Hogyan lehet egy LDA-modell gyakorlati megközelítése?Tekintsünk egy olyan helyzetet, amelyben két változó közötti kapcsolatot ábrázoltunk, ahol minden szín egy másik osztályt jelöl. Az egyiket piros színnel, a másikat kékkel ábrázoljuk. ha hajlandó a dimenziók számát 1-re csökkenteni, akkor egyszerűen mindent az x-tengelyre vetíthetünk, ahogy az alábbiakban látható: Ez a megközelítés elhanyagolja a második jellemző által nyújtott hasznos információkat. Az LDA-t azonban használhatja az ábrázoláshoz. Az LDA előnye, hogy mindkét jellemzőből származó információt felhasználja egy új tengely létrehozásához, ami viszont minimalizálja a varianciát és maximalizálja a két változó osztálytávolságát.Hogyan működik az LDA?Az LDA elsősorban arra összpontosít, hogy a magasabb dimenziós térben lévő jellemzőket alacsonyabb dimenziókra vetítse. Ezt három lépésben érheti el:Először is ki kell számítani az osztályok közötti szeparálhatóságot, amely a különböző osztályok átlagának távolsága. Ezt nevezzük osztályok közötti varianciának.Másodszor, kiszámítjuk az egyes osztályok átlaga és mintája közötti távolságot. Ezt szintén osztályon belüli varianciának nevezzük.Végül konstruáljuk meg azt az alacsonyabb dimenziós teret, amely maximalizálja az osztályok közötti varianciát és minimalizálja az osztályon belüli varianciát. A P-t tekintjük az alacsonyabb dimenziós tér vetületének, más néven Fisher-kritériumnak.Hogyan reprezentálják az LDA-modelleket?Az LDA reprezentációja meglehetősen egyszerű. A modell az adatok statisztikai tulajdonságaiból áll, amelyeket minden egyes osztályra kiszámítottunk. Több változó esetén ugyanezeket a tulajdonságokat a többváltozós Gaussra számítják ki. A multivariánsok az átlagok és a kovariátummátrix. a predikciókat a statisztikai tulajdonságok LDA-egyenletbe történő megadásával készítjük el. A tulajdonságok becslése az adatokból történik. Végül a modell értékeit az LDA-modell létrehozásához fájlba mentjük.Hogyan tanulnak az LDA-modellek?Az LDA-modell által az Ön adatairól tett feltételezések:Az adatok minden egyes változója haranggörbe alakú, ha ábrázoljuk, azaz Gauss-alakú.Az egyes változók értékei átlagosan ugyanolyan mértékben változnak az átlag körül, azaz minden tulajdonságnak azonos a szórása.Az LDA-modell ezen feltételezések segítségével képes az Ön adataiból az egyes osztályokra vonatkozó átlagot és szórást becsülni.Az egyes bemeneti értékek átlagértéke az egyes osztályokra úgy számítható ki, hogy az értékek összegét elosztjuk az értékek teljes számával: Mean =Sum(x)/Nkamelyben Mean = az x átlagos értéke az osztályra N = az osztályok száma k = a Sum(x) = az egyes bemeneti x értékek összege.A varianciát az összes osztályra vonatkozóan az egyes értékek átlagtól való eltérése négyzetének átlagaként számítjuk ki:Σ²=Sum((x – M)²)/(N – k)ahol Σ² = variancia az összes x bemenetre vonatkozóan. N = az esetek száma. k = az osztályok száma. Sum((x – M)²) = az összes (x – M)² értékek összege. M = az x bemenet átlaga.Hogyan készít előrejelzéseket az LDA modell?Az LDA modellek a Bayes-tételt használják a valószínűségek becslésére. Előrejelzéseket készítenek annak valószínűsége alapján, hogy egy új bemeneti adathalmaz az egyes osztályokba tartozik. A legnagyobb valószínűséggel rendelkező osztályt tekintjük kimeneti osztálynak, majd az LDA előrejelzést készít. Az előrejelzés egyszerűen a Bayes-tétel alkalmazásával történik, amely megbecsüli a kimeneti osztály valószínűségét a bemeneti adatok alapján. Az egyes osztályok valószínűségét és az egyes osztályokhoz tartozó adatok valószínűségét is felhasználják: P(Y=x|X=x) = / ahol x = bemenet. k = kimeneti osztály. Plk = Nk/n vagy a képzési adatokban megfigyelt egyes osztályok alapvalószínűsége. A Bayes-tételben előzetes valószínűségnek is nevezik. fk(x) = az x k osztályba tartozásának becsült valószínűsége.Az f(x)-et egy Gauss-eloszlás függvény segítségével ábrázoljuk, majd beillesztjük a fenti egyenletbe, és a következő egyenletet kapjuk: Dk(x) = x∗(átlag/Σ²) – (átlag²/(2*Σ²)). + ln(PIk)A Dk(x) a k osztály diszkriminanciafüggvényének nevezzük adott x bemenet, az átlag, Σ² és Plk mind az adatokból becsült, és az az osztály, amelyik a legnagyobb értékkel számol, figyelembe lesz véve a kimeneti osztályozásban. Hogyan készítsük elő az adatokat az LDA-ból?Néhány javaslat, amelyet szem előtt kell tartania az adatok előkészítése során az LDA-modell felépítéséhez: Az LDA-t elsősorban olyan osztályozási problémákban használják, ahol kategorikus kimeneti változóval rendelkezik. Lehetővé teszi mind a bináris osztályozást, mind a többosztályos osztályozást.A standard LDA modell a bemeneti változók Gauss-eloszlását használja. Ellenőriznie kell az egyes attribútumok egyváltozós eloszlásait, és át kell alakítania őket egy Gauss-szerű eloszlássá. Például exponenciális eloszlás esetén használjon log és gyök függvényt, ferde eloszlások esetén pedig BoxCox-ot. a kiugró értékek elferdíthetik az LDA-ban az osztályok elkülönítésére használt primitív statisztikákat, ezért célszerű ezeket eltávolítani. mivel az LDA feltételezi, hogy minden bemeneti változó azonos szórással rendelkezik, az LDA modell használata előtt mindig jobb, ha standardizáljuk az adatokat. Az átlag legyen 0, a szórás pedig 1.Hogyan lehet LDA-modellt a semmiből implementálni?Lineáris diszkriminancia-elemzési modellt a semmiből implementálhat a Python segítségével. Kezdjük a modellhez szükséges könyvtárak importálásával: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_matrixMivel a wine adatkészlettel fogunk dolgozni, azt az UCI machine learning repository-ból szerezhetjük be. A scikit-learn könyvtár Pythonban biztosít egy wrapper függvényt a letöltéshez: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)A bor adatállomány 178 sorból áll, amelyek egyenként 13 oszlopból állnak:X.shape(178, 13)A boradatkészlet attribútumai különböző jellemzőkből állnak, mint például a bor alkoholtartalma, magnéziumtartalom, színintenzitás, színárnyalat és még sok más:X.head()A boradatkészlet három különböző borfajtát tartalmaz:wine_info.target_names array(, dtype='<U7′)Most létrehozunk egy DataFrame-et, amely tartalmazza az adatkészlet jellemzőit és tartalmát is:df = X.join(pd.Series(y, name=’class’))A lineáris diszkriminancia-elemzés folyamatát 5 lépésre oszthatjuk a következőképpen:1. lépés – Az osztályon belüli és osztályok közötti szórásmátrixok kiszámítása.2. lépés – A szórásmátrixok sajátvektorainak és a hozzájuk tartozó sajátértékeknek a kiszámítása.3. lépés – A sajátértékek rendezése és a legjobb k kiválasztása.4. lépés – Egy új mátrix létrehozása, amely a k sajátértékhez rendelt sajátvektorokat tartalmazza.5. lépés – Új jellemzők kinyerése az adatok és a 4. lépésből származó mátrix pontszorzatával.Osztályon belüli szórásmátrixAz osztályon belüli szórásmátrix kiszámításához a következő matematikai kifejezést használhatja:ahol, c = a különálló osztályok teljes száma éshol, x = egy minta (azaz egy sor). n = a minták teljes száma egy adott osztályon belül.Most létrehozunk egy vektort az egyes jellemzők átlagértékeivel:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‘class’):feature_means1 = rows.mean()feature_means1Az átlagvektorokat (mi ) most beillesztjük a fenti egyenletekbe, hogy megkapjuk az osztályon belüli szórásmátrixot: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 += sBetween-class scatter matrixAz osztályok közötti szórásmátrixot a következő matematikai kifejezéssel tudjuk kiszámítani:ahol,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)Most megoldjuk az általánosított sajátérték problémát, hogy megkapjuk a lineáris diszkriminánsokat:saját_értékek, saját_vektorok = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))A sajátértékeket a legmagasabbtól a legalacsonyabb felé fogjuk rendezni, mivel a legmagasabb értékű sajátértékek hordozzák a legtöbb információt az adatok eloszlásáról történik. Ezután először k sajátvektorokat fogunk. Végül a sajátértékeket egy ideiglenes tömbben helyezzük el, hogy a rendezés után a sajátértékek azonos sajátvektorokra vonatkozzanak: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-16Most átalakítjuk az értékeket százalékos értékekké, mivel nehéz megérteni, hogy a variancia mekkora részét magyarázzák az egyes komponensek.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))Explained VarianceEigenvektor 0: 0.834825256799387275Eigenvektor 1: 0.1651743200612724Eigenvektor 2: 5.033396012077518e-17Eigenvektor 3: 4.268399397827047e-17Eigenvektor 4: 4.268399397827047e-17Eigenvektor 5: 2.9108789097898625e-17Eigenvektor 6: 2.49800494906118145e-17Eigenvektor 7: 2.119704204950956e-17Eigenvektor 8: 2.119704204950956e-17Eigenvektor 9: 1.665567688286435e-17Eigenvektor 10: 1.665567688286435e-17Eigenvektor 11: 8.696681541121664e-18Eigenvektor 12: 3.461592424706522496e-18Először is létrehozunk egy új W mátrixot az első két sajátvektor felhasználásával:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realMásodik lépésként X és W pontszorzatát elmentjük egy új Y mátrixba:Y = X∗Wamelyben, X = n x d mátrix n mintával és d dimenzióval. Y = n x k mátrix n mintával és k dimenzióval.Leegyszerűsítve, Y az új mátrix vagy az új jellemzőtér.X_lda = np.array(X.dot(W_matrix))A következő munkánk az, hogy minden osztály egy tagját kódoljuk, hogy az osztálycímkéket beépítsük a grafikonunkba. Ezt azért végezzük el, mert a matplotlib nem tudja közvetlenül kezelni a kategorikus változókat.végül ábrázoljuk az adatokat a két LDA komponens függvényében, minden osztályhoz más-más színt használva: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>Hogyan lehet az LDA-t scikit-learn segítségével megvalósítani?Az LDA scikit-learn segítségével történő megvalósításához dolgozzunk ugyanazzal a boros adathalmazzal. Ezt az UCI machine learning repository-ból is beszerezhetjük. A scikit-learn könyvtár által rendelkezésünkre bocsátott előre definiált LinearDiscriminant Analysis osztályt használhatjuk az LDA implementálásához ahelyett, hogy minden alkalommal a semmiből implementálnánk:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Az egyes komponenseknek megfelelő varianciát a következő tulajdonsághoz juthatunk:lda.explained_variance_ratio_array()Ismét a két LDA-komponenst ábrázoljuk, ahogy korábban is tettük: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áris diszkriminancia analízis vs PCABa következők a különbségek az LDA és a PCA között:A PCA figyelmen kívül hagyja az osztálycímkéket, és az adott adatokban a varianciát maximalizáló főkomponensek megtalálására összpontosít. Így ez egy felügyelet nélküli algoritmus. Másrészt az LDA egy felügyelt algoritmus, amelynek célja, hogy megtalálja azokat a lineáris diszkriminánsokat, amelyek azokat a tengelyeket képviselik, amelyek maximalizálják a különböző osztályok közötti elkülönítést.Az LDA jobban teljesíti a többosztályos osztályozási feladatokat, mint a PCA. A PCA azonban jobban teljesít, ha a minta mérete viszonylag kicsi. Példa erre a képosztályozásban használt osztályozási pontosságok összehasonlítása.Mind az LDA-t, mind a PCA-t használják dimenziócsökkentés esetén. A PCA-t először az LDA követi.Hozzunk létre és illesszük be a PCA osztály egy példányát:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Ismét, hogy a jobb megértés érdekében százalékban nézzük az értékeket, hozzáférünk a explained_variance_ratio_ tulajdonsághoz:pca.explained_variance_ratio_array()Nyilvánvaló, hogy a PCA kiválasztotta azokat a komponenseket, amelyek a legtöbb információt képesek megtartani, és figyelmen kívül hagyja azokat, amelyek maximalizálják az osztályok közötti elkülönülést.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bAz LDA komponenseket jellemzőként használó osztályozási modell létrehozásához most az adatokat képzési és tesztelési adathalmazokra osztjuk:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)A következő lépés egy döntési fa létrehozása. Ezután megjósoljuk az egyes mintatesztek kategóriáját, és létrehozunk egy zavarmátrixot az LDA modell teljesítményének értékeléséhez:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , , ])Tehát egyértelmű, hogy a Decision Tree Classifier mindent helyesen osztályozott a tesztadathalmazban.Mik az LDA kiterjesztései?Az LDA-t nagyon egyszerű és hatékony módszernek tartják, különösen az osztályozási technikák esetében. Mivel egyszerű és jól érthető, ezért sok kiterjesztése és változata van:Quadratic Discriminant Analysis(QDA) – Amikor több bemeneti változó van, minden osztály saját variancia és kovariancia becslést használ.Flexible Discriminant Analysis(FDA) – Ezt a technikát akkor végzik, amikor a bemenetek nemlineáris kombinációját spline-ként használják.Regularized Discriminant Analysis(RDA) – A különböző változók hatását mérsékli az LDA-ban a kovariancia becslésének regularizálásával.Az LD valós alkalmazásaiAz LDA néhány gyakorlati alkalmazása az alábbiakban szerepel:Arcfelismerés – Az LDA-t az arcfelismerés során arra használják, hogy az attribútumok számát a tényleges osztályozás előtt kezelhetőbbre csökkentsék. A generált dimenziók a pixelek lineáris kombinációja, amely egy sablont alkot. Ezeket Fisher-arcoknak nevezik. orvosi – Az LDA-t használhatja a beteg betegségének enyhe, közepes vagy súlyos osztályozására. Az osztályozás a beteg különböző paraméterei és orvosi pályája alapján történik. Ügyfelek azonosítása – Egy egyszerű kérdés-válasz felmérés elvégzésével megkaphatja az ügyfelek jellemzőit. Az LDA segít az azonosításban és a kiválasztásban, amely leírja az ügyfelek azon csoportjának tulajdonságait, akik a legnagyobb valószínűséggel vásárolnak egy adott terméket egy bevásárlóközpontban. ÖsszefoglalásNézzük meg az ebben a cikkben tárgyalt témákat: Dimenzionalitáscsökkentés és az LDA szükségessége Egy LDA-modell működése Reprezentáció, tanulás, előrejelzés és az adatok előkészítése az LDA-ban Egy LDA-modell végrehajtása Az LDA végrehajtása a scikit-learn használatával LDA vs PCA Az LDA kiterjesztései és alkalmazásai Az LDA lineáris diszkriminanciaelemzése Pythonban egy nagyon egyszerű és jól érthető megközelítés a gépi tanulásban történő osztályozáshoz. Bár léteznek más dimenziócsökkentő technikák is, mint a logisztikus regresszió vagy a PCA, de az LDA-t számos speciális osztályozási esetben előnyben részesítik. Ha szakértő szeretne lenni a gépi tanulásban, a Lineáris diszkriminancia-analízis ismerete könnyedén elvezetheti Önt ebbe a pozícióba. Jelentkezzen be adattudományi és gépi tanulási tanfolyamainkra, hogy még több jövedelmező karrierlehetőséget találjon ezen a területen, és váljon tanúsított adattudóssá.