|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
Konyhai osztályozók 1
Ebben a leckében az előző leckében elmentett, kiegyensúlyozott és tiszta adatokkal teli adatállományt fogod használni, amely a különböző konyhákról szól.
Ezt az adatállományt különféle osztályozókkal fogod használni, hogy egy adott nemzeti konyhát megjósolj egy összetevőcsoport alapján. Eközben többet megtudhatsz arról, hogyan lehet algoritmusokat alkalmazni osztályozási feladatokhoz.
Előadás előtti kvíz
Felkészülés
Feltételezve, hogy befejezted az 1. leckét, győződj meg róla, hogy egy cleaned_cuisines.csv fájl létezik a gyökér /data
mappában ehhez a négy leckéhez.
Gyakorlat - egy nemzeti konyha megjóslása
-
Dolgozz ebben a lecke notebook.ipynb mappájában, és importáld 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: 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 |
-
Most importálj 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
-
Oszd fel az X és y koordinátákat két adatkeretre a tanításhoz. A
cuisine
lehet a címkéket tartalmazó adatkeret:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()
Ez így fog kinézni:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object
-
Dobd el az
Unnamed: 0
és acuisine
oszlopokat adrop()
hívásával. A többi adatot mentsd el tanítható jellemzőként:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()
A jellemzők így néznek ki:
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 |
Most készen állsz arra, hogy betanítsd a modelledet!
Osztályozó kiválasztása
Most, hogy az adataid tiszták és készen állnak a tanításra, el kell döntened, melyik algoritmust használod a feladathoz.
A Scikit-learn a felügyelt tanulás kategóriájába sorolja az osztályozást, és ebben a kategóriában számos módszert találsz az osztályozáshoz. A választék elsőre meglehetősen zavarba ejtő. Az alábbi módszerek mind tartalmaznak osztályozási technikákat:
- Lineáris modellek
- Támogató vektorgépek
- Stochasztikus gradiens csökkenés
- Legközelebbi szomszédok
- Gauss-folyamatok
- Döntési fák
- Együttes módszerek (szavazó osztályozó)
- Többosztályos és többkimenetes algoritmusok (többosztályos és többcímkés osztályozás, többosztályos-többkimenetes osztályozás)
Az adatok osztályozására neurális hálózatokat is használhatsz, de ez a lecke keretein kívül esik.
Melyik osztályozót válasszuk?
Tehát, melyik osztályozót válasszuk? Gyakran az a módszer, hogy több algoritmust kipróbálunk, és keresünk egy jó eredményt. A Scikit-learn kínál egy összehasonlítást egy létrehozott adatállományon, amely összehasonlítja a KNeighbors, SVC két módját, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB és QuadraticDiscriminationAnalysis algoritmusokat, és vizualizálja az eredményeket:
Diagramok a Scikit-learn dokumentációjából
Az AutoML elegánsan megoldja ezt a problémát azáltal, hogy ezeket az összehasonlításokat a felhőben futtatja, lehetővé téve, hogy kiválaszd a legjobb algoritmust az adataidhoz. Próbáld ki itt
Egy jobb megközelítés
Egy jobb módszer, mint a vad találgatás, az, hogy követjük az ötleteket ezen letölthető ML Cheat Sheet alapján. Itt felfedezzük, hogy a többosztályos problémánkhoz van néhány választási lehetőség:
A Microsoft Algoritmus Cheat Sheet egy szakasza, amely részletezi a többosztályos osztályozási lehetőségeket
✅ Töltsd le ezt a cheat sheetet, nyomtasd ki, és tedd ki a faladra!
Érvelés
Nézzük meg, hogy az adott korlátok alapján milyen megközelítéseket választhatunk:
- A neurális hálózatok túl nehezek. Tekintve, hogy az adatállományunk tiszta, de minimális, és hogy a tanítást helyben, notebookokon keresztül végezzük, a neurális hálózatok túl nehézkesek ehhez a feladathoz.
- Nincs kétosztályos osztályozó. Nem használunk kétosztályos osztályozót, így az egy-vs-minden kizárható.
- Döntési fa vagy logisztikus regresszió működhet. Egy döntési fa működhet, vagy logisztikus regresszió többosztályos adatokhoz.
- Többosztályos Boosted Decision Trees más problémát old meg. A többosztályos Boosted Decision Tree leginkább nemparaméteres feladatokhoz alkalmas, például rangsorok létrehozására, így számunkra nem hasznos.
Scikit-learn használata
A Scikit-learn-t fogjuk használni az adataink elemzésére. Azonban számos módja van annak, hogy logisztikus regressziót használjunk a Scikit-learn-ben. Nézd meg a paramétereket, amelyeket megadhatsz.
Lényegében két fontos paraméter van - multi_class
és solver
-, amelyeket meg kell határoznunk, amikor arra kérjük a Scikit-learn-t, hogy végezzen logisztikus regressziót. A multi_class
érték egy bizonyos viselkedést alkalmaz. A solver értéke az algoritmus, amelyet használni kell. Nem minden solver párosítható minden multi_class
értékkel.
A dokumentáció szerint a többosztályos esetben a tanítási algoritmus:
- Az egy-vs-minden (OvR) sémát használja, ha a
multi_class
opcióovr
-re van állítva - A keresztentrópia veszteséget használja, ha a
multi_class
opciómultinomial
-ra van állítva. (Jelenleg amultinomial
opciót csak az ‘lbfgs’, ‘sag’, ‘saga’ és ‘newton-cg’ solvers támogatják.)
🎓 A 'séma' itt lehet 'ovr' (egy-vs-minden) vagy 'multinomial'. Mivel a logisztikus regresszió valójában bináris osztályozás támogatására lett tervezve, ezek a sémák lehetővé teszik, hogy jobban kezelje a többosztályos osztályozási feladatokat. forrás
🎓 A 'solver' úgy van definiálva, mint "az algoritmus, amelyet az optimalizálási problémában használni kell". forrás.
A Scikit-learn ezt a táblázatot kínálja, hogy megmagyarázza, hogyan kezelik a solvers a különböző kihívásokat, amelyeket a különböző adatstruktúrák jelentenek:
Gyakorlat - az adatok felosztása
Koncentráljunk a logisztikus regresszióra az első tanítási próbánk során, mivel nemrég tanultál róla egy korábbi leckében.
Oszd fel az adataidat tanítási és tesztelési csoportokra a train_test_split()
hí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 - logisztikus regresszió alkalmazása
Mivel a többosztályos esetet használod, ki kell választanod, hogy milyen sémát és milyen solvert állíts be. Használj LogisticRegression-t többosztályos beállítással és a liblinear solverrel a tanításhoz.
-
Hozz létre egy logisztikus regressziót, ahol a multi_class
ovr
-re van állítva, és a solverliblinear
-re: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 solvert, például
lbfgs
, amelyet gyakran alapértelmezettként állítanak be
Megjegyzés: Használja a Pandas
ravel
függvényt az adatok lapításához, amikor szükséges. A pontosság 80% felett jó!
-
Ezt a modellt működés közben láthatod, ha tesztelsz 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 van nyomtatva:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian
✅ Próbálj ki egy másik sor számot, és ellenőrizd az eredményeket.
-
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 van nyomtatva - az indiai konyha a legjobb tippje, jó valószínűséggel:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Meg tudod magyarázni, miért gondolja a modell, hogy ez biztosan indiai konyha?
-
Szerezz több részletet egy osztályozási jelentés kinyomtatásával, ahogy a regressziós leckékben tetted:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))
pontosság visszahívás f1-érték támogatás 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 pontosság 0.80 1199 makro átlag 0.80 0.80 0.80 1199 súlyozott átlag 0.80 0.80 0.80 1199
🚀Kihívás
Ebben a leckében a megtisztított adataidat használtad egy gépi tanulási modell felépítéséhez, amely képes nemzeti konyhát előre jelezni egy sor összetevő alapján. Szánj időt arra, hogy átnézd a Scikit-learn által kínált számos lehetőséget az adatok osztályozására. Áss mélyebbre a 'solver' fogalmába, hogy megértsd, mi zajlik a háttérben.
Előadás utáni kvíz
Áttekintés és önálló tanulás
Áss egy kicsit mélyebbre a logisztikus regresszió matematikájában ebben a leckében
Feladat
Felelősség kizárása:
Ez a dokumentum az AI fordítási szolgáltatás, a Co-op Translator segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.