Selles õppetükis kasutad andmekogumit, mille salvestasid eelmisest õppetükist, täis tasakaalustatud, puhast infot kõikide köökide kohta.
Sa kasutad seda andmekogumit mitmesuguste klassifikaatoritega, et ennustada kindlat rahvuskööki koostisosade grupi põhjal. Selle käigus õpid rohkem meetodite kohta, kuidas algoritme saab kasutada klassifitseerimisülesannetes.
Eeldades, et oled lõpetanud Õppetüki 1, veendu, et puhastatud fail cleaned_cuisines.csv on olemas juurkaustas /data selleks neljaks õppetükiks.
-
Töötades selle õppetüki kaustas notebook.ipynb, impordi see fail koos Pandas teegiga:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()
Andmed näevad välja sellised:
| Unnamed: 0 | köök | mandel | angelika | aniis | aniisi_seeme | õun | õunabrandy | aprikoos | armagnac | ... | viski | valge_leib | valge_vein | täistera_nisu_jahu | vein | puit | bataat | pärm | jogurt | suvikõrvits | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | india | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | india | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | india | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | india | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | india | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Nüüd impordi veel mõningaid teeke:
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
-
Jaga X ja y koordinaadid kaheks DataFrame’iks treenimiseks.
küökvõib olla sildi DataFrame:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()
See näeb välja selline:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
Eemalda sarjad
Unnamed: 0jaküökdrop()abil. Salvestage ülejäänud andmed treenimiseks sobivate tunnustena:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()
Sinu tunnused näevad välja sellised:
| mandel | angelika | aniis | aniisi_seeme | õun | õunabrandy | aprikoos | armagnac | artemisia | artišokk | ... | viski | valge_leib | valge_vein | täistera_nisu_jahu | vein | puit | bataat | pärm | jogurt | suvikõrvits | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
Nüüd oled valmis oma mudelit treenima!
Nüüd, kui sinu andmed on puhtad ja treenimiseks valmis, pead otsustama, millist algoritmi kasutada.
Scikit-learn ühendab klassifikatsioonid Juhendatud Õppimise alla ning selles kategoorias leiad palju võimalusi klassifikatsiooniks. Valik on esmapilgul üsna segadusttekitav. Järgmised meetodid sisaldavad kõik klassifikatsioonitehnikaid:
- Lineaarsed mudelid
- Tugivektormasinad
- Stohhastiline gradientlangus
- Lähimad naabrid
- Gaussi protsessid
- Otsustuspuud
- Ansamblimeetodid (hääletuskassifikaator)
- Multiklasse ja multiväljundiga algoritmid (multiklasse ja multilabel klassifikatsioon, multiklasse-multiväljundiga klassifikatsioon)
Võid kasutada ka neurvõrke andmete klassifitseerimiseks, kuid see jääb selle õppetüki teemast väljapoole.
Millise klassifikaatori valida? Sageli testitakse ennast läbi erinevate variantide ja otsitakse head tulemust. Scikit-learn pakub kõrvuti võrdlust loodud andmestikul, võrdeldes KNeighbors, kahte SVC võimalust, GaussianProcessClassifierit, DecisionTreeClassifierit, RandomForestClassifierit, MLPClassifierit, AdaBoostClassifierit, GaussianNB ja QuadraticDiscrinationAnalysist ning kuvades tulemused visuaalselt:
Graafikud on genereeritud Scikit-learn dokumentatsioonis
AutoML lahendab selle probleemi kenasti, käivitades need võrdlused pilves, võimaldades valida parima algoritmi oma andmete jaoks. Proovi seda siin
Parem kui lihtsalt meelevaldselt arvata, on järgida mõtteid selle allalaaditava ML petulehe põhjal. Siin saame teada, et meie mitmeklassilise probleemi puhul on mitmeid valikuid:
Microsofti algoritmipetulehe osa, mis kirjeldab mitmeklassilise klassifikatsiooni võimalusi
✅ Laadi see petuleht alla, prindi välja ja kleebi seinale!
Vaatame, kas suudame loogiliselt läbi mõelda erinevad lähenemised antud piirangute valguses:
- Neurvõrgud on liiga mahukad. Arvestades meie puhast, kuid minimaalseid andmeid ning asjaolu, et me treenime lokaalselt notebookide kaudu, on neurvõrgud selleks ülesandeks liiga rasked.
- Ühe- või kahekordse klassifikaatori puudumine. Me ei kasuta kaheklassi klassifikaatorit, seega välistatakse one-vs-all.
- Otsustuspuu või logistiline regressioon võiks töötada. Otsustuspuu võiks töötada või logistiline regressioon mitmeklassiliste andmete jaoks.
- Mitmeklassilised tugevdussõelad lahendavad teistsuguse probleemi. Mitmeklassiline tugevdusotsustuspuu sobib rohkem mitteparametrilisteks ülesanneteks, näiteks järjestuse loomiseks, seega see ei ole meile kasulik.
Analüüsime andmeid Scikit-learniga. Siiski on logistilise regressiooni kasutamiseks Scikit-learnis palju viise. Vaata parameetrite dokumentatsiooni.
Põhimõtteliselt on kaks olulist parameetrit - multi_class ja solver -, mida pead määrama, kui palud Scikit-learnil logistilist regressiooni kasutada. multi_class määrab teatud käitumise, solver määrab algoritmi. Kõik lahendajad ei sobi kõigi multi_class väärtustega.
Dokumentatsiooni järgi, mitmeklassilises juhul kasutab treening:
- one-vs-rest (OvR) skeemi, kui
multi_classonovr - ristentropia kaotust, kui
multi_classonmultinomial. (Praegu toetavadmultinomialvõimalust ainult ‘lbfgs’, ‘sag’, ‘saga’ ja ‘newton-cg’ lahendajad.)"
🎓 "Skeem" võib olla 'ovr' (üks-võrdne-kõigiga) või 'multinomial'. Kuna logistiline regressioon on mõeldud peamiselt binaarklassifikatsiooniks, võimaldavad need skeemid paremini käsitleda mitmeklassilisi klassifikatsioone. allikas
🎓 'Solver' on määratletud kui "optimeerimisprobleemis kasutatav algoritm". allikas.
Scikit-learn pakub selle tabeli, mis selgitab, kuidas erinevad lahendajad käitlevad erinevat tüüpi andmete omadusi:
Võime keskenduda logistilisele regressioonile oma esimeses treeningukatsetuses, sest sa just õppisid seda eelnevas õppetükis.
Jaga andmed treening- ja testkomplektideks, kasutades train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)Kuna kasutad mitmeklassilist juhtumit, pead valima, millist skeemi kasutada ja millise lahendaja seada. Kasuta LogisticRegressioni mitmeklassilise seade ja lahendajaga liblinear treenimiseks.
-
Loo logistiline regressioon seadistusega multi_class =
ovrja lahendajagaliblinear: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))
✅ Proovi ka teist lahendajat nagu
lbfgs, mis on sageli vaikimisi seatudMärkus, kasuta Pandas
ravelfunktsiooni andmete tasandamiseks, kui vaja.Täpsus on hea, üle 80%!
-
Sa saad seda mudelit toimimas näha, testides ühe rea (#50) andmeid:
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')
Tulemus trükitakse välja:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian✅ Proovi teist rea numbrit ja vaata tulemusi
-
Süvenedes võite kontrollida selle prognoosi täpsust:
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()
Tulemused prinditakse välja - India köök on selle parim aimdus, hea tõenäosusega:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Kas saate seletada, miks mudel on üsna kindel, et tegemist on India köögiga?
-
Saage täpsemat teavet, trükkides välja klassifikatsiooniraporti, nagu tegite regressioonitundides:
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
Selles õppetükis kasutasite oma puhastatud andmeid masinaõppemudeli loomiseks, mis suudab prognoosida riiklikku kööki koostisosade põhjal. Võtke aega, et lugeda läbi Scikit-learni pakutavad arvukad võimalused andmete klassifitseerimiseks. Süvenege rohkem 'lahendaja' (solver) mõistetesse, et mõista, mis toimub kaadri taga.
Süvenege natuke rohkem logistilise regressiooni matemaatikasse selles õppetükis
Vastutusest loobumine:
See dokument on tõlgitud kasutades tehisintellekti tõlkimisteenust Co-op Translator. Kuigi püüame tagada täpsust, palun pidage meeles, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Originaaldokument oma algkeeles tuleks pidada autoriteetseks allikaks. Kriitilise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei võta vastutust selle tõlke kasutamisest tingitud arusaamatuste ega valesti mõistmiste eest.


