|
|
3 months ago | |
|---|---|---|
| .. | ||
| solution | 5 months ago | |
| README.md | 3 months ago | |
| assignment.md | 5 months ago | |
| notebook.ipynb | 10 months ago | |
README.md
Ruokakulttuurien luokittelijat 1
Tässä oppitunnissa käytät viimeiseltä oppitunnilta tallentamaasi tasapainoista, siistiä ruokakulttuureja käsittelevää aineistoa.
Käytät tätä aineistoa erilaisten luokittelijoiden kanssa ennustaaksesi tietyn kansallisen ruokakulttuurin perustuen joukkoon ainesosia. Samalla opit lisää erilaisista tavoista, joilla algoritmeja voidaan hyödyntää luokittelutehtävissä.
Luennon ennakkotentti
Valmistautuminen
Oletetaan, että olet suorittanut Oppitunti 1, varmista että cleaned_cuisines.csv -tiedosto on olemassa /data-kansion juuressa näitä neljää oppituntia varten.
Harjoitus - ennusta kansallinen ruokakulttuuri
-
Työskentele tässä oppitunnin notebook.ipynb-kansiossa ja tuo tiedosto yhdessä Pandas-kirjaston kanssa:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()Data näyttää 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 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Tuo nyt useita muita kirjastoja:
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve from sklearn.svm import SVC import numpy as np -
Jaa X- ja y-koordinaatit kahdeksi dataframeksi koulutusta varten.
cuisinevoi olla labelien dataframe:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()Se näyttää tältä:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
Pudota
Unnamed: 0-sarake jacuisine-sarake kutsumalladrop(). Tallenna loput datasta koulutettaviksi ominaisuuksiksi:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Ominaisuutesi näyttävät tältä:
| almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Nyt olet valmis kouluttamaan mallisi!
Luokittelijan valinta
Nyt kun data on puhdas ja valmis koulutukseen, sinun täytyy päättää, mitä algoritmia käyttää.
Scikit-learn ryhmittelee luokittelun ohjattuun oppimiseen, ja tässä kategoriassa on monia tapoja luokitella. Monipuolisuus voi ensi näkemältä olla hämmentävää. Seuraavat menetelmät sisältävät kaikki luokittelutekniikoita:
- Lineaariset mallit
- Tukivektorikoneet
- Stokastinen gradienttilaskenta
- Lähimmät naapurit
- Gaussiset prosessit
- Päätöspuut
- Kokonaismenetelmät (äänestävä luokittelija)
- Moniluokka- ja usean ulostulon algoritmit (moniluokkainen ja monimerkintäinen luokittelu, moniluokkainen usean ulostulon luokittelu)
Voit myös käyttää neuroverkkoja datan luokitteluun, mutta se on tämän oppitunnin ulkopuolella.
Mikä luokittelija valitaan?
Joten, minkä luokittelijan valitset? Usein on järkevää kokeilla useampaa ja etsiä hyvää tulosta. Scikit-learn tarjoaa rinnakkaisvertailun luodulla datalla vertaillen KNeighborsia, kahta SVC-versiota, GaussianProcessClassifieria, DecisionTreeClassifieria, RandomForestClassifieria, MLPClassifieria, AdaBoostClassifieria, GaussianNB:tä ja QuadraticDiscrinationAnalysistä tuloksineen visuaalisesti:
Kaaviot luotu Scikit-learnin dokumentaatiossa
AutoML ratkaisee tämän ongelman siististi ajamalla nämä vertailut pilvessä, jolloin voit valita parhaan algoritmin datallesi. Kokeile sitä tässä
Parempi lähestymistapa
Parempi tapa kuin arvailla villeinä on seurata tämän ladattavan ML Cheat sheetin vinkkejä. Sieltä löydämme, että moniluokkaiseen ongelmaamme on muutama vaihtoehto:
Ote Microsoftin algoritmivinkkilistasta, joka kuvaa moniluokkalun luokitteluvaihtoehtoja
✅ Lataa tämä vinkkilista, tulosta se ja laita seinällesi roikkumaan!
Päättely
Katsotaan, voimmeko perustella eri lähestymistavat annetuin rajoituksin:
- Neuroverkot ovat liian raskaita. Ottaen huomioon puhtaan, mutta pienen datasetimme ja että koulutus tapahtuu paikallisesti muistikirjojen kautta, neuroverkot ovat liian raskaita tähän tehtävään.
- Ei kaksiluokkaista luokittelijaa. Emme käytä kaksiluokkaista luokittelijaa, joten one-vs-all suljetaan pois.
- Päätöspuu tai logistinen regressio voisi toimia. Päätöspuu voisi toimia, samoin logistinen regressio moniluokkaiseen dataan.
- Moniluokkainen Boosted Decision Trees ratkaisee eri ongelman. Moniluokkainen vahvistettu päätöspuu soveltuu paremmin parametrisiin tehtäviin, kuten rankingien rakentamiseen, joten se ei ole meille käyttökelpoinen.
Scikit-learnin käyttö
Käytämme Scikit-learnia datan analysointiin. Kuitenkin logistiikkaregressiota on monia erilaisia tapoja käyttää Scikit-learnissa. Tutustu parametreihin.
Käytännössä tärkeimmät parametrit ovat multi_class ja solver - joita tarvitsee määrittää pyytäessämme Scikit-learnia suorittamaan logistisen regression. multi_class määrittää tietyn käyttäytymisen. solver on käytettävä algoritmi. Kaikki solverit eivät sovi yhteen kaikkien multi_class -arvojen kanssa.
Dokumenttien mukaan moniluokkaisessa tapauksessa koulutusalgoritmi:
- Käyttää one-vs-rest (OvR) -metodia, jos
multi_classon asetettu arvoksiovr - Käyttää ristientropiahäviötä, jos
multi_classon asetettu arvoksimultinomial. (Tällä hetkellämultinomialon tuettu vainlbfgs,sag,sagajanewton-cg-solverien kanssa.)
🎓 'Skenaario' voi olla 'ovr' (one-vs-rest) tai 'multinomial'. Koska logistinen regressio on suunniteltu binääriluokitteluun, nämä skenaariot mahdollistavat paremman tuen moniluokkaluille luokittelutehtäville. lähde
🎓 'Solveri' on määritelty algoritmiksi, jota käytetään optimointiongelmassa. lähde.
Scikit-learn tarjoaa tämän taulukon selittämään, miten solverit käsittelevät erilaisia datarakenteiden haasteita:
Harjoitus - jaa data
Voimme keskittyä logistiseen regressioon ensimmäisen koulutusyrityksenä, kun opit siitä hiljattain edellisellä tunnilla.
Jaa data koulutus- ja testiryhmiin kutsumalla train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Harjoitus - käytä logistista regressiota
Koska käytät moniluokkaista tapausta, sinun täytyy valita, mitä skenaariota ja solveria käytetään. Käytä LogisticRegressionia moniluokkaisella asetuksella ja liblinear-solveria kouluttaaksesi.
-
Luo logistinen regressio, jossa
multi_classon asetettuovr:ksi jasolverliblineariksi:lr = LogisticRegression(multi_class='ovr',solver='liblinear') model = lr.fit(X_train, np.ravel(y_train)) accuracy = model.score(X_test, y_test) print ("Accuracy is {}".format(accuracy))✅ Kokeile eri solveria, esimerkiksi
lbfgs, joka usein on oletusHuomaa, käytä Pandasin
ravel-funktiota, kun haluat tasoittaa dataasi tarvittaessa.Tarkkuus on hyvä, yli 80%!
-
Voit nähdä tämän mallin toiminnassa testaamalla yhden datarivin (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')Tuloste on:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian✅ Kokeile eri rivinumeroa ja tarkista tulokset
-
Digging deeper, you can check for the accuracy of this prediction:
test= X_test.iloc[50].values.reshape(-1, 1).T proba = model.predict_proba(test) classes = model.classes_ resultdf = pd.DataFrame(data=proba, columns=classes) topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) topPrediction.head()The result is printed - Indian cuisine is its best guess, with good probability:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Voitko selittää, miksi malli on melko varma, että kyseessä on intialainen keittiö?
-
Get more detail by printing a classification report, as you did in the regression lessons:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))precision recall f1-score support chinese 0.73 0.71 0.72 229 indian 0.91 0.93 0.92 254 japanese 0.70 0.75 0.72 220 korean 0.86 0.76 0.81 242 thai 0.79 0.85 0.82 254 accuracy 0.80 1199 macro avg 0.80 0.80 0.80 1199 weighted avg 0.80 0.80 0.80 1199
🚀Challenge
In this lesson, you used your cleaned data to build a machine learning model that can predict a national cuisine based on a series of ingredients. Take some time to read through the many options Scikit-learn provides to classify data. Dig deeper into the concept of 'solver' to understand what goes on behind the scenes.
Post-lecture quiz
Review & Self Study
Dig a little more into the math behind logistic regression in this lesson
Assignment
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, ole hyvä ja huomioi, että automatisoiduissa käännöksissä saattaa esiintyä virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäiskielellä tulee pitää auktoriteettisena lähteenä. Tärkeiden tietojen kohdalla suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa tämän käännöksen käytöstä johtuvista väärinkäsityksistä tai virheellisistä tulkinnoista.


