15 KiB
Virtuvės klasifikatoriai 1
Šioje pamokoje naudosite duomenų rinkinį, kurį išsaugojote iš ankstesnės pamokos, pilną subalansuotų ir švarių duomenų apie virtuvės tipus.
Naudodami šį duomenų rinkinį su įvairiais klasifikatoriais, prognozuosite tam tikrą nacionalinę virtuvę pagal ingredientų grupę. Tuo pačiu sužinosite daugiau apie tai, kaip algoritmai gali būti naudojami klasifikavimo užduotims.
Prieš paskaitos testas
Pasiruošimas
Jei baigėte 1 pamoką, įsitikinkite, kad cleaned_cuisines.csv failas yra /data
aplanke, skirtame šioms keturioms pamokoms.
Užduotis - prognozuoti nacionalinę virtuvę
-
Dirbdami šios pamokos notebook.ipynb aplanke, importuokite failą kartu su Pandas biblioteka:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()
Duomenys atrodo taip:
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 |
-
Dabar importuokite dar kelias bibliotekas:
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
-
Padalinkite X ir y koordinates į du duomenų rėmelius mokymui.
cuisine
gali būti etikečių duomenų rėmelis:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()
Tai atrodys taip:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object
-
Pašalinkite
Unnamed: 0
stulpelį ircuisine
stulpelį, naudodamidrop()
. Likusius duomenis išsaugokite kaip mokymui tinkamus požymius:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()
Jūsų požymiai atrodo taip:
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 |
Dabar esate pasiruošę treniruoti savo modelį!
Klasifikatoriaus pasirinkimas
Kai jūsų duomenys yra švarūs ir paruošti mokymui, turite nuspręsti, kokį algoritmą naudoti.
Scikit-learn klasifikavimą priskiria prie Prižiūrimo Mokymosi (Supervised Learning), ir šioje kategorijoje rasite daugybę būdų klasifikuoti. Įvairovė iš pradžių gali atrodyti gana paini. Šie metodai apima klasifikavimo technikas:
- Linijiniai modeliai
- Atramos vektorių mašinos (Support Vector Machines)
- Stochastinis gradientinis nusileidimas
- Artimiausi kaimynai
- Gauso procesai
- Sprendimų medžiai
- Ansamblio metodai (balsavimo klasifikatorius)
- Daugiaklasiai ir daugiatiksliai algoritmai (daugiaklasis ir daugiatikslis klasifikavimas)
Taip pat galite naudoti neuroninius tinklus duomenims klasifikuoti, tačiau tai nėra šios pamokos tema.
Kurį klasifikatorių pasirinkti?
Taigi, kurį klasifikatorių pasirinkti? Dažnai verta išbandyti kelis ir ieškoti geriausio rezultato. Scikit-learn siūlo palyginimą sukurto duomenų rinkinio pagrindu, lyginant KNeighbors, SVC dviem būdais, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB ir QuadraticDiscriminationAnalysis, vizualizuojant rezultatus:
Grafikai iš Scikit-learn dokumentacijos
AutoML išsprendžia šią problemą efektyviai, atlikdamas šiuos palyginimus debesyje, leidžiant jums pasirinkti geriausią algoritmą jūsų duomenims. Išbandykite čia
Geresnis požiūris
Geresnis būdas nei spėliojimas yra vadovautis idėjomis iš šio atsisiunčiamo ML Cheat Sheet. Čia sužinome, kad mūsų daugiaklasio problemos atveju turime keletą pasirinkimų:
Microsoft algoritmų cheat sheet dalis, apibūdinanti daugiaklasio klasifikavimo galimybes
✅ Atsisiųskite šį cheat sheet, atsispausdinkite ir pakabinkite ant sienos!
Argumentavimas
Pažiūrėkime, ar galime logiškai pasirinkti skirtingus metodus, atsižvelgdami į turimus apribojimus:
- Neuroniniai tinklai per sudėtingi. Atsižvelgiant į mūsų švarius, bet minimalius duomenis ir tai, kad mokymą vykdome lokaliai per užrašų knygeles, neuroniniai tinklai yra per sudėtingi šiai užduočiai.
- Dviejų klasių klasifikatorius netinka. Mes nenaudojame dviejų klasių klasifikatoriaus, todėl tai atmeta one-vs-all metodą.
- Sprendimų medis arba logistinė regresija galėtų veikti. Sprendimų medis galėtų veikti, arba logistinė regresija daugiaklasiams duomenims.
- Daugiaklasiai sustiprinti sprendimų medžiai sprendžia kitą problemą. Daugiaklasiai sustiprinti sprendimų medžiai labiausiai tinka neparametrinėms užduotims, pvz., užduotims, skirtoms sudaryti reitingus, todėl jie mums nėra naudingi.
Naudojant Scikit-learn
Naudosime Scikit-learn analizuoti mūsų duomenis. Tačiau yra daug būdų naudoti logistinę regresiją Scikit-learn. Pažvelkite į parametrus, kuriuos galima perduoti.
Iš esmės yra du svarbūs parametrai - multi_class
ir solver
- kuriuos reikia nurodyti, kai prašome Scikit-learn atlikti logistinę regresiją. multi_class
reikšmė taiko tam tikrą elgesį. Solver reikšmė nurodo, kokį algoritmą naudoti. Ne visi solver gali būti derinami su visomis multi_class
reikšmėmis.
Pagal dokumentaciją, daugiaklasio atveju mokymo algoritmas:
- Naudoja one-vs-rest (OvR) schemą, jei
multi_class
parinktis nustatyta kaipovr
- Naudoja kryžminio entropijos nuostolį, jei
multi_class
parinktis nustatyta kaipmultinomial
. (Šiuo metumultinomial
parinktis palaikoma tik su ‘lbfgs’, ‘sag’, ‘saga’ ir ‘newton-cg’ solver.)
🎓 Čia "schema" gali būti 'ovr' (one-vs-rest) arba 'multinomial'. Kadangi logistinė regresija iš esmės skirta dvejetainiam klasifikavimui, šios schemos leidžia jai geriau tvarkyti daugiaklasio klasifikavimo užduotis. šaltinis
🎓 "Solver" apibrėžiamas kaip "algoritmas, naudojamas optimizavimo problemoms spręsti". šaltinis.
Scikit-learn siūlo šią lentelę, kad paaiškintų, kaip solver sprendžia skirtingus iššūkius, kuriuos kelia skirtingos duomenų struktūros:
Užduotis - padalyti duomenis
Galime sutelkti dėmesį į logistinę regresiją pirmajam mokymo bandymui, nes neseniai apie ją mokėtės ankstesnėje pamokoje.
Padalykite savo duomenis į mokymo ir testavimo grupes, naudodami train_test_split()
:
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Užduotis - taikyti logistinę regresiją
Kadangi naudojate daugiaklasio atvejį, turite pasirinkti, kokią schemą naudoti ir kokį solver nustatyti. Naudokite LogisticRegression su multi_class nustatytu kaip ovr
ir solver nustatytu kaip liblinear
mokymui.
-
Sukurkite logistinę regresiją su multi_class nustatytu kaip
ovr
ir solver nustatytu kaipliblinear
: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))
✅ Išbandykite kitą solver, pvz.,
lbfgs
, kuris dažnai nustatomas kaip numatytasis.
Pastaba, naudokite Pandas
ravel
funkciją, kad prireikus suplokštintumėte savo duomenis. Tikslumas yra geras - daugiau nei 80%!
-
Galite pamatyti šio modelio veikimą, išbandydami vieną duomenų eilutę (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')
Rezultatas atspausdinamas:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian
✅ Išbandykite kitą eilutės numerį ir patikrinkite rezultatus.
-
Gilinantis, galite patikrinti šios prognozės tikslumą:
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()
Rezultatas atspausdinamas - Indijos virtuvė yra geriausia spėjimo galimybė, su gera tikimybe:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Ar galite paaiškinti, kodėl modelis yra gana tikras, kad tai Indijos virtuvė?
-
Gaukite daugiau informacijos, atspausdindami klasifikacijos ataskaitą, kaip tai darėte regresijos pamokose:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))
tikslumas atšaukimas f1-rezultatas palaikymas 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 tikslumas 0.80 1199 vidurkis 0.80 0.80 0.80 1199 svertinis vidurkis 0.80 0.80 0.80 1199
🚀Iššūkis
Šioje pamokoje naudojote išvalytus duomenis, kad sukurtumėte mašininio mokymosi modelį, galintį prognozuoti nacionalinę virtuvę pagal ingredientų seriją. Skirkite laiko perskaityti daugybę Scikit-learn siūlomų galimybių duomenų klasifikavimui. Gilinkitės į „sprendiklio“ (solver) koncepciją, kad suprastumėte, kas vyksta užkulisiuose.
Po paskaitos testas
Apžvalga ir savarankiškas mokymasis
Pasigilinkite į matematiką, slypinčią už logistinės regresijos, šioje pamokoje
Užduotis
Atsakomybės atsisakymas:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą Co-op Translator. Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius naudojant šį vertimą.