|
|
3 months ago | |
|---|---|---|
| .. | ||
| solution | 5 months ago | |
| README.md | 3 months ago | |
| assignment.md | 5 months ago | |
| notebook.ipynb | 10 months ago | |
README.md
Razvrščevalci kuhinj 1
V tej lekciji boste uporabili podatkovni niz, ki ste ga shranili v zadnji lekciji, poln uravnoteženih, čistih podatkov o kuhinjah.
Ta podatkovni niz boste uporabili z različnimi razvrščevalci, da napovejo nacionalno kuhinjo glede na skupino sestavin. Med tem se boste naučili več o nekaterih načinih, kako je mogoče algoritme uporabiti za naloge razvrščanja.
Predpredavanja kviz
Priprava
Če ste zaključili Lekcijo 1, se prepričajte, da datoteka cleaned_cuisines.csv obstaja v korenski mapi /data za te štiri lekcije.
Naloga - napovedati nacionalno kuhinjo
-
V delovni mapi notebook.ipynb te lekcije uvozite to datoteko skupaj s knjižnico Pandas:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()Podatki izgledajo tako:
| 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 |
-
Zdaj uvozite še nekaj drugih knjižnic:
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 -
Razdelite spremenljivki X in y na dva podatkovna okvira za učenje.
cuisineje lahko podatkovni okvir z oznakami:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()Izgledalo bo takole:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
Odstranite stolpca
Unnamed: 0incuisinez uporabodrop(). Preostale podatke shranite kot značilke za učenje:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Vaše značilke izgledajo takole:
| 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 |
Zdaj ste pripravljeni za učenje modela!
Izbira razvrščevalca
Zdaj, ko so vaši podatki čisti in pripravljeni za učenje, morate izbrati algoritem za to nalogo.
Scikit-learn združuje razvrščanje pod Nadzorovanim učenjem, in v tej kategoriji boste našli veliko načinov za razvrščanje. Raznolikost je na prvi pogled precej zmedena. Naslednje metode vključujejo tehnike razvrščanja:
- Linearni modeli
- Podporni vektorski stroji
- Stohastični gradientni spust
- Najbližji sosedje
- Gausovi procesi
- Odločitvena drevesa
- Metode združevanja (voting Classifier)
- Multiklasni in multi-output algoritmi (multiklasno in multilabel razvrščanje, multiklasno multioutput razvrščanje)
Uporabiti lahko tudi nevronske mreže za razvrščanje podatkov, vendar to ni del te lekcije.
Kateri razvrščevalec izbrati?
Torej, katerega razvrščevalca izbrati? Pogosto je dobra praksa preizkusiti več razvrščevalcev in iskati lep rezultat. Scikit-learn ponuja primerjavo ob strani na ustvarjenem podatkovnem nizu, ki primerja KNeighbors, SVC na dva načina, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB in QuadraticDiscrinationAnalysis, ter prikazuje rezultate vizualno:
Grafi iz dokumentacije Scikit-learn
AutoML to težavo elegantno reši tako, da te primerjave izvaja v oblaku, kar vam omogoča izbiro najboljšega algoritma za vaše podatke. Poskusite tukaj
Boljši pristop
Boljši način kot naključno ugibanje je, da sledite idejam na tem prenosljivem ML Cheat sheetu. Tukaj odkrijemo, da imamo za naš multiklasni problem nekaj možnosti:
Del Microsoftovega Algorithm Cheat Sheeta, ki podrobno opisuje možnosti multiklasnega razvrščanja
✅ Prenesite ta cheat sheet, ga natisnite in obesite na steno!
Razlogi
Poglejmo, če lahko presodimo različne pristope glede na dane omejitve:
- Nevronske mreže so pretežke. Glede na naš čist, a minimalen podatkovni niz in dejstvo, da učenje izvajamo lokalno prek zvezkov, so nevronske mreže za to nalogo preveč težke.
- Ni razvrščevalca za dve razredi. Nimamo razvrščevalca za dve razredi, zato izključimo one-vs-all metodi.
- Odločitveno drevo ali logistična regresija bi delovala. Morda bi delovalo odločitveno drevo ali pa logistična regresija za multiklasne podatke.
- Multiklasno boostano odločitveno drevo rešuje drugačno težavo. Multiklasno boostano odločitveno drevo je najbolj primerno za neparametrične naloge, npr. naloge za izdelavo rangovanj, zato za nas ni uporabno.
Uporaba Scikit-learn
Za analizo podatkov bomo uporabljali Scikit-learn. Vendar obstaja veliko načinov uporabe logistične regresije v Scikit-learn. Poglejte si parametre, ki jih je mogoče nastaviti.
Ključno sta dva parametra - multi_class in solver - ki ju morate nastaviti, ko zahtevate od Scikit-learn, da izvede logistično regresijo. Vrednost multi_class določa določeno vedenje. Vrednost solver pa določa, kateri algoritem se bo uporabljal. Ne vsi reševalci (solverji) so združljivi z vsemi vrednostmi multi_class.
Po dokumentaciji v primeru multiklase učenja:
- Uporablja shemo one-vs-rest (OvR), če je
multi_classnastavljen naovr - Uporablja izgubo križne entropije, če je
multi_classnastavljen namultinomial. (Trenutno somultinomialmožnost podprte samo pri reševalcih ‘lbfgs’, ‘sag’, ‘saga’ in ‘newton-cg’)."
🎓 "Shema" je lahko 'ovr' (one-vs-rest) ali 'multinomial'. Ker je logistična regresija prvotno zasnovana za binarno razvrščanje, te sheme omogočajo boljše upravljanje nalog multiklasnega razvrščanja. vir
🎓 "Solver" je definiran kot "algoritem za reševanje optimizacijskega problema". vir.
Scikit-learn ponuja to tabelo, ki pojasnjuje, kako reševalci obravnavajo različne izzive, povezane z različnimi vrstami podatkovnih struktur:
Naloga - razdeliti podatke
Za našo prvo preizkusno učenje se lahko osredotočimo na logistično regresijo, saj ste o njej nedavno že izvedeli v prejšnji lekciji.
Podatke razdelite na učne in testne skupine z uporabo train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Naloga - uporabite logistično regresijo
Ker uporabljate multiklasni primer, morate izbrati, katero shemo uporabiti in kateri solver nastaviti. Uporabite LogisticRegression z nastavitvijo za multiklasno in solverjem liblinear za učenje.
-
Ustvarite logistično regresijo z multi_class nastavljeno na
ovrin solver nastavljen naliblinear: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))✅ Preizkusite drugačnega solverja, na primer
lbfgs, ki je pogosto privzetiOpomba: uporabite Pandas funkcijo
ravelza sploščitev podatkov, kadar je to potrebno.Natančnost je dobra in presega 80 %!
-
Model lahko preizkusite tudi tako, da testirate enega od vrstic podatkov (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')Rezultat se izpiše:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian✅ Preizkusite drugo številko vrstice in preverite rezultate
-
Če želite podrobneje raziskati, lahko preverite natančnost te napovedi:
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()Rezultat je izpisan - indijska kuhinja je najbolj verjetna napoved, z dobro verjetnostjo:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Ali lahko pojasnite, zakaj je model dokaj prepričan, da gre za indijsko kuhinjo?
-
Za več podrobnosti izpišite poročilo o klasifikaciji, kot ste to počeli v lekcijah o regresiji:
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
🚀Izziv
V tej lekciji ste uporabili očiščene podatke za izdelavo modela strojnega učenja, ki lahko napove nacionalno kuhinjo na osnovi vrste sestavin. Vzemite si čas in preberite različne možnosti, ki jih Scikit-learn ponuja za klasifikacijo podatkov. Podrobneje raziščite koncept 'solver', da razumete, kaj se dogaja v ozadju.
Kviz po predavanju
Pregled in samostojno učenje
Podrobneje raziščite matematiko za logistično regresijo v tej lekciji
Naloga
Omejitev odgovornosti: Ta dokument je bil preveden z uporabo storitve za samodejni prevod Co-op Translator. Čeprav si prizadevamo za natančnost, upoštevajte, da lahko samodejni prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku velja za avtoritativni vir. Za ključne informacije priporočamo strokoven človeški prevod. Za morebitne nesporazume ali napačne interpretacije, ki nastanejo zaradi uporabe tega prevoda, ne odgovarjamo.


