Végleges útmutató a hierarchikus klaszterezéshez Python és Scikit-Learn PlatoBlockchain adatintelligenciával. Függőleges keresés. Ai.

Végleges útmutató a hierarchikus klaszterezéshez Python és Scikit-Learn segítségével

Bevezetés

Ebben az útmutatóban a megvalósításra összpontosítunk Hierarchikus klaszterezési algoritmus a Scikit-Learn segítségével marketingprobléma megoldására.

Az útmutató elolvasása után meg fogja érteni:

  • Mikor kell alkalmazni a hierarchikus klaszterezést
  • Az adatkészlet vizualizálása annak megértéséhez, hogy alkalmas-e a fürtözésre
  • A szolgáltatások előfeldolgozása és új funkciók tervezése az adatkészlet alapján
  • Hogyan csökkenthető az adatkészlet dimenziója PCA segítségével
  • A dendrogram használata és olvasása csoportok elkülönítésére
  • Melyek a dendrogramokra és klaszterezési algoritmusokra alkalmazott különböző összekapcsolási módszerek és távolságmérők?
  • Melyek az agglomeratív és megosztó klaszterezési stratégiák és hogyan működnek
  • Az agglomeratív hierarchikus klaszterezés megvalósítása a Scikit-Learn segítségével
  • Melyek a leggyakoribb problémák a klaszterezési algoritmusok kezelésekor, és hogyan lehet ezeket megoldani?

Jegyzet: Letöltheti az ebben az útmutatóban található összes kódot tartalmazó notebookot itt.

Motiváció

Képzeljen el egy olyan forgatókönyvet, amelyben Ön egy olyan adattudományi csapat tagja, amely kapcsolatban áll a marketingosztállyal. A marketing egy ideje gyűjti az ügyfelek vásárlási adatait, és az összegyűjtött adatok alapján szeretné megérteni, hogy vannak-e hasonlóságok az ügyfelek között. Ezek a hasonlóságok csoportokra osztják az ügyfeleket, és az ügyfélcsoportok létrehozása segít a kampányok, promóciók, konverziók célzásában és jobb ügyfélkapcsolatok kialakításában.

Van mód arra, hogy segítsen megállapítani, hogy mely ügyfelek hasonlóak? Hányan tartoznak közülük ugyanabba a csoportba? És hány különböző csoport van?

A kérdések megválaszolásának egyik módja az a csoportosítás algoritmusok, mint például a K-Means, DBSCAN, Hierarchical Clustering stb. Általánosságban elmondható, hogy a klaszterező algoritmusok hasonlóságokat találnak az adatpontok között, és csoportosítják azokat.

Ebben az esetben a marketing adataink meglehetősen kicsik. Mindössze 200 vásárlóról rendelkezünk információval. A marketing csapatot tekintve fontos, hogy világosan el tudjuk nekik magyarázni, hogyan születtek a klaszterek száma alapján a döntések, így elmagyarázzuk nekik az algoritmus tényleges működését.

Mivel adataink kicsik, és a megmagyarázhatóság fontos tényező, kihasználhatjuk Hierarchikus klaszterezés hogy megoldja ezt a problémát. Ezt a folyamatot más néven Hierarchikus klaszterezési elemzés (HCA).

A HCA egyik előnye, hogy értelmezhető és jól működik kis adathalmazokon.

Egy másik dolog, amit figyelembe kell venni ebben a forgatókönyvben, hogy a HCA egy felügyelet nélkül algoritmus. Az adatok csoportosítása során nem lesz módunk ellenőrizni, hogy helyesen azonosítjuk-e, hogy egy felhasználó egy adott csoporthoz tartozik (nem ismerjük a csoportokat). Nincsenek címkék, amelyekkel összehasonlíthatnánk eredményeinket. Ha helyesen azonosítottuk a csoportokat, azt később a marketing osztály napi szinten megerősíti (például ROI, konverziós arányok stb. alapján).

Most, hogy megértettük a megoldani kívánt problémát és a megoldás módját, elkezdhetjük áttekinteni adatainkat!

Rövid feltáró adatelemzés

Jegyzet: Letöltheti az ebben az útmutatóban használt adatkészletet itt.

Az adatkészlet letöltése után vegye észre, hogy a CSV (vesszővel elválasztott értékek) nevű fájl shopping-data.csv. Az adatok feltárásának és kezelésének megkönnyítése érdekében betöltjük azokat a DataFrame Panda használatával:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

A marketing azt mondta, hogy 200 ügyfélrekordot gyűjtöttek össze. A letöltött adatok teljességét 200 sorral ellenőrizhetjük a segítségével shape tulajdonság. Megmondja, hány sorunk és oszlopunk van:

customer_data.shape

Ennek eredményeként:

(200, 5)

Nagy! Adataink 200 sorral teljesek (ügyfélrekordok) és van 5 oszlopunk is (jellemzők). Annak megtekintéséhez, hogy a marketing osztály milyen jellemzőket gyűjtött össze az ügyfelektől, láthatjuk az oszlopneveket a columns tulajdonság. Ehhez hajtsa végre:

customer_data.columns

A fenti szkript visszaadja:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

Itt azt látjuk, hogy a marketing generált a CustomerID, összegyűjtötte a Genre, Age, Annual Income (több ezer dollárban), és a Spending Score 1-ről 100-ra megy a 200 ügyfél mindegyikére. Felvilágosítást kérve azt mondták, hogy az értékek a Spending Score Az oszlop azt jelzi, hogy egy személy milyen gyakran költ pénzt egy bevásárlóközpontban egy 1-től 100-ig terjedő skálán. Más szóval, ha egy vásárló pontszáma 0, akkor soha nem költ pénzt, és ha a pontszám 100, akkor az imént észleltük a a legtöbbet költő.

Vessünk egy gyors pillantást ennek a pontszámnak az eloszlására, hogy megvizsgáljuk az adatkészletünkben szereplő felhasználók költési szokásait. Ott vannak a pandák hist() módszer jön segítségül:

customer_data['Spending Score (1-100)'].hist()

img

Ha megnézzük a hisztogramot, azt látjuk, hogy több mint 35 ügyfél között van a pontszám 40 és a 60, akkor 25-nél kevesebb pontszám van között 70 és a 80. Így a legtöbb ügyfelünk az kiegyensúlyozott költekezők, ezt követik a mérsékelten vagy magasan költők. Azt is láthatjuk, hogy utána van egy sor 0, az eloszlástól balra, és egy másik sor a 100 előtt, az eloszlástól jobbra. Ezek az üres szóközök valószínűleg azt jelentik, hogy a disztribúció nem tartalmaz nem költőket, amelyek pontszáma: 0, és hogy nincsenek is magas költekezők a pontszámmal 100.

Annak ellenőrzésére, hogy ez igaz-e, megnézhetjük az eloszlás minimális és maximális értékét. Ezek az értékek könnyen megtalálhatók a leíró statisztikák részeként, így használhatjuk a describe() módszer más numerikus értékek eloszlásának megértéséhez:


customer_data.describe().transpose()

Ez egy táblázatot ad nekünk, ahonnan leolvashatjuk adatkészletünk egyéb értékeinek eloszlását:

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

Hipotézisünk beigazolódik. Az min a Spending Score is 1 és a max 99. Szóval nekünk nincs 0 or 100 pontszámot költők. Ezután vessünk egy pillantást a transzponált többi oszlopára describe asztal. Amikor megnézi a mean és a std oszlopok esetén ezt láthatjuk Age a mean is 38.85 és a std megközelítőleg 13.97. Ugyanez történik a Annual Income, Egy mean of 60.56 és a std 26.26, Valamint a Spending Score val,-vel mean of 50 és a std of 25.82. Minden funkcióhoz a mean messze van a szórástól, ami azt jelzi adataink nagy változékonyságúak.

Ahhoz, hogy jobban megértsük, hogyan változnak adataink, ábrázoljuk a Annual Income terjesztés:

customer_data['Annual Income (k$)'].hist()

Ami ad nekünk:

img

Figyeljük meg a hisztogramon, hogy adataink nagy része, több mint 35 ügyfél a szám közelében összpontosul 60, miénken mean, a vízszintes tengelyen. De mi történik, amikor a disztribúció vége felé haladunk? Ha balra haladunk, a 60.560 34.300 dolláros átlagtól a következő érték 60.560 26.260 dollár – az átlag (26.260 34.300 dollár) mínusz a standard eltérés (8.040 60 dollár) lesz. Ha távolabb megyünk az adateloszlástól balra, hasonló szabály érvényesül, az aktuális értékből (8 26.260 USD) kivonjuk a standard variációt (XNUMX XNUMX USD). Ezért XNUMX USD értékkel találkozunk. Figyelje meg, hogyan változtak adataink gyorsan XNUMX XNUMX dollárról XNUMX XNUMX dollárra. Ez minden alkalommal XNUMX dollárt „ugrik” – nagyon változó, és ezért van ilyen nagy a variabilitásunk.

img

Az adatok változékonysága és mérete fontos a klaszterezési elemzésben, mivel a legtöbb klaszterező algoritmus távolságmérései érzékenyek az adatok nagyságára. A méretbeli különbség megváltoztathatja a klaszterezési eredményeket azáltal, hogy egy pont közelebbinek vagy távolabbinak tűnik egy másikhoz, mint amilyen valójában, így torzítja az adatok tényleges csoportosítását.

Eddig láthattuk adataink alakját, néhány eloszlását és leíró statisztikákat. A Pandákkal listázhatjuk adattípusainkat is, és megnézhetjük, hogy mind a 200 sorunk ki van-e töltve, vagy null értékek:

customer_data.info()

Ennek eredményeként:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

Itt láthatjuk, hogy nincsenek null értékek az adatokban, és hogy csak egy kategorikus oszlopunk van – Genre. Ebben a szakaszban fontos, hogy szem előtt tartsuk, milyen érdekességeknek tűnik hozzáadni a klaszterezési modellt. Ha hozzá akarjuk adni a Genre oszlopot a modellünkhöz, akkor az értékeit át kell alakítanunk kategorikus nak nek számszerű.

Lássuk, hogyan Genre úgy töltjük ki, hogy gyorsan megnézzük adataink első 5 értékét:

customer_data.head() 

Ennek eredményeként:

    CustomerID 	Genre 	Age 	Annual Income (k$) 	Spending Score (1-100)
0 	1 			Male 	19 		15 					39
1 	2 			Male 	21 		15 					81
2 	3 			Female 	20 		16 					6
3 	4 			Female 	23 		16 					77
4 	5 			Female 	31 		17 					40

Úgy tűnik, hogy csak Female és a Male kategóriákat. Ebben megbizonyosodhatunk, ha egy pillantást vetünk egyedi értékeire unique:

customer_data['Genre'].unique()

Ez megerősíti feltételezésünket:

array(['Male', 'Female'], dtype=object)

Eddig úgy tudjuk, hogy csak két műfajunk van, ha ezt a funkciót tervezzük használni a modellünkön, Male át lehetne alakítani 0 és a Female nak nek 1. Fontos a műfajok közötti arányok ellenőrzése is, hogy kiegyensúlyozottak-e. Ezt megtehetjük a value_counts() módszer és érve normalize=True közötti százalékos arányt mutatni Male és a Female:

customer_data['Genre'].value_counts(normalize=True)

Ez a következő kimenetet adja:

Female    0.56
Male      0.44
Name: Genre, dtype: float64

Az adathalmazban a nők 56%-a, a férfiak 44%-a szerepel. A különbség köztük mindössze 16%, és a mi adataink nem 50/50, hanem igen elég kiegyensúlyozott hogy ne okozzon gondot. Ha az eredmények 70/30, 60/40 lettek volna, akkor vagy több adatot kellett volna gyűjteni, vagy valamilyen adatkiegészítési technikát alkalmazni, hogy ez az arány kiegyensúlyozottabb legyen.

Eddig minden funkció, de Age, röviden megvizsgálták. Milyen vonatkozásban Age, általában érdekes kukákra osztani, hogy a vásárlókat korosztályuk alapján szegmentálhassuk. Ha ezt tesszük, akkor a korosztályokat egyetlen számmá kell átalakítanunk, mielőtt hozzáadnánk őket a modellünkhöz. Így a 15-20 év kategória használata helyett azt számolnánk, hogy hány vásárló van a 15-20 kategória, és ez egy szám lenne egy új oszlopban 15-20.

Útmutatás: Ebben az útmutatóban csak egy rövid feltáró adatelemzést mutatunk be. De tovább lehet menni, és tovább kell mennie. Megnézheti, hogy vannak-e jövedelmi és pontozási különbségek műfaj és életkor alapján. Ez nem csak gazdagítja az elemzést, hanem jobb modelleredményekhez vezet. Ha mélyebben szeretne belemenni a feltáró adatelemzésbe, tekintse meg a EDA fejezet a „Gyakorlati lakásár-előrejelzés – gépi tanulás Pythonban" Irányított projekt.

Miután sejtettem, mit lehetne tenni kategorikus – vagy kategorikus lenni – mellett Genre és a Age hasábjain, alkalmazzuk a tárgyaltakat.

Változók kódolása és jellemzők tervezése

Kezdjük azzal, hogy elosztjuk a Age 10-ben változó csoportokba, hogy legyen 20-30, 30-40, 40-50 stb. Mivel a legfiatalabb ügyfelünk 15 éves, 15 évesen kezdhetjük és 70 évesen fejezhetjük be, ami az adatokban szereplő legidősebb ügyfél életkora. 15-től kezdődően és 70-nél végződve 15-20, 20-30, 30-40, 40-50, 50-60 és 60-70 közötti intervallumunk lenne.

Csoportosításhoz ill tartó Age értékeket ezekbe az intervallumokba, használhatjuk a Pandákat cut() módszerrel vágja őket rekeszekbe, majd rendelje hozzá őket egy újhoz Age Groups oszlop:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

Ennek eredményeként:

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

Figyeljük meg, hogy az oszlopértékek megtekintésekor van egy sor is, amely megadja, hogy 6 kategóriánk van, és megjeleníti az összes bindált adatintervallumot. Így kategorizáltuk a korábban számszerűsített adatainkat, és létrehoztunk egy újat Age Groups funkciót.

És hány vásárlónk van az egyes kategóriákban? Ezt gyorsan megtudhatjuk, ha csoportosítjuk az oszlopot és megszámoljuk az értékeket -val groupby() és a count():

customer_data.groupby('Age Groups')['Age Groups'].count()

Ennek eredményeként:

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

Könnyen észrevehető, hogy a legtöbb ügyfél 30 és 40 év közötti, ezt követik a 20 és 30 év közöttiek, majd a 40 és 50 év közötti ügyfelek. Ez is jó információ a marketing osztály számára.

Jelenleg két kategorikus változónk van, Age és a Genre, amelyeket számokká kell alakítanunk, hogy felhasználhassuk a modellünkben. Ennek az átalakításnak számos különböző módja van – mi a Pandákat fogjuk használni get_dummies() metódus, amely minden intervallumhoz és műfajhoz új oszlopot hoz létre, majd az értékeit kitölti 0-val és 1-gyel – ezt a fajta műveletet ún. one-hot kódolás. Lássuk, hogyan is néz ki:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

Ez ad egy előnézetet az eredményül kapott táblázatról:

img

A kimenettel könnyen belátható, hogy az oszlop Genre oszlopokra volt osztva - Genre_Female és a Genre_Male. Amikor az ügyfél nő, Genre_Female egyenlő 1, és ha az ügyfél férfi, akkor ez megegyezik 0.

Továbbá, a Age Groups oszlopot 6 oszlopra osztották, minden intervallumhoz egyet, mint pl Age Groups_(15, 20], Age Groups_(20, 30], stb. Ugyanúgy, mint Genre, ha az ügyfél 18 éves, a Age Groups_(15, 20] érték az 1 és az összes többi oszlop értéke 0.

A előny A one-hot kódolás egyszerűsége az oszlopértékek megjelenítésében, így könnyen megérthető, hogy mi történik – miközben a hátrány Az, hogy most 8 további oszlopot hoztunk létre, összefoglalva a már meglévő oszlopokkal.

figyelmeztetés: Ha olyan adatkészlettel rendelkezik, amelyben az egy gyors kódolású oszlopok száma meghaladja a sorok számát, a legjobb, ha más kódolási módszert alkalmaz az adatdimenziós problémák elkerülése érdekében.

A One-hot kódolás 0-kat is hozzáad az adatainkhoz, így azok ritkábbak lesznek, ami problémát jelenthet néhány adatritkulásra érzékeny algoritmusnál.

A mi fürtözési igényeinknek megfelelően az one-hot kódolás működik. De megrajzolhatjuk az adatokat, hogy megnézzük, valóban vannak-e külön csoportok, amelyeket csoportosíthatunk.

Alapvető ábrázolás és dimenziócsökkentés

Adatkészletünk 11 oszlopból áll, és van néhány mód az adatok megjelenítésére. Az első a 10 dimenziós ábrázolás (sok sikert ehhez). Tíz mert a Customer_ID oszlopot nem vesszük figyelembe. A második a kezdeti numerikus jellemzőink ábrázolása, a harmadik pedig a 10 jellemzőnk 2-re való transzformálása – tehát a méretcsökkentés végrehajtása.

Minden adatpár ábrázolása

Mivel a 10 dimenzió ábrázolása kissé lehetetlen, a második megközelítést választjuk – a kezdeti jellemzőinket ábrázoljuk. Ezek közül kettőt választhatunk klaszterezési elemzésünkhöz. Az egyik módja annak, hogy az összes adatpárunkat kombinálva láthassuk, a Seaborn pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

Melyik jelenik meg:

img

Egy pillantással észrevehetjük azokat a szóródási diagramokat, amelyek adatcsoportokat tartalmaznak. Érdekesnek tűnik az a szóródás, amely egyesíti Annual Income és a Spending Score. Figyeljük meg, hogy nincs egyértelmű elválasztás a többi változó szórásdiagram között. Legfeljebb azt mondhatjuk, hogy a pontoknak két különálló koncentrációja van a Spending Score vs Age szórásdiagram.

Mindkét szóródási diagram, amely a Annual Income és a Spending Score lényegében azonosak. Kétszer láthatjuk, mert az x és az y tengely felcserélődött. Ha megnézzük bármelyiket, láthatjuk, hogy öt különböző csoportról van szó. Ábrázoljuk csak ezt a két tulajdonságot egy Seabornnal scatterplot() hogy jobban megnézzük:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

img

Közelebbről nézve határozottan 5 különböző adatcsoportot különböztethetünk meg. Úgy tűnik, ügyfeleink csoportosíthatók az alapján, hogy mennyit keresnek egy évben, és mennyit költenek. Ez egy másik releváns pont elemzésünkben. Fontos, hogy ügyfeleink csoportosításánál csak két jellemzőt vegyünk figyelembe. Bármilyen más információnk, amivel kapcsolatban rendelkezünk, nem szerepel az egyenletben. Ez adja az elemzés jelentését – ha tudjuk, mennyit keres és költ az ügyfél, könnyen megtalálhatjuk a szükséges hasonlóságokat.

img

Nagyszerű! Eddig már két változónk van a modellünk elkészítéséhez. Amellett, hogy ez mit jelent, egyszerűbbé, szűkszavúbbá és magyarázhatóbbá teszi a modellt.

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

Jegyzet: Az adattudomány általában a lehető legegyszerűbb megközelítéseket részesíti előnyben. Nem csak azért, mert könnyebb elmagyarázni a vállalkozás számára, hanem azért is, mert közvetlenebb – 2 funkcióval és egy magyarázható modellel jól látható, hogy mit csinál és hogyan működik a modell.

Adatok ábrázolása PCA használata után

Úgy tűnik, a második megközelítésünk a legjobb, de vessünk egy pillantást a harmadik megközelítésünkre is. Hasznos lehet, ha nem tudjuk ábrázolni az adatokat, mert túl sok dimenziója van, vagy ha nincs adatkoncentráció vagy egyértelmű elválasztás a csoportokban. Amikor ezek a helyzetek előfordulnak, javasoljuk, hogy próbálja meg csökkenteni az adatdimenziókat a megnevezett módszerrel Fő komponens elemzés (PCA).

Jegyzet: A legtöbb ember PCA-t használ a méretcsökkentésre a megjelenítés előtt. Vannak más módszerek is, amelyek segítenek a fürtözés előtti adatvizualizációban, mint pl Zajjal rendelkező alkalmazások sűrűség alapú térbeli klaszterezése (DBSCAN) és a Önszerveződő térképek (SOM) klaszterezés. Mindkettő klaszterező algoritmus, de adatvizualizációra is használható. Mivel a klaszteranalízisnek nincs aranyszabványa, fontos a különböző vizualizációk és különböző algoritmusok összehasonlítása.

A PCA csökkenti adataink méretét, miközben megpróbálja megőrizni a lehető legtöbb információt. Először kapjunk képet a PCA működéséről, majd kiválaszthatjuk, hogy hány adatdimenzióra csökkentsük le adatainkat.

A PCA minden egyes jellemzőpár esetében megvizsgálja, hogy az egyik változó nagyobb értékei megfelelnek-e a másik változó nagyobb értékeinek, és ugyanezt teszi a kisebb értékeknél. Tehát lényegében azt számolja ki, hogy a jellemzőértékek mennyiben térnek el egymáshoz képest – ezt nevezzük sajátjuknak kovariancia. Ezeket az eredményeket ezután mátrixba rendezzük, így kapjuk a kovariancia mátrix.

A kovarianciamátrix beszerzése után a PCA megpróbálja megtalálni a jellemzők lineáris kombinációját, amely a legjobban magyarázza azt – addig illeszkedik a lineáris modellekhez, amíg meg nem azonosítja azt, amely megmagyarázza maximális szórás mértéke.

Megjegyzések: A PCA egy lineáris transzformáció, és a linearitás érzékeny az adatok léptékére. Ezért a PCA akkor működik a legjobban, ha minden adatérték azonos skálán van. Ezt az oszlop kivonásával lehet megtenni jelent értékéből, és az eredményt elosztjuk a szórásával. Ezt nevezik az adatok szabványosítása. A PCA használata előtt győződjön meg arról, hogy az adatok méretezve vannak! Ha nem tudja, hogyan, olvassa el a mi „Feature Scaling Data Scikit-Learn for Machine Learning in Python”!

A megtalált legjobb vonallal (lineáris kombinációval) a PCA megkapja a tengelyei irányait, ún sajátvektorok, és lineáris együtthatói, a sajátértékek. A sajátvektorok és sajátértékek – vagy tengelyirányok és együtthatók – kombinációja a Fő komponensek a PCA. És ekkor választhatjuk meg a dimenziók számát az egyes jellemzők elmagyarázott varianciája alapján, annak megértésével, hogy mely fő összetevőket szeretnénk megtartani vagy elvetni attól függően, hogy mekkora szórást magyaráznak.

A főkomponensek beszerzése után a PCA a sajátvektorok segítségével olyan jellemzővektort alkot, amely az adatokat az eredeti tengelyekről a főkomponensek által képviselt tengelyekre irányítja át – így csökkennek az adatdimenziók.

Jegyzet: Az egyik fontos részlet, amelyet itt figyelembe kell venni, az, hogy a PCA lineáris jellege miatt a megmagyarázott variancia nagy részét az első fő komponensekre koncentrálja. Tehát, ha a megmagyarázott szórást nézzük, általában az első két komponensünk elegendő. Ez azonban bizonyos esetekben félrevezető lehet – ezért próbálja meg folyamatosan összehasonlítani a különböző diagramokat és algoritmusokat a klaszterezés során, hogy megnézze, hasonló eredményeket adnak-e.

A PCA alkalmazása előtt választanunk kell a Age oszlop vagy a Age Groups oszlopokat a korábban one-hot kódolt adatainkban. Mivel mindkét oszlop ugyanazt az információt képviseli, ennek kétszeri bevezetése befolyásolja adatvarianciánkat. Ha a Age Groups oszlopot választja, egyszerűen távolítsa el a Age oszlopban a Pandák segítségével drop() módszert, és rendelje hozzá újra a customer_data_oh változó:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

Adataink most 10 oszlopból állnak, ami azt jelenti, hogy oszloponként kaphatunk egy főkomponenst, és kiválaszthatjuk, hogy hányat használjunk belőlük úgy, hogy megmérjük, hogy egy új dimenzió bevezetése mennyivel magyarázza jobban adatvarianciánkat.

Tegyük ezt a Scikit-Learn segítségével PCA. Kiszámoljuk az egyes dimenziók magyarázott varianciáját, a következővel: explained_variance_ratio_ , majd nézze meg a kumulatív összegüket a cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

Kumulatív magyarázott eltéréseink a következők:

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

Láthatjuk, hogy az első dimenzió az adatok 50%-át, a második dimenzióval kombinálva pedig 99%-át magyarázza. Ez azt jelenti, hogy az első 2 dimenzió már az adataink 99%-át magyarázza. Így alkalmazhatunk egy 2 komponensből álló PCA-t, megkaphatjuk a főkomponenseinket és ábrázolhatjuk őket:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

img

A PCA utáni adatdiagram nagyon hasonló ahhoz a diagramhoz, amely csak két oszlopot használ PCA nélkül. Figyeljük meg, hogy a csoportokat alkotó pontok közelebb vannak, és kicsit koncentráltabbak a PCA után, mint korábban.

img

Hierarchikus struktúra megjelenítése dendrogramokkal

Eddig feltártuk az adatokat, egy gyors kódolású kategorikus oszlopokat, eldöntöttük, mely oszlopok alkalmasak a klaszterezésre, és csökkentettük az adatok dimenzióit. A diagramok azt jelzik, hogy 5 klaszter van az adatainkban, de van egy másik mód is a pontjaink közötti kapcsolatok megjelenítésére és a klaszterek számának meghatározására – egy dendrogram (általában dendogramként hibásan írják). dendro eszközök fa latinul.

A dendrogram egy adatkészletben lévő pontok összekapcsolásának eredménye. Ez a hierarchikus klaszterezési folyamat vizuális megjelenítése. És hogyan működik a hierarchikus klaszterezési folyamat? Nos… attól függ – valószínűleg ezt a választ már sokat hallottad a Data Science-ben.

A hierarchikus klaszterezés megértése

Amikor a Hierarchikus klaszterezési algoritmus (HCA) elkezdi összekapcsolni a pontokat és klasztereket találni, először 2 nagy csoportra bonthatja a pontokat, majd ezt a két csoportot 2 kisebb csoportra osztja, összesen 4 csoportra, ami a megosztó és a felülről lefelé megközelítés.

Alternatív megoldásként megteheti az ellenkezőjét is – megnézheti az összes adatpontot, megkereshet 2 egymáshoz közelebb eső pontot, összekapcsolja őket, majd kereshet más pontokat, amelyek a legközelebb vannak azokhoz a kapcsolt pontokhoz, és tovább építheti a 2 csoportot. tól alulról felfelé. Melyik az agglomeratív megközelítést fogjuk kidolgozni.

Az agglomeratív hierarchikus klaszterezés végrehajtásának lépései

Ahhoz, hogy az agglomeratív megközelítés még egyértelmű legyen, vannak lépései a Agglomeratív hierarchikus klaszterezés (AHC) algoritmus:

  1. Kezdetben minden adatpontot egy fürtként kezeljen. Ezért a klaszterek száma az elején K lesz – míg K az adatpontok számát reprezentáló egész szám.
  2. Hozzon létre egy klasztert a két legközelebbi adatpont összekapcsolásával, ami K-1 klasztereket eredményez.
  3. Hozzon létre több klasztert a két legközelebbi klaszter összekapcsolásával, ami K-2 klasztereket eredményez.
  4. Ismételje meg a fenti három lépést, amíg egy nagy klaszter nem jön létre.

Megjegyzések: Az egyszerűsítés kedvéért a 2. és 3. lépésben „két legközelebbi” adatpontot mondunk. De a pontok összekapcsolásának több módja is van, amint azt egy kicsit látni fogjuk.

Ha megfordítja az ACH algoritmus lépéseit, 4-ről 1-re haladva - ezek a lépések lennének a *Divisive Hierarchical Clustering (DHC)*.

Figyeljük meg, hogy a HCA-k lehetnek megosztóak és felülről lefelé, vagy agglomeratívak és alulról felfelé mutatóak. A felülről lefelé irányuló DHC-megközelítés akkor működik a legjobban, ha kevesebb, de nagyobb fürttel rendelkezik, ezért számítási szempontból drágább. Másrészt az alulról felfelé építkező AHC megközelítés alkalmas arra, ha sok kisebb klaszter van. Számításilag egyszerűbb, használtabb és elérhetőbb.

Jegyzet: Akár felülről lefelé, akár alulról felfelé, a klaszterezési folyamat dendrogram-ábrázolása mindig kettéosztással kezdődik, és minden egyes pont megkülönböztetésével végződik, ha az alapul szolgáló szerkezet egy bináris fa.

Ábrázoljuk ügyféladataink dendrogramját, hogy megjelenítsük az adatok hierarchikus kapcsolatait. Ezúttal a scipy könyvtár az adatkészletünk dendrogramjának létrehozásához:

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

A szkript kimenete így néz ki:

img

A fenti szkriptben létrehoztuk a fürtöket és alklasztereket a pontjainkkal, meghatároztuk, hogy pontjaink hogyan kapcsolódnak egymáshoz (a ward módszer), és hogyan kell mérni a pontok közötti távolságot (a euclidean metrikus).

A dendrogram görbéjével a leírt DHC és AHC folyamatok megjeleníthetők. A felülről lefelé irányuló megközelítés megjelenítéséhez kezdje el a dendrogram tetejétől, menjen lefelé, és tegye az ellenkezőjét, lefelé indulva és felfelé haladva az alulról felfelé irányuló megközelítés megjelenítéséhez.

Kapcsolódási módszerek

Számos más összekapcsolási módszer létezik, ha jobban megérti, hogyan működnek, kiválaszthatja az igényeinek megfelelőt. Emellett mindegyik más-más eredményt hoz, ha alkalmazzák. A klaszterelemzésben nincs fix szabály, ha lehetséges, tanulmányozza a probléma természetét, hogy megtudja, melyik illik a legjobban, tesztelje a különböző módszereket, és ellenőrizze az eredményeket.

Néhány összekapcsolási módszer a következő:

  • Egyetlen kötés: más néven Legközelebbi szomszéd (NN). A klaszterek közötti távolságot a legközelebbi tagjaik közötti távolság határozza meg.

img

  • Teljes kapcsolódás: más néven Legtávolabbi szomszéd (FN), Legtávolabbi pont algoritmusavagy Voor Hees algoritmus. A klaszterek közötti távolságot a legtávolabbi tagjaik közötti távolság határozza meg. Ez a módszer számítási szempontból költséges.

img

  • Átlagos kapcsolódás: más néven UPGMA (Súlyozatlan páros csoport módszer aritmetikai átlaggal). Az egyes klaszterek pontjainak százalékos arányát a két klaszter összevont pontjaihoz viszonyítva számítjuk ki.

img

  • Súlyozott összeköttetés: más néven WPGMA (Súlyozott páros csoport módszer aritmetikai átlaggal). A két klaszter egyes pontjai hozzájárulnak egy kisebb és egy nagyobb klaszter közötti összesített távolsághoz.
  • Központi összeköttetés: más néven UPGMC (Súlyozatlan páros csoport módszer a központok használatával). A rendszer minden klaszterhez kiszámít egy, az összes pont átlagával meghatározott pontot (centroid), és a klaszterek közötti távolság a megfelelő súlypontjaik közötti távolság.

img

  • Egyházközségi kapcsolat: Más néven MISSQ (A négyzetösszeg minimális növekedése). Megadja a távolságot két klaszter között, kiszámítja a hibanégyzetek összegét (ESS), és egymás után kiválasztja a következő klasztereket a kisebb ESS alapján. A Ward-módszer arra törekszik, hogy minden lépésben minimalizálja az ESS növekedését. Ezért a hiba minimalizálása.

img

Távolságmérők

Az összekapcsolás mellett megadhatunk néhány leggyakrabban használt távolságmérőt is:

  • euklideszi: más néven Pitagorasz vagy egyenes vonalú távolság. Kiszámítja a tér két pontja közötti távolságot a közöttük áthaladó szakasz hosszának mérésével. A Pitagorasz-tételt használja, és a távolságérték az eredmény (C) az egyenletből:

$$
c^2 = a^2 + b^2
$$

  • Manhattan: más néven Várostömb, Taxi távolság. Ez a két pont minden dimenziójában mért mértékek abszolút különbségeinek összege. Ha ez a méret kettő, akkor ez hasonló ahhoz, hogy jobbra, majd balra lépjünk, amikor egy blokkot sétálunk.

img

  • Minkowski: ez mind az euklideszi, mind a manhattani távolság általánosítása. Ez egy módszer a távolságok kiszámítására a Minkowski-metrika szerinti abszolút különbségek alapján p. Bár bármelyre meg van határozva p> 0, ritkán használják 1, 2 és ∞ (végtelen) értéktől eltérő értékekre. Minkowski távolság megegyezik Manhattan távolsággal, amikor p = 1, és ugyanaz, mint az euklideszi távolság, amikor p = 2.

$$
Left(X,Yright) = bal(összeg_{i=1}^n |x_i-y_i|^pright)^{frac{1}{p}}
$$

img

  • Csebisov: más néven Sakktábla távolság. Ez a Minkowski-távolság extrém esete. Amikor a végtelent használjuk a paraméter értékeként p (p = ∞), egy olyan metrikát kapunk, amely a távolságot a koordináták közötti maximális abszolút különbségként határozza meg.
  • koszinusz: ez a szög koszinusz távolság két pontsorozat vagy vektor között. A koszinusz hasonlóság a vektorok pontszorzata osztva a hosszuk szorzatával.
  • Jaccard: a véges ponthalmazok hasonlóságát méri. Úgy definiálható, hogy az egyes halmazokban (metszéspontokban) lévő közös pontok összpontszáma (számosság), osztva mindkét halmaz összpontszámának (sokozatossága) számával (egyesülés).
  • Jensen-Shannon: a Kullback-Leibler eltérés alapján. Figyelembe veszi a pontok valószínűségi eloszlását, és méri az eloszlások közötti hasonlóságot. Ez a valószínűségszámítás és a statisztika népszerű módszere.

Választottunk Ward és a euklideszi a dendrogramhoz, mert ezek a leggyakrabban használt módszer és mérőszám. Általában jó eredményeket adnak, mivel Ward a hibák minimalizálása alapján kapcsolja össze a pontokat, és az Euklideszi jól működik alacsonyabb dimenziókban.

Ebben a példában a marketingadatok két jellemzőjével (oszlopával) és 200 megfigyeléssel vagy sorral dolgozunk. Mivel a megfigyelések száma nagyobb, mint a jellemzők száma (200 > 2), ezért alacsony dimenziójú térben dolgozunk.

Amikor a funkciók száma (F) nagyobb, mint a megfigyelések száma (N) – többnyire úgy írják f >> N, ez azt jelenti, hogy van a nagy dimenziójú tér.

Ha több attribútumot is beiktatnánk, tehát több mint 200 jellemzőnk van, akkor az euklideszi távolság nem működne túl jól, mivel nehezen tudná megmérni az összes kis távolságot egy nagyon nagy térben, amely csak nagyobb lesz. Más szóval, az euklideszi távolságmegközelítésnek nehézségei vannak az adatokkal való munka során ritkaság. Ez egy olyan probléma, amelyet ún a dimenzionalitás átka. A távolságértékek olyan kicsikké válnának, mintha a nagyobb térben „hígulnának”, addig torzulnának, amíg 0 nem lesznek.

Jegyzet: Ha valaha is találkozik olyan adatkészlettel f >> p, valószínűleg más távolságmérőket fog használni, mint például a Mahalanobis távolság. Alternatív megoldásként az adatkészlet dimenzióit is csökkentheti a használatával Fő komponens elemzés (PCA). Ez a probléma különösen gyakori a biológiai szekvenálási adatok klaszterezésekor.

Már tárgyaltuk a mérőszámokat, kapcsolatokat, és azt, hogy mindegyik hogyan befolyásolhatja eredményeinket. Folytassuk a dendrogram elemzést, és nézzük meg, hogyan adhat jelzést az adatkészletünkben lévő klaszterek számáról.

Érdekes számú klaszter megtalálása egy dendrogramban ugyanaz, mint a legnagyobb vízszintes tér megtalálása, amelyben nincsenek függőleges vonalak (a leghosszabb függőleges vonalakat tartalmazó tér). Ez azt jelenti, hogy nagyobb a távolság a klaszterek között.

Rajzolhatunk egy vízszintes vonalat, amely átmegy a legnagyobb távolságon:

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

img

A vízszintes vonal megtalálása után megszámoljuk, hogy a függőleges vonalainkat hányszor keresztezte – ebben a példában 5-ször. Tehát az 5 jó jelzésnek tűnik a közöttük legnagyobb távolságra lévő klaszterek számára.

Megjegyzések: A dendrogramot csak referenciaként kell figyelembe venni, amikor a klaszterek számának kiválasztásához használják. Ezt a számot könnyen el lehet távolítani, és teljes mértékben befolyásolja a kapcsolat típusa és a távolságmérők. Mélyreható klaszteranalízis során ajánlatos a különböző kapcsolatokat és mérőszámokat tartalmazó dendrogramokat megnézni, és az első három olyan sorral generált eredményeket nézni, amelyekben a klaszterek között a legnagyobb a távolság.

Agglomeratív hierarchikus klaszterezés megvalósítása

Eredeti adatok használata

Eddig kiszámítottuk a klaszterek javasolt számát az adatkészletünkhöz, amelyek megerősítik a kezdeti elemzésünket és a PCA elemzésünket. Most létrehozhatjuk agglomeratív hierarchikus klaszterezési modellünket a Scikit-Learn segítségével AgglomerativeClustering és ismerje meg a marketingpontok címkéit labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

Ennek eredményeként:

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

Sokat vizsgáltunk, hogy idáig eljuthassunk. És mit jelentenek ezek a címkék? Itt az adataink minden pontját 0-tól 4-ig terjedő csoportként jelöljük:

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

img

Ezek a végső csoportosított adataink. A színkódolt adatpontokat öt klaszter formájában láthatja.

Az adatpontok a jobb alsó sarokban (címke: 0, lila adatpontok) a magas fizetésű, de alacsony költségű ügyfelek közé tartoznak. Ezek azok az ügyfelek, akik gondosan költik el a pénzüket.

Hasonlóképpen a jobb felső sarokban lévő ügyfelek (címke: 2, zöld adatpontok), azok a vásárlók magas fizetéssel és magas kiadással. Ilyen típusú ügyfeleket céloznak meg a cégek.

Az ügyfelek középen (címke: 1, kék adatpontok) azok, amelyek átlagos bevétellel és átlagos kiadással rendelkeznek. A legtöbb ügyfél ebbe a kategóriába tartozik. A vállalatok is megcélozhatják ezeket az ügyfeleket, mivel nagy számban vannak.

Az ügyfelek a bal alsó sarokban (címke: 4, piros) azok az ügyfelek, akiknek alacsony a fizetése és alacsonyak a költései, akiket promóciók felkínálásával vonzhatnak magukhoz.

És végül az ügyfelek a bal felső sarokban (címke: 3, narancssárga adatpontok) a magas jövedelműek és alacsony költekezésűek, amelyeket ideálisan céloz meg a marketing.

A PCA eredményének használata

Ha más forgatókönyvben lennénk, amiben csökkentenünk kellett az adatok dimenzióit. Könnyen ábrázolhatjuk a klaszterizált PCA eredményeket is. Ezt megteheti egy másik agglomeratív klaszterezési modell létrehozásával, és minden főkomponens adatcímkéjének beszerzésével:

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

img

Figyelje meg, hogy mindkét eredmény nagyon hasonló. A fő különbség az, hogy az első eredményt az eredeti adatokkal sokkal könnyebb megmagyarázni. Jól látható, hogy az ügyfelek öt csoportra oszthatók éves bevételük és kiadási pontszámuk alapján. Míg a PCA megközelítésben minden jellemzőnket figyelembe vesszük, amennyire meg tudjuk nézni az egyes jellemzők által magyarázott eltéréseket, ezt nehezebb megragadni, különösen, ha egy marketing osztálynak teszünk jelentést.

Minél kevesebbet kell átalakítanunk adatainkat, annál jobb.

Ha nagyon nagy és összetett adatkészlettel rendelkezik, amelyben dimenziócsökkentést kell végrehajtania a fürtözés előtt – próbálja meg elemezni az egyes jellemzők és maradékaik közötti lineáris kapcsolatokat, hogy alátámassza a PCA használatát és javítsa a folyamat megmagyarázhatóságát. A jellemzőpáronkénti lineáris modell elkészítésével megértheti, hogy a jellemzők hogyan hatnak egymásra.

Ha az adatmennyiség ekkora, lehetetlenné válik a jellemzőpárok ábrázolása, a lehető legkiegyensúlyozottabb és a normál eloszláshoz legközelebb eső minta kiválasztása az adatokból, és először a mintán végezzük el az elemzést, megértsük, finomhangoljuk. azt – és később alkalmazza a teljes adatkészletre.

Mindig választhat különböző klaszteres megjelenítési technikákat az adatok természetének megfelelően (lineáris, nem lineáris), és szükség esetén mindegyiket kombinálhatja vagy tesztelheti.

Következtetés

A fürtözési technika nagyon hasznos lehet, ha címkézetlen adatokról van szó. Mivel a valós világban a legtöbb adat címkézetlen, és az adatok annotálása magasabb költségekkel jár, klaszterezési technikák használhatók a címkézetlen adatok címkézésére.

Ebben az útmutatóban egy valós adattudományi problémát hoztunk, mivel a klaszterezési technikákat nagymértékben alkalmazzák a marketingelemzésben (és a biológiai elemzésben is). Számos vizsgálati lépést is elmagyaráztunk a jó hierarchikus klaszterezési modell eléréséhez és a dendrogramok olvasásához, és megkérdőjeleztük, hogy a PCA szükséges-e. Fő célunk, hogy lefedjük azokat a buktatókat és különböző forgatókönyveket, amelyekben hierarchikus klaszterezést találhatunk.

Boldog klaszterezést!

Időbélyeg:

Még több Stackabus