|
|
12 months ago | |
|---|---|---|
| .. | ||
| solution | 12 months ago | |
| README.md | 12 months ago | |
| assignment.md | 12 months ago | |
| notebook.ipynb | 12 months ago | |
README.md
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 partikular na pambansang lutuin batay sa isang grupo ng mga sangkap. Habang ginagawa ito, matututo ka pa tungkol sa iba't ibang paraan kung paano magagamit ang mga algorithm para sa mga gawain ng klasipikasyon.
Pre-lecture quiz
Paghahanda
Kung natapos mo na ang Aralin 1, siguraduhing mayroong cleaned_cuisines.csv na file sa root /data folder para sa apat na araling ito.
Ehersisyo - hulaan ang isang pambansang lutuin
-
Sa folder na 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, mag-import ng 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 pagsasanay. Ang
cuisineay maaaring 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: 0column at angcuisinecolumn gamit angdrop(). I-save ang natitirang data bilang mga trainable feature:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Ganito ang hitsura ng iyong mga feature:
| 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 sanayin ang iyong modelo!
Pagpili ng iyong classifier
Ngayon na ang iyong data ay malinis at handa na para sa pagsasanay, kailangan mong magdesisyon kung aling algorithm ang gagamitin para sa gawain.
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 mo ring gamitin ang neural networks upang mag-classify ng data, ngunit ito ay labas sa saklaw ng araling ito.
Aling classifier ang gagamitin?
Kaya, aling classifier ang dapat mong piliin? Madalas, ang pagsubok sa ilan at paghahanap ng magandang resulta ay isang paraan upang mag-eksperimento. Ang Scikit-learn ay nag-aalok ng isang side-by-side comparison sa isang nilikhang dataset, na inihahambing ang KNeighbors, SVC sa dalawang paraan, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB at QuadraticDiscriminationAnalysis, na ipinapakita ang mga resulta sa biswal na paraan:
Mga plot na nilikha mula sa dokumentasyon ng Scikit-learn
Ang AutoML ay mahusay na solusyon sa problemang ito sa pamamagitan ng pagsasagawa ng mga paghahambing na ito sa cloud, na nagbibigay-daan sa iyong pumili ng pinakamahusay na algorithm para sa iyong data. Subukan ito dito
Isang mas mahusay na paraan
Isang mas mahusay na paraan kaysa sa basta-basta 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 idikit ito sa iyong dingding!
Pangangatwiran
Tingnan natin kung kaya nating pangatwiranan ang iba't ibang mga pamamaraan batay sa mga limitasyon na mayroon tayo:
- Masyadong mabigat ang neural networks. Dahil sa ating malinis ngunit minimal na dataset, at ang katotohanang isinasagawa natin ang pagsasanay nang lokal gamit ang mga notebook, masyadong mabigat ang neural networks para sa gawaing ito.
- Hindi angkop ang 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, tulad ng mga gawain na idinisenyo upang bumuo ng mga ranggo, 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.
Sa esensya, may dalawang mahalagang parameter - multi_class at solver - na kailangan nating tukuyin kapag hinihiling natin sa Scikit-learn na magsagawa ng logistic regression. Ang halaga ng multi_class ay nag-aaplay ng partikular na pag-uugali. Ang halaga ng solver ay tumutukoy kung anong algorithm ang gagamitin. Hindi lahat ng solver ay maaaring ipares sa lahat ng multi_class na halaga.
Ayon sa dokumentasyon, sa kaso ng multiclass, ang training algorithm:
- Gumagamit ng one-vs-rest (OvR) scheme, kung ang
multi_classna opsyon ay nakatakda saovr - Gumagamit ng cross-entropy loss, kung ang
multi_classna opsyon ay nakatakda samultinomial. (Sa kasalukuyan, angmultinomialna opsyon ay sinusuportahan lamang ng ‘lbfgs’, ‘sag’, ‘saga’ at ‘newton-cg’ na mga solver.)
🎓 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 nagpapahintulot dito na mas mahusay na hawakan ang mga gawain ng multiclass classification. 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 hinaharap ng mga solver ang iba't ibang hamon na ipinapakita ng iba't ibang uri ng data structure:
Ehersisyo - hatiin ang data
Maaari tayong mag-focus sa logistic regression para sa ating unang pagsubok sa pagsasanay dahil kamakailan mo lang natutunan ang tungkol dito sa isang nakaraang aralin.
Hatiin ang iyong data sa mga grupo ng pagsasanay at pagsubok 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 na kaso, 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 pagsasanay.
-
Gumawa ng logistic regression na may multi_class na nakatakda sa
ovrat 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
ravelna function upang gawing patag ang iyong data kapag kinakailangan. Ang katumpakan ay maganda sa higit 80%!
-
Makikita mo ang modelong ito sa aksyon sa pamamagitan ng pagsubok ng 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
-
Kung nais mong mas maintindihan, 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 pinakamalapit na hula, na may mataas na posibilidad:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Kaya mo bang ipaliwanag kung bakit sigurado ang modelo na ito ay Indian cuisine?
-
Makakuha ng mas detalyadong impormasyon sa pamamagitan ng pag-print ng 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 mong data upang bumuo ng isang machine learning model na kayang hulaan ang isang national cuisine base sa mga sangkap. Maglaan ng oras upang basahin ang maraming opsyon na inaalok ng Scikit-learn para sa pag-classify ng data. Mas pag-aralan ang konsepto ng 'solver' upang maintindihan kung ano ang nangyayari sa likod ng proseso.
Post-lecture quiz
Review at Pag-aaral sa Sarili
Mas 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, pakitandaan 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.


