|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 2 weeks ago |
README.md
Johdanto luokitteluun
Näissä neljässä oppitunnissa tutustut klassisen koneoppimisen keskeiseen osa-alueeseen - luokitteluun. Käymme läpi erilaisia luokittelualgoritmeja käyttäen datasettiä, joka käsittelee Aasian ja Intian upeita keittiöitä. Toivottavasti olet nälkäinen!
Juhlista pan-aasialaisia keittiöitä näissä oppitunneissa! Kuva: Jen Looper
Luokittelu on ohjatun oppimisen muoto, joka muistuttaa paljon regressiotekniikoita. Jos koneoppiminen keskittyy arvojen tai nimien ennustamiseen datasetin avulla, luokittelu jakautuu yleensä kahteen ryhmään: binääriluokittelu ja moniluokittelu.
🎥 Klikkaa yllä olevaa kuvaa katsellaksesi videota: MIT:n John Guttag esittelee luokittelua
Muista:
- Lineaarinen regressio auttoi sinua ennustamaan muuttujien välisiä suhteita ja tekemään tarkkoja ennusteita siitä, mihin uusi datapiste sijoittuu suhteessa viivaan. Esimerkiksi, voit ennustaa mikä kurpitsan hinta olisi syyskuussa verrattuna joulukuuhun.
- Logistinen regressio auttoi sinua löytämään "binääriluokkia": tietyllä hintatasolla, onko kurpitsa oranssi vai ei-oranssi?
Luokittelu käyttää erilaisia algoritmeja määrittääkseen datapisteen luokan tai tunnisteen. Työskentelemme tämän keittiödata-aineiston kanssa nähdäksemme, voimmeko ainesosaryhmän perusteella määrittää sen alkuperäisen keittiön.
Esiluennon kysely
Tämä oppitunti on saatavilla myös R-kielellä!
Johdanto
Luokittelu on yksi koneoppimisen tutkijan ja data-analyytikon keskeisistä tehtävistä. Perusluokittelusta binäärisen arvon ("onko tämä sähköposti roskapostia vai ei?") monimutkaiseen kuvien luokitteluun ja segmentointiin tietokonenäön avulla, on aina hyödyllistä pystyä järjestämään data luokkiin ja esittämään kysymyksiä siitä.
Tieteellisemmin ilmaistuna luokittelumenetelmäsi luo ennustavan mallin, joka mahdollistaa syötemuuttujien ja tulosmuuttujien välisen suhteen kartoittamisen.
Binääriset vs. moniluokitusongelmat, joita luokittelualgoritmit käsittelevät. Infografiikka: Jen Looper
Ennen kuin aloitamme datan puhdistamisen, visualisoinnin ja valmistelun koneoppimistehtäviämme varten, opitaan hieman siitä, miten koneoppimista voidaan hyödyntää datan luokittelussa.
Luokittelu, joka on johdettu tilastotieteestä, käyttää ominaisuuksia, kuten smoker
, weight
ja age
, määrittääkseen todennäköisyyden sairastua X-tautiin. Ohjatun oppimisen tekniikkana, joka muistuttaa aiemmin suorittamiasi regressioharjoituksia, datasi on merkitty, ja koneoppimisalgoritmit käyttävät näitä merkintöjä luokitellakseen ja ennustaakseen datasetin luokkia (tai 'ominaisuuksia') ja liittääkseen ne ryhmään tai lopputulokseen.
✅ Mieti hetki datasettiä, joka käsittelee keittiöitä. Mitä moniluokittelumalli voisi vastata? Mitä binäärimalli voisi vastata? Entä jos haluaisit selvittää, käyttääkö tietty keittiö todennäköisesti sarviapilaa? Entä jos haluaisit nähdä, voisitko luoda tyypillisen intialaisen ruokalajin, kun sinulle annetaan lahjaksi ruokakassi, joka sisältää tähtianista, artisokkaa, kukkakaalia ja piparjuurta?
🎥 Klikkaa yllä olevaa kuvaa katsellaksesi videota. Ohjelman 'Chopped' koko idea perustuu 'mysteerikoriin', jossa kokkien täytyy valmistaa ruokalaji satunnaisista ainesosista. Koneoppimismalli olisi varmasti auttanut!
Hei 'luokittelija'
Kysymys, jonka haluamme esittää tästä keittiödatasta, on itse asiassa moniluokittelukysymys, koska meillä on useita mahdollisia kansallisia keittiöitä, joiden kanssa työskennellä. Kun annetaan joukko ainesosia, mihin näistä monista luokista data sopii?
Scikit-learn tarjoaa useita erilaisia algoritmeja datan luokitteluun riippuen siitä, millaisen ongelman haluat ratkaista. Seuraavissa kahdessa oppitunnissa opit useista näistä algoritmeista.
Harjoitus - puhdista ja tasapainota datasi
Ensimmäinen tehtävä ennen projektin aloittamista on puhdistaa ja tasapainottaa datasi saadaksesi parempia tuloksia. Aloita tyhjällä notebook.ipynb-tiedostolla tämän kansion juurihakemistossa.
Ensimmäinen asennettava asia on imblearn. Tämä on Scikit-learn-paketti, joka auttaa sinua tasapainottamaan dataa paremmin (opit tästä tehtävästä lisää hetken kuluttua).
-
Asenna
imblearn
suorittamallapip install
seuraavasti:pip install imblearn
-
Tuo tarvittavat paketit datan tuontia ja visualisointia varten, ja tuo myös
SMOTE
imblearn
-kirjastosta.import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE
Nyt olet valmis tuomaan datan seuraavaksi.
-
Seuraava tehtävä on tuoda data:
df = pd.read_csv('../data/cuisines.csv')
read_csv()
lukee csv-tiedoston cusines.csv sisällön ja sijoittaa sen muuttujaandf
. -
Tarkista datan muoto:
df.head()
Ensimmäiset viisi riviä näyttävät tältä:
| | 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 |
-
Hanki tietoa tästä datasta kutsumalla
info()
:df.info()
Tulosteesi näyttää tältä:
<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
Harjoitus - keittiöiden tutkiminen
Nyt työ alkaa muuttua mielenkiintoisemmaksi. Tutkitaan datan jakautumista keittiöittäin.
-
Piirrä data palkkeina kutsumalla
barh()
:df.cuisine.value_counts().plot.barh()
Keittiöitä on rajallinen määrä, mutta datan jakautuminen on epätasaista. Voit korjata sen! Ennen kuin teet niin, tutki hieman lisää.
-
Selvitä, kuinka paljon dataa on saatavilla keittiöittäin ja tulosta se:
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}')
Tulosteesi näyttää tältä:
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
Ainesosien tutkiminen
Nyt voit syventyä dataan ja oppia, mitkä ovat tyypilliset ainesosat keittiöittäin. Sinun tulisi poistaa toistuva data, joka aiheuttaa sekaannusta keittiöiden välillä, joten opitaan tästä ongelmasta.
-
Luo Pythonissa funktio
create_ingredient()
, joka luo ainesosadataframen. Tämä funktio aloittaa poistamalla hyödyttömän sarakkeen ja lajittelee ainesosat niiden määrän mukaan: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
Nyt voit käyttää tätä funktiota saadaksesi käsityksen kymmenestä suosituimmasta ainesosasta keittiöittäin.
-
Kutsu
create_ingredient()
ja piirrä se kutsumallabarh()
:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
Tee sama japanilaiselle datalle:
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
Nyt kiinalaisille ainesosille:
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
Piirrä intialaiset ainesosat:
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
Lopuksi piirrä korealaiset ainesosat:
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
Poista nyt yleisimmät ainesosat, jotka aiheuttavat sekaannusta eri keittiöiden välillä, kutsumalla
drop()
:Kaikki rakastavat riisiä, valkosipulia ja inkivääriä!
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
Tasapainota datasetti
Nyt kun olet puhdistanut datan, käytä SMOTE - "Synthetic Minority Over-sampling Technique" -menetelmää tasapainottamiseen.
-
Kutsu
fit_resample()
, tämä strategia luo uusia näytteitä interpoloinnin avulla.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
Tasapainottamalla datasi saat parempia tuloksia sen luokittelussa. Mieti binääriluokittelua. Jos suurin osa datastasi kuuluu yhteen luokkaan, koneoppimismalli ennustaa todennäköisemmin kyseistä luokkaa, koska sille on enemmän dataa. Datatasapainotus poistaa tämän epätasapainon.
-
Nyt voit tarkistaa ainesosien tunnisteiden määrät:
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
Tulosteesi näyttää tältä:
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
Data on nyt siisti, tasapainoinen ja erittäin herkullinen!
-
Viimeinen vaihe on tallentaa tasapainotettu data, mukaan lukien tunnisteet ja ominaisuudet, uuteen dataframeen, joka voidaan viedä tiedostoon:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
Voit tarkastella dataa vielä kerran käyttämällä
transformed_df.head()
jatransformed_df.info()
. Tallenna kopio tästä datasta tulevia oppitunteja varten:transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
Tämä uusi CSV löytyy nyt juuridatan kansiosta.
🚀Haaste
Tämä opetusohjelma sisältää useita mielenkiintoisia datasettejä. Tutki data
-kansioita ja katso, sisältävätkö ne datasettejä, jotka sopisivat binääriseen tai moniluokitteluun? Mitä kysymyksiä esittäisit tästä datasetistä?
Jälkiluennon kysely
Kertaus ja itseopiskelu
Tutki SMOTE:n APIa. Mihin käyttötarkoituksiin se sopii parhaiten? Mitä ongelmia se ratkaisee?
Tehtävä
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.