Konyhák osztályozói 1

April 20, 2026 · View on GitHub

Ebben a leckében a legutóbbi leckéből mentett, kiegyensúlyozott, tiszta adatokat tartalmazó, konyhákról szóló adathalmazt fogod használni.

Ezt az adathalmazt különféle osztályozókkal fogod használni, hogy megjósolj egy adott nemzeti konyhát egy alapanyagcsoport alapján. Miközben ezt teszed, többet megtudsz az algoritmusok osztályozási feladatokra való felhasználásának néhány módjáról.

Előadás előtti kvíz

Előkészület

Feltételezve, hogy befejezted az 1. leckét, győződj meg róla, hogy a cleaned_cuisines.csv fájl létezik a négy leckét lefedő gyökér /data mappában.

Gyakorlat - egy nemzeti konyha előrejelzése

  1. Az ebben a leckében található notebook.ipynb mappában importáld be a fájlt a Pandas könyvtárral együtt:

    import pandas as pd
    cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
    cuisines_df.head()
    

    Az adatok így néznek ki:

Unnamed: 0cuisinealmondangelicaaniseanise_seedappleapple_brandyapricotarmagnac...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00indian00000000...0000000000
11indian10000000...0000000000
22indian00000000...0000000000
33indian00000000...0000000000
44indian00000000...0000000010
  1. Most importálj be még több könyvtárat:

    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. Oszd szét az X és y koordinátákat két adattáblára tanításhoz. A cuisine lehet a címke adattábla:

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

    Így fog kinézni:

    0    indian
    1    indian
    2    indian
    3    indian
    4    indian
    Name: cuisine, dtype: object
    
  3. Dobd el az Unnamed: 0 oszlopot és a cuisine oszlopot drop() meghívásával. A maradék adatot mentsd el tanításra alkalmas jellemzőkként:

    cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
    cuisines_feature_df.head()
    

    A jellemzőid így néznek ki:

almondangelicaaniseanise_seedappleapple_brandyapricotarmagnacartemisiaartichoke...whiskeywhite_breadwhite_winewhole_grain_wheat_flourwinewoodyamyeastyogurtzucchini
00000000000...0000000000
11000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000010

Most készen állsz a modell betanítására!

Az osztályozó kiválasztása

Most, hogy az adatok tiszták és készek a tanításra, el kell döntened, melyik algoritmust használod a feladathoz.

A Scikit-learn az osztályozást a Felügyelt tanulás (Supervised Learning) alá sorolja, és ezen a területen sokféle módszert találsz. A választék először meglehetősen zavaró lehet. Az alábbi módszerek mind tartalmaznak osztályozási technikákat:

  • Lineáris modellek
  • Támogató vektor gépek (Support Vector Machines)
  • Stokasztikus gradiens csökkenés (Stochastic Gradient Descent)
  • Legközelebbi szomszédok (Nearest Neighbors)
  • Gaussi folyamatok
  • Döntési fák
  • Együttes módszerek (voting Classifier)
  • Többosztályos és többkimenetű algoritmusok (többosztályos és többcímkés osztályozás, többosztályos-többkimenetű osztályozás)

Neurális hálókat is használhatsz az adatok osztályozására, de ez nem része ennek a leckének.

Melyik osztályozót válasszam?

Tehát, melyik osztályozót válaszd? Gyakran jó módszer több osztályozó tesztelése, hogy melyik ad jó eredményt. A Scikit-learn kínál egy oldal-by-oldal összehasonlítást egy létrehozott adathalmazon, összehasonlítva KNeighbors, az SVC két módját, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB és QuadraticDiscrinationAnalysis eredményeit, vizualizálva:

osztályozók összehasonlítása

Grafikonok a Scikit-learn dokumentációjából

Az AutoML ezt a problémát szépen megoldja azáltal, hogy ezeket az összehasonlításokat a felhőben futtatja, lehetővé téve a legjobb algoritmus kiválasztását az adataidhoz. Próbáld ki itt

Egy jobb megközelítés

Egy jobb, mint találomra próbálgatni, ha követed az ötleteket ezen a letölthető ML Cheat sheet-en. Itt megtudjuk, hogy szakítós problémánk esetén néhány lehetőségünk van:

csalólap többosztályos problémákhoz

A Microsoft algoritmus csalólapjának egy része, a többosztályos osztályozási opciók részletezése

✅ Töltsd le ezt a csalólapot, nyomtasd ki, és tedd ki a faladra!

Érvelés

Nézzük meg, hogy hogyan gondolkodhatunk különböző megközelítésekről az adott feltételek mellett:

  • A neurális hálók túl nehezek. Adataink tiszták, de minimálisak, és mivel helyileg, notebookokban futtatjuk a tanítást, a neurális hálók túl nehézsúlyúak ehhez a feladathoz.
  • Nincs kétosztályos osztályozó. Nem használunk kétosztályos osztályozót, ezért kizárjuk az egy-az-összes elleni módszert.
  • A döntési fa vagy a logisztikus regresszió működhet. Egy döntési fa működhet, illetve a logisztikus regresszió többosztályos adatokra.
  • A többosztályos Boosted Decision Tree más problémát old meg. Ez a módszer inkább nem-paraméteres feladatokra alkalmas, például rangsorok készítésére, így nem hasznos nekünk.

Scikit-learn használata

A Scikit-learn-t használjuk adatelemzésre. Viszont számos módon lehet logisztikus regressziót alkalmazni benne. Nézd meg a paramétereket.

Alapvetően két fontos paraméter van – a multi_class és a solver –, amelyet meg kell adni a Scikit-learn-nek logisztikus regresszió kéréséhez. A multi_class egy bizonyos viselkedést határoz meg. A solver az alkalmazott algoritmust jelöli. Nem minden megoldó párosítható minden multi_class értékkel.

A dokumentáció szerint többosztályos esetben az algoritmus:

  • Az egy-az-összes (OvR) sémát használja, ha a multi_class opció ovr értékre van állítva
  • A keresztentrópia veszteséget használja, ha a multi_class beállítás multinomial. (Jelenleg a multinomial opciót csak az ‘lbfgs’, ‘sag’, ‘saga’ és ‘newton-cg’ megoldók támogatják.)"

🎓 Az itt lévő 'séma' lehet 'ovr' (egy-az-összes) vagy 'multinomial'. Mivel a logisztikus regresszió eredetileg bináris osztályozásra készült, ezek a sémák lehetővé teszik számára a többosztályos feladatok hatékonyabb kezelését. forrás

🎓 A 'solver' az "optimalizációs probléma megoldására használt algoritmust" jelenti. forrás.

A Scikit-learn az alábbi táblázattal mutatja be, miként kezelik a különböző megoldók az eltérő adatszerkezeteket:

megoldók

Gyakorlat - oszd fel az adatot

Az első tanítási próbánkhoz a logisztikus regresszióra koncentrálhatunk, hiszen ezt az előző leckében tanultad. Oszd fel az adataidat tanító és tesztelő csoportokra a train_test_split() meghívásával:

X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)

Gyakorlat - alkalmazz logisztikus regressziót

Mivel többosztályos esetet használsz, ki kell választanod, hogy milyen sémát és milyen megoldót használj. Használd a LogisticRegression-t többosztályos beállítással és liblinear megoldóval a tanításhoz.

  1. Hozz létre egy logisztikus regressziót, ahol multi_class értéke ovr, a solver pedig 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))
    

    ✅ Próbálj ki egy másik megoldót, például az alapértelmezett gyakran használt lbfgs-t.

    Megjegyzés: használd a Pandas ravel függvényét, ha szükséges az adatok kiterítése.

    Az pontosság jó, több mint 80%!

  2. Megnézheted ezt a modellt működés közben, ha megvizsgálsz egy adat sort (#50):

    print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
    print(f'cuisine: {y_test.iloc[50]}')
    

    Az eredmény kiírásra kerül:

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

    ✅ Próbálj ki egy másik sorszámot és nézd meg az eredményeket

  3. Mélyebbre ásva ellenőrizheted ennek az előrejelzésnek a pontosságát:

    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()
    

    Az eredmény kiírásra kerül - az indiai konyha a legvalószínűbb találat:

    0
    indian0.715851
    chinese0.229475
    japanese0.029763
    korean0.017277
    thai0.007634

    ✅ El tudod magyarázni, miért biztos a modell abban, hogy ez egy indiai konyha?

  4. Részletesebb információért nyomtasd ki a besorolási jelentést, ahogy a regressziós leckékben is tettél:

    y_pred = model.predict(X_test)
    print(classification_report(y_test,y_pred))
    
    precisionrecallf1-scoresupport
    chinese0.730.710.72229
    indian0.910.930.92254
    japanese0.700.750.72220
    korean0.860.760.81242
    thai0.790.850.82254
    accuracy0.801199
    macro avg0.800.800.801199
    weighted avg0.800.800.801199

🚀Kihívás

Ebben a leckében a megtisztított adatoddal építettél egy gépi tanulási modellt, amely egy sor összetevő alapján meg tudja jósolni a nemzeti konyhát. Szánj egy kis időt arra, hogy áttekintsd a Scikit-learn számos lehetőségét az adatok osztályozására. Mélyedj el a 'solver' fogalmában, hogy megértsd, mi zajlik a háttérben.

Előadás utáni kvíz

Áttekintés & Önálló tanulás

Merülj el egy kicsit mélyebben a logisztikus regresszió mögötti matematikában ebben a leckében

Házi feladat

A solver-ek tanulmányozása


Nyilatkozat: Ezt a dokumentumot az AI fordító szolgáltatás, a Co-op Translator segítségével fordítottuk. Bár a pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum a saját nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt a szakmai emberi fordítás igénybevétele. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy félreértelmezésekért.