|
|
3 months ago | |
|---|---|---|
| .. | ||
| solution | 5 months ago | |
| README.md | 3 months ago | |
| assignment.md | 5 months ago | |
| notebook.ipynb | 11 months ago | |
README.md
Cuisine classifiers 1
Sa leksiyong ito, gagamitin mo ang dataset na iyong in-save mula sa nakaraang leksiyon na puno ng balanseng, malinis na datos tungkol sa mga lutuin.
Gagamitin mo ang dataset na ito sa iba't ibang classifiers upang hulaan ang isang pambansang lutuin batay sa isang grupo ng mga sangkap. Habang ginagawa ito, matututo ka pa tungkol sa ilang paraan kung paano magagamit ang mga algorithm para sa mga classification na gawain.
Pre-lecture quiz
Preparation
Kung natapos mo na ang Lesson 1, siguraduhing may cleaned_cuisines.csv na file sa root /data folder para sa apat na leksiyon na ito.
Exercise - hulaan ang isang pambansang lutuin
-
Sa paglulunsad ng leksiyon na ito sa notebook.ipynb folder, i-import ang file kasama ng Pandas library:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()Ganito ang hitsura ng datos:
| 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 |
-
Ngayon, mag-import ng ilan pang mga library:
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 -
Hatiin ang X at y coordinates sa dalawang dataframes para sa training. Ang
cuisineay pwedeng gawing labels dataframe:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()Ganito ang magiging hitsura nito:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
I-drop ang
Unnamed: 0na column at angcuisinena column gamit angdrop(). I-save ang natitirang data bilang trainable features:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Ganito ang hitsura ng iyong mga features:
| 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 |
Handa ka nang i-train ang iyong modelo!
Pagpili ng iyong classifier
Ngayon na malinis at handa na ang iyong datos para sa training, kailangan mong pumili kung anong algorithm ang gagamitin para sa gawain.
Pinasasaklaw ng Scikit-learn ang classification sa ilalim ng Supervised Learning, at sa kategoryang iyon makikita mo ang maraming paraan upang magklasipika. Ang iba't ibang uri ay nakakahilo sa unang tingin. Kasama sa mga sumusunod na paraan ang iba’t ibang teknik para sa classification:
- Linear Models
- Support Vector Machines
- Stochastic Gradient Descent
- Nearest Neighbors
- Gaussian Processes
- Decision Trees
- Ensemble methods (voting Classifier)
- Multiclass at multioutput algorithms (multiclass at multilabel classification, multiclass-multioutput classification)
Maaari mo ring gamitin ang neural networks para magklasipika ng datos, ngunit ito ay lampas sa saklaw ng leksiyong ito.
Alin ang classifier na pipiliin?
Kaya, alin nga ba ang classifier na pipiliin mo? Madalas, ang pagtakbo ng ilan at paghahanap ng magandang resulta ay isang paraan ng pagsubok. Nagbibigay ang Scikit-learn ng side-by-side comparison sa isang ginawa na dataset, na ikinukumpara ang KNeighbors, SVC sa dalawang paraan, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB at QuadraticDiscrinationAnalysis, na ipinapakita ang mga resulta na na-visualize:
Mga plot na ginawa mula sa dokumentasyon ng Scikit-learn
Nilulutas ng AutoML ang problemang ito nang maayos sa pamamagitan ng pagpapatakbo ng mga paghahambing na ito sa cloud, na nagbibigay-daan sa iyo upang piliin ang pinakamahusay na algorithm para sa iyong datos. Subukan ito dito
Isang mas mabuting pamamaraan
Isang mas mabuting paraan, kaysa sa bulag na paghuhula, ay ang sundin ang mga ideya sa nai-download na ML Cheat sheet. Dito, natuklasan natin na, para sa ating multiclass na problema, may ilang pagpipilian tayo:
Isang bahagi ng Microsoft's Algorithm Cheat Sheet, na nagpapaliwanag ng mga pagpipilian para sa multiclass classification
✅ I-download ang cheat sheet na ito, i-print at idikit sa iyong dingding!
Pangangatwiran
Subukan nating hasain ang ating pag-iisip sa iba't ibang pamamaraan sa ibinigay na mga limitasyon natin:
- Masyadong mabigat ang neural networks. Dahil sa malinis ngunit minimal na dataset, at sapagkat nagpapatakbo tayo ng training nang lokal sa pamamagitan ng mga notebook, masyadong mabigat para sa gawain ito ang neural networks.
- Walang two-class classifier. Hindi natin ginagamit ang two-class classifier, kaya hindi nito kasama ang one-vs-all.
- Maaaring gumana ang decision tree o logistic regression. Maaaring gumana ang decision tree, o logistic regression para sa multiclass na datos.
- Iba ang nilulutas ng Multiclass Boosted Decision Trees. Ang multiclass boosted decision tree ay mas angkop para sa mga nonparametric na gawain, hal. gawain na nilalayong bumuo ng mga ranggo, kaya hindi ito kapaki-pakinabang para sa atin.
Paggamit ng Scikit-learn
Gagamitin natin ang Scikit-learn para suriin ang ating datos. Gayunpaman, maraming paraan upang gamitin ang logistic regression sa Scikit-learn. Tingnan ang mga parameter na ipapasa.
Sa pangkalahatan may dalawang mahahalagang parameter - multi_class at solver - na kailangang tukuyin kapag hilingin natin sa Scikit-learn na magsagawa ng logistic regression. Ang halaga ng multi_class ay nag-aaplay ng isang tiyak na pag-uugali. Ang halaga ng solver ay kung anong algorithm ang gagamitin. Hindi lahat ng solvers ay maaaring gamitin sa lahat ng multi_class na halaga.
Ayon sa dokumentasyon, sa multiclass na kaso, ang training algorithm:
- Gumagamit ng one-vs-rest (OvR) scheme, kung ang
multi_classay naka-set saovr - Gumagamit ng cross-entropy loss, kung ang
multi_classay naka-set samultinomial. (Sa kasalukuyan, angmultinomialay sinusuportahan lamang ng ‘lbfgs’, ‘sag’, ‘saga’ at ‘newton-cg’ na solvers.)"
🎓 Ang 'scheme' dito ay maaaring 'ovr' (one-vs-rest) o 'multinomial'. Dahil ang logistic regression ay dinisenyo talaga para sa binary classification, pinahihintulutan ng mga scheme na ito na mas mahusay itong makayanan ang multiclass classification tasks. source
🎓 Ang 'solver' ay tinukoy bilang "ang algorithm na gagamitin sa optimization problem". source.
Nag-aalok ang Scikit-learn ng talahanayan upang ipaliwanag kung paano hinahandle ng mga solvers ang iba't ibang hamon na dala ng iba't ibang uri ng istruktura ng datos:
Exercise - hatiin ang datos
Maaari tayong magpokus sa logistic regression para sa ating unang trial ng training dahil kamakailan mo lang itong natutunan sa isang naunang leksiyon.
Hatiin ang iyong datos sa training at testing na mga grupo gamit ang train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Exercise - ilapat ang logistic regression
Dahil ginagamit mo ang multiclass na kaso, kailangan mong pumili kung anong scheme ang gagamitin at anong solver ang ise-set. Gamitin ang LogisticRegression na may multiclass setting at ang liblinear solver para mag-train.
-
Gumawa ng logistic regression na naka-set ang multi_class sa
ovrat ang solver saliblinear: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))✅ Subukan ang ibang solver tulad ng
lbfgs, na madalas na default na ginagamitTandaan, gamitin ang Pandas
ravelfunction para i-flatten ang iyong datos kapag kailangan.Maganda ang accuracy, higit sa 80%!
-
Maaari mong makita ang modelong ito na gumagana sa pamamagitan ng pag-test ng isang row ng datos (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')Ang resulta ay ipi-print:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian✅ Subukan ang ibang bilang ng row at suriin ang mga resulta
-
Masusing suriin, maaari mong tingnan ang katumpakan ng prediksyon na ito:
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()Ipinapakita ang resulta - ang Indian na lutuing pagkain ang pinakamalapit na hula, na may magandang probabilidad:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Maaari mo bang ipaliwanag kung bakit medyo sigurado ang modelo na ito ay isang Indian na lutuing pagkain?
-
Kunin ang mas detalyadong impormasyon sa pamamagitan ng pagprint ng classification report, tulad ng ginawa mo sa mga aralin sa regression:
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
🚀Hamunin
Sa araling ito, ginamit mo ang malinis mong data upang bumuo ng machine learning model na maaaring hulaan ang isang pambansang lutuing pagkain base sa serye ng mga sangkap. Maglaan ng oras upang basahin ang maraming opsyon na inaalok ng Scikit-learn para mag-classify ng data. Masusing pag-aralan ang konsepto ng 'solver' upang maunawaan kung ano ang nangyayari sa likod ng mga tagpo.
Post-lecture quiz
Review & Pag-aaral sa Sarili
Suriin pa nang mas malalim ang matematika sa likod ng logistic regression sa araling ito
Takdang Aralin
Pagsusuri: Ang dokumentong ito ay isinalin gamit ang AI translation service na Co-op Translator. Habang nagsusumikap kami para sa katumpakan, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o di pagkakatugma. Ang orihinal na dokumento sa kanyang sariling wika ang dapat ituring na opisyal na sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na salin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na nagmula sa paggamit ng pagsasaling ito.


