16 KiB
Mga Classifier ng Lutuin 1
Sa araling ito, gagamitin mo ang dataset na na-save mo mula sa nakaraang aralin na puno ng balanseng, malinis na datos tungkol sa mga lutuin.
Gagamitin mo ang dataset na ito gamit ang iba't ibang classifier 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 gawain ng klasipikasyon.
Pre-lecture quiz
Paghahanda
Kung natapos mo na ang Aralin 1, tiyakin na mayroong cleaned_cuisines.csv file sa root /data
folder para sa apat na araling ito.
Ehersisyo - hulaan ang pambansang lutuin
-
Sa folder ng notebook.ipynb ng araling ito, i-import ang file na iyon kasama ang Pandas library:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()
Ganito ang hitsura ng data:
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, i-import ang ilang karagdagang 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 dataframe para sa training. Ang
cuisine
ay maaaring maging 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: 0
column at angcuisine
column gamit angdrop()
. I-save ang natitirang data bilang mga 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 |
Ngayon handa ka nang i-train ang iyong modelo!
Pagpili ng classifier
Ngayon na malinis na ang iyong data at handa na para sa training, kailangan mong magdesisyon kung anong algorithm ang gagamitin para sa trabaho.
Ang Scikit-learn ay nagkakategorya ng klasipikasyon sa ilalim ng Supervised Learning, at sa kategoryang iyon makakakita ka ng maraming paraan upang mag-classify. Ang iba't ibang pamamaraan ay maaaring nakakalito sa unang tingin. Ang mga sumusunod na pamamaraan ay lahat may kasamang mga teknik sa klasipikasyon:
- 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 ka ring gumamit ng neural networks upang mag-classify ng data, ngunit ito ay labas sa saklaw ng araling ito.
Anong classifier ang gagamitin?
Kaya, aling classifier ang dapat mong piliin? Madalas, ang pagsubok sa ilang classifier at paghahanap ng magandang resulta ay isang paraan upang mag-test. Ang Scikit-learn ay nag-aalok ng side-by-side comparison sa isang nilikhang dataset, na ikinukumpara ang KNeighbors, SVC dalawang paraan, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB at QuadraticDiscrinationAnalysis, na ipinapakita ang mga resulta sa visual na paraan:
Mga plot na nilikha mula sa dokumentasyon ng Scikit-learn
Ang AutoML ay maayos na nilulutas ang problemang ito sa pamamagitan ng pagtakbo ng mga paghahambing sa cloud, na nagbibigay-daan sa iyo upang piliin ang pinakamahusay na algorithm para sa iyong data. Subukan ito dito
Isang mas mahusay na paraan
Isang mas mahusay na paraan kaysa sa random na paghula ay ang sundin ang mga ideya sa downloadable na ML Cheat sheet. Dito, matutuklasan natin na, para sa ating multiclass na problema, mayroon tayong ilang mga pagpipilian:
Isang bahagi ng Algorithm Cheat Sheet ng Microsoft, na nagdedetalye ng mga opsyon para sa multiclass classification
✅ I-download ang cheat sheet na ito, i-print ito, at isabit sa iyong dingding!
Pangangatwiran
Tingnan natin kung kaya nating mag-isip ng iba't ibang paraan batay sa mga limitasyon na mayroon tayo:
- Masyadong mabigat ang neural networks. Dahil sa malinis ngunit minimal na dataset, at ang katotohanan na tayo ay nagta-training nang lokal gamit ang notebooks, masyadong mabigat ang neural networks para sa gawaing ito.
- Walang two-class classifier. Hindi tayo gagamit ng two-class classifier, kaya hindi natin gagamitin ang one-vs-all.
- Maaaring gumana ang decision tree o logistic regression. Maaaring gumana ang decision tree, o logistic regression para sa multiclass na data.
- Ang Multiclass Boosted Decision Trees ay para sa ibang problema. Ang multiclass boosted decision tree ay pinakaangkop para sa mga nonparametric na gawain, halimbawa mga gawain na idinisenyo upang bumuo ng rankings, kaya hindi ito kapaki-pakinabang para sa atin.
Paggamit ng Scikit-learn
Gagamitin natin ang Scikit-learn upang suriin ang ating data. Gayunpaman, maraming paraan upang gamitin ang logistic regression sa Scikit-learn. Tingnan ang mga parameter na maaaring ipasa.
May dalawang mahalagang parameter - multi_class
at solver
- na kailangan nating tukuyin kapag hinihiling natin sa Scikit-learn na magsagawa ng logistic regression. Ang multi_class
value ay nag-aaplay ng tiyak na behavior. Ang value ng solver ay ang algorithm na gagamitin. Hindi lahat ng solver ay maaaring ipares sa lahat ng multi_class
values.
Ayon sa dokumentasyon, sa multiclass na kaso, ang training algorithm:
- Gumagamit ng one-vs-rest (OvR) scheme, kung ang
multi_class
option ay nakatakda saovr
- Gumagamit ng cross-entropy loss, kung ang
multi_class
option ay nakatakda samultinomial
. (Sa kasalukuyan angmultinomial
option ay sinusuportahan lamang ng ‘lbfgs’, ‘sag’, ‘saga’ at ‘newton-cg’ solvers.)"
🎓 Ang 'scheme' dito ay maaaring 'ovr' (one-vs-rest) o 'multinomial'. Dahil ang logistic regression ay talagang idinisenyo upang suportahan ang binary classification, ang mga scheme na ito ay nagbibigay-daan dito upang mas mahusay na hawakan 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 na ito upang ipaliwanag kung paano hinahawakan ng mga solver ang iba't ibang hamon na ipinapakita ng iba't ibang uri ng data structures:
Ehersisyo - hatiin ang data
Maaari tayong mag-focus sa logistic regression para sa ating unang training trial dahil kamakailan mo itong natutunan sa nakaraang aralin.
Hatiin ang iyong data sa training at testing groups sa pamamagitan ng pagtawag sa train_test_split()
:
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Ehersisyo - gamitin ang logistic regression
Dahil gumagamit ka ng multiclass case, kailangan mong pumili kung anong scheme ang gagamitin at kung anong solver ang itatakda. Gumamit ng LogisticRegression na may multiclass setting at ang liblinear solver para sa training.
-
Gumawa ng logistic regression na may multi_class na nakatakda sa
ovr
at ang solver na nakatakda 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 nakatakda bilang default
Tandaan, gamitin ang Pandas
ravel
na function upang i-flatten ang iyong data kapag kinakailangan. Ang katumpakan ay maganda sa higit 80%!
-
Makikita mo ang modelong ito sa aksyon sa pamamagitan ng pagsubok sa isang hilera ng data (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')
Ang resulta ay naka-print:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian
✅ Subukan ang ibang numero ng hilera at suriin ang mga resulta
-
Masusing pagsusuri, maaari mong suriin 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()
Ang resulta ay naka-print - Indian cuisine ang pinakamagandang hula nito, na may magandang posibilidad:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Maaari mo bang ipaliwanag kung bakit sigurado ang modelo na ito ay Indian cuisine?
-
Makakuha ng mas detalyado sa pamamagitan ng pag-print ng isang classification report, tulad ng ginawa mo sa 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
🚀Hamunin
Sa araling ito, ginamit mo ang nalinis na data upang bumuo ng isang machine learning model na maaaring magpredikta ng pambansang cuisine batay sa isang serye ng mga sangkap. Maglaan ng oras upang basahin ang maraming opsyon na inaalok ng Scikit-learn para sa pag-classify ng data. Masusing pag-aralan ang konsepto ng 'solver' upang maunawaan ang nangyayari sa likod ng eksena.
Post-lecture quiz
Review & Pag-aaral sa Sarili
Masusing pag-aralan ang matematika sa likod ng logistic regression sa araling ito
Takdang Aralin
Paunawa:
Ang dokumentong ito ay isinalin gamit ang AI translation service na Co-op Translator. Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.