|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 2 weeks ago |
README.md
Klasifikátory kuchyní 1
V této lekci použijete dataset, který jste si uložili z minulé lekce, plný vyvážených a čistých dat o kuchyních.
Tento dataset použijete s různými klasifikátory k predikci národní kuchyně na základě skupiny ingrediencí. Přitom se dozvíte více o některých způsobech, jak lze algoritmy využít pro klasifikační úlohy.
Kvíz před lekcí
Příprava
Za předpokladu, že jste dokončili Lekci 1, ujistěte se, že soubor cleaned_cuisines.csv existuje v kořenové složce /data
pro tyto čtyři lekce.
Cvičení - predikce národní kuchyně
-
Pracujte ve složce notebook.ipynb této lekce, importujte tento soubor spolu s knihovnou Pandas:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()
Data vypadají takto:
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 |
-
Nyní importujte několik dalších knihoven:
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
-
Rozdělte souřadnice X a y do dvou datových rámců pro trénování.
cuisine
může být datový rámec s označeními:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()
Bude vypadat takto:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object
-
Odstraňte sloupec
Unnamed: 0
a sloupeccuisine
pomocídrop()
. Zbytek dat uložte jako trénovací vlastnosti:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()
Vaše vlastnosti vypadají takto:
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 |
Nyní jste připraveni trénovat svůj model!
Výběr klasifikátoru
Nyní, když jsou vaše data čistá a připravená k trénování, musíte se rozhodnout, jaký algoritmus použít.
Scikit-learn zařazuje klasifikaci pod Supervised Learning, a v této kategorii najdete mnoho způsobů klasifikace. Rozmanitost je na první pohled docela ohromující. Následující metody zahrnují techniky klasifikace:
- Lineární modely
- Support Vector Machines
- Stochastic Gradient Descent
- Nejbližší sousedé
- Gaussovské procesy
- Rozhodovací stromy
- Ensemble metody (hlasovací klasifikátor)
- Multiclass a multioutput algoritmy (multiclass a multilabel klasifikace, multiclass-multioutput klasifikace)
Můžete také použít neuronové sítě k klasifikaci dat, ale to je mimo rozsah této lekce.
Jaký klasifikátor zvolit?
Takže, jaký klasifikátor byste měli zvolit? Často je dobré vyzkoušet několik a hledat dobrý výsledek. Scikit-learn nabízí srovnání vedle sebe na vytvořeném datasetu, kde porovnává KNeighbors, SVC dvěma způsoby, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB a QuadraticDiscriminationAnalysis, a vizualizuje výsledky:
Grafy generované na dokumentaci Scikit-learn
AutoML tento problém elegantně řeší tím, že provádí tato srovnání v cloudu, což vám umožňuje vybrat nejlepší algoritmus pro vaše data. Vyzkoušejte to zde
Lepší přístup
Lepší způsob než náhodné hádání je však řídit se nápady z této stahovatelné ML Cheat Sheet. Zde zjistíme, že pro náš problém s více třídami máme několik možností:
Část Microsoft Algorithm Cheat Sheet, popisující možnosti klasifikace s více třídami
✅ Stáhněte si tento cheat sheet, vytiskněte ho a pověste na zeď!
Úvahy
Podívejme se, jestli dokážeme logicky projít různé přístupy vzhledem k omezením, která máme:
- Neuronové sítě jsou příliš náročné. Vzhledem k našemu čistému, ale minimálnímu datasetu a skutečnosti, že trénování provádíme lokálně pomocí notebooků, jsou neuronové sítě pro tuto úlohu příliš náročné.
- Žádný klasifikátor pro dvě třídy. Nepoužíváme klasifikátor pro dvě třídy, takže to vylučuje one-vs-all.
- Rozhodovací strom nebo logistická regrese by mohly fungovat. Rozhodovací strom by mohl fungovat, nebo logistická regrese pro data s více třídami.
- Multiclass Boosted Decision Trees řeší jiný problém. Multiclass Boosted Decision Tree je nejvhodnější pro neparametrické úlohy, např. úlohy určené k vytváření pořadí, takže pro nás není užitečný.
Použití Scikit-learn
Budeme používat Scikit-learn k analýze našich dat. Existuje však mnoho způsobů, jak použít logistickou regresi v Scikit-learn. Podívejte se na parametry k předání.
V podstatě existují dva důležité parametry - multi_class
a solver
- které musíme specifikovat, když požádáme Scikit-learn o provedení logistické regrese. Hodnota multi_class
aplikuje určité chování. Hodnota solveru určuje, jaký algoritmus použít. Ne všechny solvery lze kombinovat se všemi hodnotami multi_class
.
Podle dokumentace v případě klasifikace s více třídami trénovací algoritmus:
- Používá schéma one-vs-rest (OvR), pokud je možnost
multi_class
nastavena naovr
- Používá ztrátu křížové entropie, pokud je možnost
multi_class
nastavena namultinomial
. (V současné době je možnostmultinomial
podporována pouze solvery ‘lbfgs’, ‘sag’, ‘saga’ a ‘newton-cg’.)
🎓 'Schéma' zde může být buď 'ovr' (one-vs-rest) nebo 'multinomial'. Vzhledem k tomu, že logistická regrese je skutečně navržena pro podporu binární klasifikace, tato schémata jí umožňují lépe zvládat úlohy klasifikace s více třídami. zdroj
🎓 'Solver' je definován jako "algoritmus použitý v optimalizačním problému". zdroj.
Scikit-learn nabízí tuto tabulku, která vysvětluje, jak solvery zvládají různé výzvy, které představují různé typy datových struktur:
Cvičení - rozdělení dat
Můžeme se zaměřit na logistickou regresi pro náš první pokus o trénování, protože jste se o ní nedávno učili v předchozí lekci.
Rozdělte svá data na trénovací a testovací skupiny pomocí train_test_split()
:
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Cvičení - aplikace logistické regrese
Vzhledem k tomu, že používáte případ s více třídami, musíte si vybrat, jaké schéma použít a jaký solver nastavit. Použijte LogisticRegression s nastavením multi_class na ovr
a solverem na liblinear pro trénování.
-
Vytvořte logistickou regresi s multi_class nastaveným na
ovr
a solverem nastaveným 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))
✅ Vyzkoušejte jiný solver, například
lbfgs
, který je často nastaven jako výchozí
Poznámka: Použijte funkci Pandas
ravel
k vyrovnání vašich dat, když je to potřeba. Přesnost je dobrá na více než 80 %!
-
Můžete vidět tento model v akci testováním jednoho řádku dat (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')
Výsledek je vytištěn:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian
✅ Vyzkoušejte jiný číslo řádku a zkontrolujte výsledky.
-
Pokud se ponoříte hlouběji, můžete ověřit přesnost této predikce:
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()
Výsledek je vytištěn - indická kuchyně je nejlepší odhad s dobrou pravděpodobností:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Dokážete vysvětlit, proč si model je docela jistý, že se jedná o indickou kuchyni?
-
Získejte více detailů vytištěním klasifikační zprávy, stejně jako jste to udělali v lekcích o regresi:
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
🚀Výzva
V této lekci jste použili svá vyčištěná data k vytvoření modelu strojového učení, který dokáže předpovědět národní kuchyni na základě série ingrediencí. Věnujte nějaký čas prozkoumání mnoha možností, které Scikit-learn nabízí pro klasifikaci dat. Ponořte se hlouběji do konceptu 'solver', abyste pochopili, co se děje v zákulisí.
Kvíz po přednášce
Přehled & Samostudium
Prozkoumejte trochu více matematiku za logistickou regresí v této lekci
Úkol
Prohlášení:
Tento dokument byl přeložen pomocí služby pro automatický překlad Co-op Translator. Ačkoli se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.