|
|
3 months ago | |
|---|---|---|
| .. | ||
| solution | 5 months ago | |
| README.md | 3 months ago | |
| assignment.md | 5 months ago | |
| notebook.ipynb | 10 months ago | |
README.md
Virtuvių klasifikatoriai 1
Šiame pamokoje naudosite duomenų rinkinį, kurį išsaugojote iš paskutinės pamokos, pilną subalansuotų, švarių duomenų apie virtuves.
Naudosite šį duomenų rinkinį su įvairiais klasifikatoriais, kad numatytumėte tam tikrą nacionalinę virtuvę pagal ingredientų grupę. Tai darydami sužinosite daugiau apie kai kuriuos būdus, kaip algoritmai gali būti panaudoti klasifikavimo užduotims.
Išankstinis paskaitos testas
Paruošimas
Jei baigėte 1-ą pamoką, įsitikinkite, kad šių keturių pamokų metu turite cleaned_cuisines.csv failą pagrindiniame /data kataloge.
Užduotis - numatyti nacionalinę virtuvę
-
Šios pamokos notebook.ipynb aplanke importuokite tą failą kartu su Pandas biblioteka:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()Duomenys atrodo taip:
| 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 |
-
Dabar importuokite dar kelias bibliotekas:
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 -
Padalinkite X ir y koordinates į du duomenų kadrus treniravimui.
cuisinegali būti žymių duomenų kadras:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()Atrodys taip:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
Išmeskite
Unnamed: 0ircuisinestulpelius, naudodamidrop(). Likusius duomenis išsaugokite kaip treniruojamus požymius:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Jūsų požymiai atrodo taip:
| 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 |
Dabar jūs pasiruošę treniruoti modelį!
Klasifikatoriaus pasirinkimas
Kadangi jūsų duomenys švarūs ir pasiruošę mokymuisi, turite nuspręsti, kurį algoritmą naudoti šiai užduočiai.
Scikit-learn klasifikaciją priskiria prie Prižiūrimo mokymosi (Supervised Learning), o šioje kategorijoje rasite daug skirtingų būdų klasifikuoti. Įvairovė iš pirmo žvilgsnio yra ganėtinai didelė. Šie metodai visi apima klasifikavimo technikas:
- Linijiniai modeliai
- Atraminiai vektorių mašinos
- Stochastinis nuolydžio nusileidimas
- Artimiausių kaimynų metodas
- Gauso procesai
- Sprendimų medžiai
- Ansamblio metodai (voting Classifier)
- Keliaklasiai ir kelių išėjimų algoritmai (multiclass ir multilabel klasifikacija, multiclass-multioutput klasifikacija)
Taip pat galite naudoti dirbtinius neuroninius tinklus duomenims klasifikuoti, tačiau tai ne šios pamokos tema.
Kuri klasifikatorių pasirinkti?
Taigi, kurį klasifikatorių rinktis? Dažnai naudinga išbandyti kelis ir ieškoti geriausio rezultato. Scikit-learn siūlo šalia šalia palyginimą sukurtame duomenų rinkinyje, palyginant KNeighbors, SVC dviem būdais, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB ir QuadraticDiscrinationAnalysis, rodydami rezultatus vizualiai:
Grafikai pagal Scikit-learn dokumentaciją
AutoML šią problemą sprendžia efektyviai vykdydamas šiuos palyginimus debesyje ir leydamas išsirinkti geriausią algoritmą jūsų duomenims. Išbandykite čia
Geresnis požiūris
Tačiau geresnis būdas nei laužtu būdu spėlioti – sekti mintimis šioje atsisiunčiamoje ML „Cheat sheet“. Čia mes atrandame, kad mūsų keliaklasiui problemos sprendimui turime šiuos pasirinkimus:
Microsoft algoritmų „Cheat sheet“ ištrauka, aprašanti keliaklasių klasifikavimo galimybes
✅ Atsisiųskite šį lapelį, išspausdinkite ir prikabinkite prie sienos!
Argumentacija
Pažiūrėkime, ar galime pamąstyti apie skirtingus požiūrius atsižvelgiant į turimas sąlygas:
- Neuroniniai tinklai yra per sunkūs. Atsižvelgiant į švarius, bet minimaliai didelius duomenis ir faktą, kad mokymą vykdome vietoje su užrašų knygelėmis, neuroniniai tinklai yra per sunkūs šiai užduočiai.
- Nenaudojamas dviejų klasių klasifikatorius. Mes nenaudojame dviejų klasių klasifikatoriaus, taigi „one-vs-all“ metodas netinka.
- Sprendimų medis arba logistinė regresija gali veikti. Galėtų tikti sprendimų medis arba logistinė regresija keliaklasiams duomenims.
- Keliaklasiai stiprinami sprendimų medžiai sprendžia kitokį uždavinį. Keliakliai stiprinami sprendimų medžiai labiau tinka neparametrinėms užduotims, pvz., reitingų kūrimui, tad mums nėra naudingi.
Naudojant Scikit-learn
Naudosime Scikit-learn duomenų analizei. Tačiau logistinę regresiją Scikit-learn galima naudoti įvairiais būdais. Pažvelkite į parametrus, kuriuos reikia perduoti.
Iš esmės yra du svarbūs parametrai – multi_class ir solver – kuriuos reikia nurodyti prašant Scikit-learn atlikti logistinę regresiją. multi_class nustato tam tikrą elgesį. solver nurodo, kurį algoritmą naudoti. Ne visi sprendikliai tinka visiems multi_class parinkčių deriniams.
Pagal dokumentaciją, keliaklasiu atveju, treniravimo algoritmas:
- Naudoja one-vs-rest (OvR) schemą, jei
multi_classnustatyta įovr - Naudoja kryžminio entropijos nuostolio funkciją, jei
multi_classnustatyta įmultinomial. (Šiuo metumultinomialparinktis palaikoma tik sulbfgs,sag,sagairnewton-cgsprendikliais.)"
🎓 Čia „schema“ gali būti arba
ovr(one-vs-rest), arba „multinomial“. Kadangi logistinė regresija iš esmės skirta dvejetainiaiems klasifikavimo uždaviniams, šios schemos leidžia geriau tvarkyti keliaklasius uždavinius. šaltinis
🎓 „Solver“ apibrėžiamas kaip „algoritmas, naudojamas optimizacijos problemai spręsti“. šaltinis.
Scikit-learn pateikia lentelę, kurioje paaiškinama, kaip sprendikliai elgiasi su įvairiais duomenų struktūrų iššūkiais:
Užduotis - padalyti duomenis
Galime sutelkti dėmesį į logistinės regresijos naudojimą kaip pirmąjį treniravimo bandymą, kadangi tai ką tik peržiūrėjote ankstesnėje pamokoje.
Padalinkite duomenis į mokymo ir testavimo grupes, naudodami train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Užduotis - pritaikyti logistinę regresiją
Kadangi naudojate keliaklasių atvejį, turite pasirinkti, kokią schemą naudoti ir kokį sprendiklį nustatyti. Naudokite LogisticRegression su keliaklasių nustatymu ir liblinear sprendikliu mokymui.
-
Sukurkite logistinę regresiją su multi_class nustatytu į
ovrir sprendikliu į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))✅ Išbandykite kitą sprendiklį, pvz.
lbfgs, kuris dažnai yra numatytasisAtkreipkite dėmesį, kad kai reikia, naudokite Pandas
ravelfunkciją duomenims suplokšti.Tikslumas yra geras – virš 80%!
-
Galite pamatyti, kaip veikia šis modelis, ištestavę vieną duomenų eilutę (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')Rezultatas išspausdinamas:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian✅ Išbandykite kitą eilutės numerį ir patikrinkite rezultatus
-
Giliau nagrinėjant, galite patikrinti šio spėjimo tikslumą:
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()Rezultatas atspausdintas - geriausias spėjimas yra Indijos virtuvė, su gera tikimybe:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Ar galite paaiškinti, kodėl modelis yra gana tikras, kad tai yra Indijos virtuvė?
-
Gaukite daugiau detalių atspausdinę klasifikavimo ataskaitą, kaip darėte regresijos pamokose:
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
🚀Iššūkis
Šioje pamokoje naudojote savo išvalytus duomenis, kad sukurtumėte mašininio mokymosi modelį, galintį prognozuoti nacionalinę virtuvę pagal ingredientų rinkinį. Skirkite laiko perskaityti daugybę variantų, kuriuos Scikit-learn siūlo duomenų klasifikavimui. Gilinkitės į 'solver' sąvoką, kad suprastumėte, kas vyksta užkulisiuose.
Po paskaitos testas
Peržiūra ir savarankiškas mokymasis
Giliau nagrinėkite logistinės regresijos matematiką šioje pamokoje
Namų darbai
Atsakomybės atsisakymas:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą Co-op Translator. Nors stengiamės užtikrinti tikslumą, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritiniais atvejais rekomenduojamas profesionalus žmogaus vertimas. Mes neatsakome už jokius nesusipratimus ar neteisingus interpretavimus, kylant iš šio vertimo naudojimo.


