You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/cs/4-Classification/2-Classifiers-1
localizeflow[bot] 099125979f
chore(i18n): sync translations with latest source changes (chunk 1/1, 12 changes)
3 weeks ago
..
solution chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 3 months ago
README.md chore(i18n): sync translations with latest source changes (chunk 1/1, 12 changes) 3 weeks ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 3 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 8 months 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, čistých dat o kuchyních.

Tento dataset použijete s různými klasifikátory k predikci dané národní kuchyně na základě skupiny surovin. Při tom se dozvíte více o některých způsobech, jak lze algoritmy využít pro klasifikační úlohy.

Přednáškový kvíz

Příprava

Pokud 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ě

  1. Pracujte ve složce notebook.ipynb v této lekci, 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
  1. 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
    
  2. Rozdělte X a y do dvou dataframe pro trénování. cuisine může být dataframe s popisky:

    cuisines_label_df = cuisines_df['cuisine']
    cuisines_label_df.head()
    

    Bude to vypadat takto:

    0    indian
    1    indian
    2    indian
    3    indian
    4    indian
    Name: cuisine, dtype: object
    
  3. Odstraňte sloupec Unnamed: 0 a sloupec cuisine 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 na trénování modelu!

Volba klasifikátoru

Nyní, když jsou data čistá a připravená k tréninku, musíte se rozhodnout, který algoritmus použít.

Scikit-learn řadí klasifikaci pod Supervised Learning a v této kategorii najdete mnoho způsobů, jak klasifikovat. Pestrá nabídka může být zpočátku ohromující. Následující metody zahrnují klasifikační techniky:

  • Lineární modely
  • Support Vector Machines
  • Stochastic Gradient Descent
  • Nejbližší sousedé
  • Gaussian procesy
  • Rozhodovací stromy
  • Ensemble metody (voting Classifier)
  • Multitřídní a vícevýstupové algoritmy (multitřídní a multilabel klasifikace, multitřídní vícevýstupová klasifikace)

Můžete také použít neurální sítě k klasifikaci dat, ale to je mimo rozsah této lekce.

Jaký klasifikátor zvolit?

Takže, jaký klasifikátor zvolit? Často je dobré zkusit několik a hledat dobrý výsledek. Scikit-learn nabízí porovnání vedle sebe na vytvořeném datasetu, kde porovnává KNeighbors, SVC dvěma způsoby, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB a QuadraticDiscrinationAnalysis a výsledky vizualizuje:

comparison of classifiers

Grafy vytvořené v dokumentaci Scikit-learn

AutoML tento problém elegantně řeší tím, že tyto porovnání provádí v cloudu, což vám umožňuje vybrat nejlepší algoritmus pro vaše data. Vyzkoušejte to zde

Lepší přístup

Lepší než hádat naslepo je sledovat nápady z tohoto stahovatelného ML Cheat sheet. Zde zjistíte, že pro náš multitřídní problém máme několik možností:

cheatsheet for multiclass problems

Úsek z Microsoft Algorithm Cheat Sheet, zobrazující možnosti multitřídní klasifikace

Stáhněte si tento cheat sheet, vytiskněte si ho a pověste na zeď!

Uvažování

Podívejme se, zda můžeme logicky projít různými přístupy vzhledem k daným omezením:

  • Neurální sítě jsou příliš náročné. Vzhledem k našemu čistému, ale minimálnímu datasetu a tomu, že trénink probíhá lokálně přes notebooky, jsou neurální sítě příliš těžkopádné na tento úkol.
  • Žádný klasifikátor pro dvě třídy. Nepoužíváme klasifikátor pro dvě třídy, takže vylučujeme one-vs-all.
  • Rozhodovací strom nebo logistická regrese by mohly fungovat. Rozhodovací strom může fungovat, nebo logistická regrese pro multitřídní data.
  • Multitřídní Boosted Decision Trees řeší jiný problém. Multitřídní boosted decision tree je nejvhodnější pro neparametrické úlohy, např. úlohy navržené pro budování žebříčků, 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 v Scikit-learn použít logistickou regresi. Podívejte se na parametry, které lze předat.

V zásadě jsou dva důležité parametry - multi_class a solver - které musíme specifikovat, když požadujeme, aby Scikit-learn provedl logistickou regresi. Hodnota multi_class určuje chování. Hodnota solver určuje, jaký algoritmus se použije. Ne všechny solvery lze použít se všemi hodnotami multi_class.

Podle dokumentace v případě multitřídy:

  • Používá schéma one-vs-rest (OvR), pokud je volba multi_class nastavena na ovr
  • Používá funkci ztráty křížové entropie, pokud je volba multi_class nastavena na multinomial. (Momentálně jsou volby multinomial podporovány pouze solvery lbfgs, sag, saga a newton-cg)."

🎓 Schéma zde může být buď 'ovr' (one-vs-rest) nebo 'multinomial'. Jelikož je logistická regrese primárně navržena pro binární klasifikaci, tato schémata jí umožňují lépe zvládat multitřídní klasifikační úkoly. 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 jednotlivé solvery zvládají různé výzvy datových struktur:

solvers

Cvičení - rozdělení dat

Můžeme se zaměřit na logistickou regresi pro náš první tréninkový pokus, protože jste se o ní nedávno učili v předchozí lekci. Rozdělte svá data do tréninkových a testovacích skupin voláním funkce 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

Protože používáte multitřídní případ, musíte zvolit, jaké schéma použít a jaký solver nastavit. Použijte LogisticRegression s multitřídním nastavením a liblinear solverem k tréninku.

  1. Vytvořte logistickou regresi s multi_class nastaveným na ovr a solverem liblinear:

    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 zploštění dat v případě potřeby.

    Přesnost je dobrá, přes 80 %!

  2. Model si můžete vyzkoušet na jednom řá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 vytisknut:

    ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
    cuisine: indian
    

    Vyzkoušejte jiný řádek a ověřte výsledky

  3. Pokud se do toho ponoříte hlouběji, můžete zkontrolovat přesnost tohoto předpovědního výsledku:

    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 jeho nejlepší odhad s dobrou pravděpodobností:

    0
    indian 0.715851
    chinese 0.229475
    japanese 0.029763
    korean 0.017277
    thai 0.007634

    Můžete vysvětlit, proč je model docela jistý, že se jedná o indickou kuchyni?

  4. Získejte více podrobností vytištěním klasifikační zprávy, jak jste to dě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 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ě řady ingrediencí. Věnujte čas přečtení si mnoha možností, které Scikit-learn poskytuje pro klasifikaci dat. Ponořte se hlouběji do konceptu „solver“ (řešiče), abyste pochopili, co se děje za scénou.

Kvíz po přednášce

Přehled a samostudium

Ponořte se více do matematiky za logistickou regresí v této lekci.

Zadání

Studujte řešiče


Upozornění:
Tento dokument byl přeložen pomocí AI překladatelské služby Co-op Translator. Přestože usilujeme 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 rodném jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné výklady vyplývající z použití tohoto překladu.