16 KiB
Bevezetés az osztályozásba
Ebben a négy leckében a klasszikus gépi tanulás egyik alapvető területét, az osztályozást fogod megismerni. Különböző osztályozási algoritmusokat fogunk alkalmazni egy adatállományon, amely Ázsia és India csodálatos konyháiról szól. Reméljük, éhes vagy!
Ünnepeld a pán-ázsiai konyhákat ezekben a leckékben! Kép: Jen Looper
Az osztályozás a felügyelt tanulás egyik formája, amely sok hasonlóságot mutat a regressziós technikákkal. Ha a gépi tanulás lényege az, hogy adatállományok segítségével értékeket vagy neveket jósoljunk meg, akkor az osztályozás általában két csoportba sorolható: bináris osztályozás és többosztályos osztályozás.
🎥 Kattints a fenti képre egy videóért: MIT John Guttag bemutatja az osztályozást
Emlékezz:
- Lineáris regresszió segített megjósolni a változók közötti kapcsolatokat, és pontos előrejelzéseket készíteni arról, hogy egy új adatpont hol helyezkedne el a vonalhoz viszonyítva. Például meg tudtad jósolni, milyen árú lesz egy tök szeptemberben vagy decemberben.
- Logisztikus regresszió segített felfedezni "bináris kategóriákat": ezen az árponton ez a tök narancssárga vagy nem narancssárga?
Az osztályozás különböző algoritmusokat használ annak meghatározására, hogy egy adatpont milyen címkét vagy osztályt kapjon. Dolgozzunk ezzel a konyhai adatállománnyal, hogy megállapítsuk, egy összetevőcsoport alapján melyik konyha eredetéhez tartozik.
Előadás előtti kvíz
Ez a lecke elérhető R-ben is!
Bevezetés
Az osztályozás a gépi tanulás kutatójának és adatkutatójának egyik alapvető tevékenysége. Az egyszerű bináris értékek osztályozásától ("ez az e-mail spam vagy nem?") a komplex képosztályozásig és szegmentálásig számítógépes látás segítségével, mindig hasznos az adatokat osztályokba rendezni és kérdéseket feltenni róluk.
Tudományosabb megfogalmazásban az osztályozási módszered egy prediktív modellt hoz létre, amely lehetővé teszi, hogy az input változók és az output változók közötti kapcsolatot feltérképezd.
Bináris vs. többosztályos problémák, amelyeket az osztályozási algoritmusok kezelnek. Infografika: Jen Looper
Mielőtt elkezdenénk az adatok tisztítását, vizualizálását és előkészítését a gépi tanulási feladatokhoz, ismerjük meg, hogyan lehet a gépi tanulást különböző módokon alkalmazni az adatok osztályozására.
A statisztikából származó klasszikus gépi tanulási osztályozás olyan jellemzőket használ, mint például dohányos
, súly
és életkor
, hogy meghatározza X betegség kialakulásának valószínűségét. A korábban végzett regressziós gyakorlatokhoz hasonló felügyelt tanulási technikaként az adataid címkézettek, és a gépi tanulási algoritmusok ezeket a címkéket használják az adatok osztályainak (vagy 'jellemzőinek') osztályozására és előrejelzésére, majd egy csoporthoz vagy eredményhez rendelésére.
✅ Képzelj el egy konyhákról szóló adatállományt. Milyen kérdéseket tudna megválaszolni egy többosztályos modell? Milyen kérdéseket tudna megválaszolni egy bináris modell? Mi lenne, ha meg akarnád határozni, hogy egy adott konyha valószínűleg használ-e görögszénát? Mi lenne, ha azt akarnád kideríteni, hogy egy élelmiszerkosárban található csillagánizs, articsóka, karfiol és torma alapján készíthetsz-e egy tipikus indiai ételt?
🎥 Kattints a fenti képre egy videóért. A 'Chopped' című műsor egész koncepciója a 'rejtélyes kosár', ahol a séfeknek egy véletlenszerű összetevőkből kell ételt készíteniük. Biztosan segített volna egy gépi tanulási modell!
Helló 'osztályozó'
Az a kérdés, amit a konyhai adatállománytól szeretnénk megkérdezni, valójában egy többosztályos kérdés, mivel több lehetséges nemzeti konyhával dolgozunk. Egy adag összetevő alapján, melyik osztályba illik az adat?
A Scikit-learn több különböző algoritmust kínál az adatok osztályozására, attól függően, hogy milyen problémát szeretnél megoldani. A következő két leckében megismerhetsz néhányat ezek közül az algoritmusok közül.
Gyakorlat - tisztítsd és egyensúlyozd ki az adataidat
Az első feladat, mielőtt elkezdenénk ezt a projektet, az adatok tisztítása és kiegyensúlyozása, hogy jobb eredményeket érjünk el. Kezdd a notebook.ipynb üres fájllal a mappa gyökerében.
Az első telepítendő csomag az imblearn. Ez egy Scikit-learn csomag, amely lehetővé teszi az adatok jobb kiegyensúlyozását (erről a feladatról hamarosan többet fogsz tanulni).
-
Az
imblearn
telepítéséhez futtasd apip install
parancsot, így:pip install imblearn
-
Importáld a szükséges csomagokat az adatok importálásához és vizualizálásához, valamint importáld a
SMOTE
-ot azimblearn
-ből.import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE
Most készen állsz az adatok importálására.
-
A következő feladat az adatok importálása:
df = pd.read_csv('../data/cuisines.csv')
A
read_csv()
segítségével beolvashatod a cusines.csv fájl tartalmát, és elhelyezheted adf
változóban. -
Ellenőrizd az adatok alakját:
df.head()
Az első öt sor így néz ki:
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Szerezz információt az adatokról az
info()
hívásával:df.info()
Az eredményed hasonló lesz:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2448 entries, 0 to 2447 Columns: 385 entries, Unnamed: 0 to zucchini dtypes: int64(384), object(1) memory usage: 7.2+ MB
Gyakorlat - konyhák megismerése
Most kezd igazán érdekessé válni a munka. Fedezzük fel az adatok eloszlását konyhánként.
-
Ábrázold az adatokat oszlopokként a
barh()
hívásával:df.cuisine.value_counts().plot.barh()
Véges számú konyha van, de az adatok eloszlása egyenetlen. Ezt kijavíthatod! Mielőtt ezt megtennéd, fedezz fel egy kicsit többet.
-
Derítsd ki, mennyi adat áll rendelkezésre konyhánként, és írasd ki:
thai_df = df[(df.cuisine == "thai")] japanese_df = df[(df.cuisine == "japanese")] chinese_df = df[(df.cuisine == "chinese")] indian_df = df[(df.cuisine == "indian")] korean_df = df[(df.cuisine == "korean")] print(f'thai df: {thai_df.shape}') print(f'japanese df: {japanese_df.shape}') print(f'chinese df: {chinese_df.shape}') print(f'indian df: {indian_df.shape}') print(f'korean df: {korean_df.shape}')
Az eredmény így néz ki:
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
Összetevők felfedezése
Most mélyebben belemerülhetsz az adatokba, és megtudhatod, melyek a tipikus összetevők konyhánként. Tisztítsd ki az ismétlődő adatokat, amelyek zavart okoznak a konyhák között, hogy jobban megértsd ezt a problémát.
-
Hozz létre egy
create_ingredient()
nevű függvényt Pythonban, amely egy összetevő adatkeretet hoz létre. Ez a függvény egy haszontalan oszlop elhagyásával kezd, majd az összetevőket azok számossága szerint rendezi:def create_ingredient_df(df): ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False) return ingredient_df
Most már használhatod ezt a függvényt, hogy képet kapj a tíz legnépszerűbb összetevőről konyhánként.
-
Hívd meg a
create_ingredient()
függvényt, és ábrázold az adatokat abarh()
hívásával:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
Ugyanezt tedd meg a japán adatokkal:
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
Most a kínai összetevők:
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
Ábrázold az indiai összetevőket:
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
Végül ábrázold a koreai összetevőket:
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
Most hagyd el a leggyakoribb összetevőket, amelyek zavart okoznak a különböző konyhák között, a
drop()
hívásával:Mindenki szereti a rizst, fokhagymát és gyömbért!
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
Az adatállomány kiegyensúlyozása
Most, hogy megtisztítottad az adatokat, használd a SMOTE - "Synthetic Minority Over-sampling Technique" - technikát az adatok kiegyensúlyozására.
-
Hívd meg a
fit_resample()
függvényt, amely interpolációval új mintákat generál.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
Az adatok kiegyensúlyozásával jobb eredményeket érhetsz el az osztályozás során. Gondolj egy bináris osztályozásra. Ha az adataid többsége egy osztályba tartozik, a gépi tanulási modell gyakrabban fogja azt az osztályt előre jelezni, egyszerűen azért, mert több adat áll rendelkezésre róla. Az adatok kiegyensúlyozása segít eltávolítani ezt az egyensúlyhiányt.
-
Most ellenőrizheted az összetevők címkéinek számát:
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
Az eredményed így néz ki:
new label count: korean 799 chinese 799 indian 799 japanese 799 thai 799 Name: cuisine, dtype: int64 old label count: korean 799 indian 598 chinese 442 japanese 320 thai 289 Name: cuisine, dtype: int64
Az adatok szépek, tiszták, kiegyensúlyozottak és nagyon ínycsiklandóak!
-
Az utolsó lépés az, hogy a kiegyensúlyozott adatokat, beleértve a címkéket és jellemzőket, egy új adatkeretbe mentsd, amelyet fájlba exportálhatsz:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
Még egyszer megnézheted az adatokat a
transformed_df.head()
éstransformed_df.info()
hívásával. Ments egy másolatot ezekről az adatokból, hogy a jövőbeli leckékben használhasd:transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
Ez a friss CSV most megtalálható az adatállomány mappájának gyökerében.
🚀Kihívás
Ez a tananyag számos érdekes adatállományt tartalmaz. Nézd át a data
mappákat, és nézd meg, hogy van-e olyan adatállomány, amely bináris vagy többosztályos osztályozásra alkalmas? Milyen kérdéseket tennél fel ennek az adatállománynak?
Előadás utáni kvíz
Áttekintés és önálló tanulás
Fedezd fel a SMOTE API-t. Milyen felhasználási esetekre a legalkalmasabb? Milyen problémákat old meg?
Feladat
Fedezd fel az osztályozási módszereket
Felelősség kizárása:
Ez a dokumentum az AI fordítási szolgáltatás Co-op Translator segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Fontos információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.