|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 3 weeks ago | |
assignment.md | 3 weeks ago | |
notebook.ipynb | 2 weeks ago |
README.md
Uvod v klasifikacijo
V teh štirih lekcijah boste raziskovali eno temeljnih področij klasičnega strojnega učenja - klasifikacijo. Preučili bomo uporabo različnih algoritmov za klasifikacijo z uporabo nabora podatkov o vseh čudovitih azijskih in indijskih kuhinjah. Upam, da ste lačni!
Praznujte panazijske kuhinje v teh lekcijah! Slika: Jen Looper
Klasifikacija je oblika nadzorovanega učenja, ki ima veliko skupnega s tehnikami regresije. Če je strojno učenje namenjeno napovedovanju vrednosti ali imen stvari z uporabo naborov podatkov, potem klasifikacijo običajno delimo v dve skupini: binarna klasifikacija in večrazredna klasifikacija.
🎥 Kliknite zgornjo sliko za video: MIT-jev John Guttag predstavlja klasifikacijo
Zapomnite si:
- Linearna regresija vam je pomagala napovedati odnose med spremenljivkami in natančno predvideti, kam bo padla nova podatkovna točka glede na to črto. Na primer, lahko ste napovedali kakšna bo cena buče septembra v primerjavi z decembrom.
- Logistična regresija vam je pomagala odkriti "binarne kategorije": pri tej ceni, ali je ta buča oranžna ali ne-oranžna?
Klasifikacija uporablja različne algoritme za določanje drugih načinov ugotavljanja oznake ali razreda podatkovne točke. Delali bomo s temi podatki o kuhinjah, da ugotovimo, ali lahko na podlagi skupine sestavin določimo izvorno kuhinjo.
Predlekcijski kviz
Ta lekcija je na voljo tudi v jeziku R!
Uvod
Klasifikacija je ena temeljnih dejavnosti raziskovalcev strojnega učenja in podatkovnih znanstvenikov. Od osnovne klasifikacije binarne vrednosti ("ali je to e-poštno sporočilo vsiljena pošta ali ne?") do zapletene klasifikacije slik in segmentacije s pomočjo računalniškega vida, je vedno koristno znati razvrstiti podatke v razrede in jim zastaviti vprašanja.
Če proces opišemo na bolj znanstven način, vaša metoda klasifikacije ustvari napovedni model, ki vam omogoča, da preslikate odnos med vhodnimi in izhodnimi spremenljivkami.
Binarni in večrazredni problemi za algoritme klasifikacije. Infografika: Jen Looper
Preden začnemo s procesom čiščenja podatkov, njihove vizualizacije in priprave za naloge strojnega učenja, se naučimo nekaj več o različnih načinih, kako lahko strojno učenje uporabimo za klasifikacijo podatkov.
Izpeljana iz statistike, klasifikacija s klasičnim strojnim učenjem uporablja značilnosti, kot so kadilec
, teža
in starost
, za določanje verjetnosti razvoja določene bolezni. Kot tehnika nadzorovanega učenja, podobna regresijskim vajam, ki ste jih izvajali prej, so vaši podatki označeni, algoritmi strojnega učenja pa te oznake uporabljajo za klasifikacijo in napovedovanje razredov (ali 'značilnosti') nabora podatkov ter njihovo dodelitev skupini ali izidu.
✅ Vzemite si trenutek in si zamislite nabor podatkov o kuhinjah. Na katera vprašanja bi lahko odgovoril večrazredni model? Na katera vprašanja bi lahko odgovoril binarni model? Kaj če bi želeli ugotoviti, ali določena kuhinja uporablja sabljiko? Kaj če bi želeli preveriti, ali bi lahko iz vrečke zvezdastega janeža, artičok, cvetače in hrena pripravili tipično indijsko jed?
🎥 Kliknite zgornjo sliko za video. Celoten koncept oddaje 'Chopped' temelji na 'skrivnostni košari', kjer morajo kuharji iz naključnih sestavin pripraviti jed. Zagotovo bi jim model strojnega učenja pomagal!
Pozdravljen 'klasifikator'
Vprašanje, ki si ga želimo zastaviti o tem naboru podatkov o kuhinjah, je pravzaprav večrazredno vprašanje, saj imamo na voljo več potencialnih nacionalnih kuhinj. Glede na skupino sestavin, v kateri od teh številnih razredov bodo podatki ustrezali?
Scikit-learn ponuja več različnih algoritmov za klasifikacijo podatkov, odvisno od vrste problema, ki ga želite rešiti. V naslednjih dveh lekcijah se boste naučili več o teh algoritmih.
Vaja - očistite in uravnotežite svoje podatke
Prva naloga, preden začnemo s tem projektom, je očistiti in uravnotežiti podatke za boljše rezultate. Začnite z prazno datoteko notebook.ipynb v korenski mapi te mape.
Prva stvar, ki jo morate namestiti, je imblearn. To je paket Scikit-learn, ki vam bo omogočil boljše uravnoteženje podatkov (več o tej nalogi boste izvedeli v nadaljevanju).
-
Za namestitev
imblearn
zaženitepip install
, kot sledi:pip install imblearn
-
Uvozite pakete, ki jih potrebujete za uvoz in vizualizacijo podatkov, prav tako uvozite
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
Zdaj ste pripravljeni na uvoz podatkov.
-
Naslednja naloga je uvoz podatkov:
df = pd.read_csv('../data/cuisines.csv')
Z uporabo
read_csv()
boste prebrali vsebino csv datoteke cusines.csv in jo shranili v spremenljivkodf
. -
Preverite obliko podatkov:
df.head()
Prvih pet vrstic izgleda takole:
| | 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 |
-
Pridobite informacije o teh podatkih z uporabo
info()
:df.info()
Vaš izpis je podoben:
<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
Vaja - spoznavanje kuhinj
Zdaj postane delo bolj zanimivo. Odkrijmo porazdelitev podatkov po kuhinjah.
-
Prikaz podatkov kot stolpce z uporabo
barh()
:df.cuisine.value_counts().plot.barh()
Število kuhinj je omejeno, vendar je porazdelitev podatkov neenakomerna. To lahko popravite! Preden to storite, raziščite še malo.
-
Ugotovite, koliko podatkov je na voljo za vsako kuhinjo, in jih izpišite:
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}')
Izpis izgleda takole:
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
Odkrijte sestavine
Zdaj lahko globlje raziščete podatke in ugotovite, katere so tipične sestavine za posamezno kuhinjo. Odstraniti morate ponavljajoče se podatke, ki povzročajo zmedo med kuhinjami, zato se lotimo tega problema.
-
Ustvarite funkcijo
create_ingredient()
v Pythonu za ustvarjanje podatkovnega okvira sestavin. Ta funkcija bo začela z odstranitvijo neuporabnega stolpca in razvrstila sestavine po njihovem številu: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
Zdaj lahko uporabite to funkcijo, da dobite idejo o desetih najbolj priljubljenih sestavinah po kuhinji.
-
Pokličite
create_ingredient()
in jo prikažite z uporabobarh()
:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
Enako storite za japonske podatke:
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
Zdaj za kitajske sestavine:
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
Prikažite indijske sestavine:
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
Na koncu prikažite korejske sestavine:
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
Zdaj odstranite najpogostejše sestavine, ki povzročajo zmedo med različnimi kuhinjami, z uporabo
drop()
:Vsi imajo radi riž, česen in ingver!
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
Uravnotežite nabor podatkov
Zdaj, ko ste očistili podatke, uporabite SMOTE - "Synthetic Minority Over-sampling Technique" - za njihovo uravnoteženje.
-
Pokličite
fit_resample()
, ta strategija ustvari nove vzorce z interpolacijo.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
Z uravnoteženjem podatkov boste dosegli boljše rezultate pri klasifikaciji. Pomislite na binarno klasifikacijo. Če je večina vaših podatkov enega razreda, bo model strojnega učenja ta razred pogosteje napovedal, zgolj zato, ker je zanj več podatkov. Uravnoteženje podatkov odstrani to neravnovesje.
-
Zdaj lahko preverite število oznak na sestavino:
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
Vaš izpis izgleda takole:
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
Podatki so zdaj čisti, uravnoteženi in zelo okusni!
-
Zadnji korak je shranjevanje uravnoteženih podatkov, vključno z oznakami in značilnostmi, v nov podatkovni okvir, ki ga lahko izvozite v datoteko:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
Še enkrat si oglejte podatke z uporabo
transformed_df.head()
intransformed_df.info()
. Shranite kopijo teh podatkov za uporabo v prihodnjih lekcijah:transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
Ta svež CSV je zdaj na voljo v korenski mapi podatkov.
🚀Izziv
Ta učni načrt vsebuje več zanimivih naborov podatkov. Prebrskajte mape data
in preverite, ali katera vsebuje nabore podatkov, ki bi bili primerni za binarno ali večrazredno klasifikacijo? Na katera vprašanja bi lahko odgovorili s tem naborom podatkov?
Po-lekcijski kviz
Pregled in samostojno učenje
Raziščite API za SMOTE. Za katere primere uporabe je najbolj primeren? Katere težave rešuje?
Naloga
Raziščite metode klasifikacije
Omejitev odgovornosti:
Ta dokument je bil preveden z uporabo storitve za strojno prevajanje Co-op Translator. Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.