|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 2 weeks ago |
README.md
Uvod u klasifikaciju
U ovih četiri lekcije istražit ćete temeljni fokus klasičnog strojnog učenja - klasifikaciju. Proći ćemo kroz korištenje različitih algoritama klasifikacije s datasetom o svim briljantnim kuhinjama Azije i Indije. Nadamo se da ste gladni!
Proslavite pan-azijske kuhinje u ovim lekcijama! Slika: Jen Looper
Klasifikacija je oblik nadziranog učenja koji ima mnogo zajedničkog s tehnikama regresije. Ako je strojno učenje usmjereno na predviđanje vrijednosti ili naziva stvari pomoću podataka, tada se klasifikacija općenito dijeli u dvije skupine: binarna klasifikacija i višeklasna klasifikacija.
🎥 Kliknite na sliku iznad za video: John Guttag s MIT-a predstavlja klasifikaciju
Zapamtite:
- Linearna regresija pomogla vam je predvidjeti odnose između varijabli i napraviti točna predviđanja o tome gdje će novi podatak pasti u odnosu na tu liniju. Na primjer, mogli ste predvidjeti koja će cijena bundeve biti u rujnu u usporedbi s prosincem.
- Logistička regresija pomogla vam je otkriti "binarne kategorije": na ovoj cjenovnoj razini, je li bundeva narančasta ili nije narančasta?
Klasifikacija koristi različite algoritme za određivanje drugih načina dodjeljivanja oznake ili klase podatkovnoj točki. Radit ćemo s ovim podacima o kuhinjama kako bismo vidjeli možemo li, promatrajući skup sastojaka, odrediti iz koje kuhinje potječu.
Kviz prije predavanja
Ova lekcija dostupna je i na R jeziku!
Uvod
Klasifikacija je jedna od temeljnih aktivnosti istraživača strojnog učenja i podatkovnih znanstvenika. Od osnovne klasifikacije binarne vrijednosti ("je li ovaj email spam ili nije?"), do složene klasifikacije i segmentacije slika pomoću računalnog vida, uvijek je korisno moći razvrstati podatke u klase i postavljati pitanja o njima.
Da bismo proces izrazili na znanstveniji način, vaša metoda klasifikacije stvara prediktivni model koji vam omogućuje mapiranje odnosa između ulaznih varijabli i izlaznih varijabli.
Binarni i višeklasni problemi za algoritme klasifikacije. Infografika: Jen Looper
Prije nego što započnemo proces čišćenja podataka, njihove vizualizacije i pripreme za zadatke strojnog učenja, naučimo malo više o različitim načinima na koje se strojno učenje može koristiti za klasifikaciju podataka.
Izvedena iz statistike, klasifikacija pomoću klasičnog strojnog učenja koristi značajke, poput smoker
, weight
i age
, kako bi odredila vjerojatnost razvoja određene bolesti. Kao tehnika nadziranog učenja slična regresijskim vježbama koje ste ranije izvodili, vaši podaci su označeni, a algoritmi strojnog učenja koriste te oznake za klasifikaciju i predviđanje klasa (ili 'značajki') skupa podataka te njihovo dodjeljivanje grupi ili ishodu.
✅ Zastanite na trenutak i zamislite skup podataka o kuhinjama. Na što bi višeklasni model mogao odgovoriti? Na što bi binarni model mogao odgovoriti? Što ako želite odrediti koristi li određena kuhinja vjerojatno piskavicu? Što ako želite vidjeti možete li, s obzirom na vrećicu namirnica punu zvjezdastog anisa, artičoka, cvjetače i hrena, pripremiti tipično indijsko jelo?
🎥 Kliknite na sliku iznad za video. Cijela premisa emisije 'Chopped' je 'misteriozna košara' u kojoj kuhari moraju pripremiti jelo od nasumično odabranih sastojaka. Sigurno bi ML model pomogao!
Pozdrav 'klasifikatoru'
Pitanje koje želimo postaviti ovom skupu podataka o kuhinjama zapravo je višeklasno pitanje, jer imamo nekoliko potencijalnih nacionalnih kuhinja s kojima radimo. S obzirom na skup sastojaka, kojoj od ovih mnogih klasa će podaci pripadati?
Scikit-learn nudi nekoliko različitih algoritama za klasifikaciju podataka, ovisno o vrsti problema koji želite riješiti. U sljedeće dvije lekcije naučit ćete o nekoliko tih algoritama.
Vježba - očistite i uravnotežite svoje podatke
Prvi zadatak prije početka ovog projekta je očistiti i uravnotežiti svoje podatke kako biste dobili bolje rezultate. Počnite s praznom datotekom notebook.ipynb u korijenu ove mape.
Prvo što trebate instalirati je imblearn. Ovo je Scikit-learn paket koji će vam omogućiti bolje uravnoteženje podataka (o ovom zadatku ćete naučiti više za trenutak).
-
Za instalaciju
imblearn
, pokrenitepip install
, ovako:pip install imblearn
-
Uvezite pakete potrebne za uvoz i vizualizaciju podataka, također uvezite
SMOTE
izimblearn
.import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE
Sada ste spremni za uvoz podataka.
-
Sljedeći zadatak je uvoz podataka:
df = pd.read_csv('../data/cuisines.csv')
Korištenje
read_csv()
učitat će sadržaj csv datoteke cusines.csv i smjestiti ga u varijabludf
. -
Provjerite oblik podataka:
df.head()
Prvih pet redaka izgleda ovako:
| | 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 |
-
Dobijte informacije o ovim podacima pozivom
info()
:df.info()
Vaš izlaz izgleda ovako:
<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
Vježba - učenje o kuhinjama
Sada rad postaje zanimljiviji. Otkrijmo distribuciju podataka po kuhinji.
-
Prikaz podataka kao stupaca pozivom
barh()
:df.cuisine.value_counts().plot.barh()
Postoji ograničen broj kuhinja, ali distribucija podataka je neujednačena. To možete popraviti! Prije toga, istražite malo više.
-
Saznajte koliko je podataka dostupno po kuhinji i ispišite ih:
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}')
izlaz izgleda ovako:
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
Otkrijte sastojke
Sada možete dublje istražiti podatke i saznati koji su tipični sastojci po kuhinji. Trebali biste očistiti ponavljajuće podatke koji stvaraju konfuziju između kuhinja, pa naučimo o ovom problemu.
-
Napravite funkciju
create_ingredient()
u Pythonu za stvaranje dataframea sastojaka. Ova funkcija će započeti uklanjanjem nevažnog stupca i sortirati sastojke prema njihovom broju: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
Sada možete koristiti tu funkciju kako biste dobili ideju o deset najpopularnijih sastojaka po kuhinji.
-
Pozovite
create_ingredient()
i prikažite rezultate pozivombarh()
:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
Učinite isto za japanske podatke:
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
Sada za kineske sastojke:
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
Prikažite indijske sastojke:
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
Na kraju, prikažite korejske sastojke:
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
Sada uklonite najčešće sastojke koji stvaraju konfuziju između različitih kuhinja, pozivom
drop()
:Svi vole rižu, češnjak i đumbir!
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
Uravnotežite skup podataka
Sada kada ste očistili podatke, koristite SMOTE - "Tehnika sintetičkog manjinskog uzorkovanja" - za uravnoteženje podataka.
-
Pozovite
fit_resample()
, ova strategija generira nove uzorke interpolacijom.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
Uravnoteženjem podataka, postići ćete bolje rezultate pri klasifikaciji. Razmislite o binarnoj klasifikaciji. Ako većina vaših podataka pripada jednoj klasi, ML model će češće predviđati tu klasu, samo zato što za nju ima više podataka. Uravnoteženje podataka uklanja ovu neravnotežu.
-
Sada možete provjeriti broj oznaka po sastojku:
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
Vaš izlaz izgleda ovako:
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
Podaci su sada čisti, uravnoteženi i vrlo ukusni!
-
Posljednji korak je spremanje uravnoteženih podataka, uključujući oznake i značajke, u novi dataframe koji se može izvesti u datoteku:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
Možete još jednom pogledati podatke koristeći
transformed_df.head()
itransformed_df.info()
. Spremite kopiju ovih podataka za korištenje u budućim lekcijama:transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
Ovaj svježi CSV sada se nalazi u korijenskoj mapi podataka.
🚀Izazov
Ovaj kurikulum sadrži nekoliko zanimljivih skupova podataka. Pregledajte mape data
i provjerite sadrže li neki skupovi podataka koji bi bili prikladni za binarnu ili višeklasnu klasifikaciju? Koja biste pitanja postavili ovom skupu podataka?
Kviz nakon predavanja
Pregled i samostalno učenje
Istražite SMOTE-ov API. Za koje slučajeve upotrebe je najprikladniji? Koje probleme rješava?
Zadatak
Istrazite metode klasifikacije
Odricanje od odgovornosti:
Ovaj dokument je preveden korištenjem AI usluge za prevođenje Co-op Translator. Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.