|
|
5 days ago | |
|---|---|---|
| .. | ||
| solution | 5 days ago | |
| README.md | 5 days ago | |
| assignment.md | 3 months ago | |
| notebook.ipynb | 3 months ago | |
README.md
Köögi klassifikaatorid 1
Selles tunnis kasutad eelmises tunnis salvestatud andmestikku, mis sisaldab tasakaalustatud ja puhastatud andmeid erinevate köökide kohta.
Seda andmestikku kasutatakse mitmesuguste klassifikaatoritega, et ennustada rahvuslikku kööki, lähtudes koostisosade grupist. Samal ajal õpid rohkem algoritmide kasutamise kohta klassifitseerimisülesannetes.
Eelloengu viktoriin
Ettevalmistus
Eeldades, et oled lõpetanud 1. tunni, veendu, et cleaned_cuisines.csv fail asub juurkataloogi /data kaustas, mis on mõeldud nende nelja tunni jaoks.
Harjutus - rahvusliku köögi ennustamine
-
Töötades selle tunni notebook.ipynb kaustas, impordi fail koos Pandas teegiga:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()Andmed näevad välja sellised:
| 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 |
-
Nüüd impordi veel mõned teegid:
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 -
Jaga X ja y koordinaadid kaheks andmeraamiks treenimiseks.
cuisinevõib olla siltide andmeraam:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()See näeb välja selline:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
Eemalda
Unnamed: 0jacuisineveerud, kasutadesdrop()funktsiooni. Salvesta ülejäänud andmed treenitavate omadustena:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Sinu omadused näevad välja sellised:
| 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 |
Nüüd oled valmis oma mudelit treenima!
Klassifikaatori valimine
Nüüd, kui andmed on puhastatud ja treenimiseks valmis, pead otsustama, millist algoritmi kasutada.
Scikit-learn liigitab klassifitseerimise juhendatud õppimise alla, ja selles kategoorias on palju erinevaid viise klassifitseerimiseks. Valik võib esmapilgul tunduda üsna segadusttekitav. Järgnevad meetodid sisaldavad kõik klassifitseerimistehnikaid:
- Lineaarsed mudelid
- Toetavate vektorite masinad
- Stohhastiline gradientide langus
- Lähimate naabrite meetod
- Gaussi protsessid
- Otsustuspuud
- Ansamblimeetodid (hääletav klassifikaator)
- Mitmeklassi ja mitme väljundi algoritmid (mitmeklassi ja mitmesildi klassifikatsioon, mitmeklassi-mitmeväljundi klassifikatsioon)
Võid kasutada ka närvivõrke andmete klassifitseerimiseks, kuid see jääb selle tunni teemast välja.
Millist klassifikaatorit valida?
Millist klassifikaatorit valida? Sageli on hea katsetada mitmeid ja otsida parimat tulemust. Scikit-learn pakub kõrvutavat võrdlust loodud andmestikul, võrreldes KNeighbors, SVC kahte viisi, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB ja QuadraticDiscriminationAnalysis, näidates tulemusi visualiseeritult:
Graafikud on genereeritud Scikit-learn'i dokumentatsioonis
AutoML lahendab selle probleemi elegantselt, tehes need võrdlused pilves ja võimaldades valida parima algoritmi sinu andmete jaoks. Proovi seda siin
Parem lähenemine
Parem viis kui lihtsalt juhuslikult arvata, on järgida ideid selle allalaaditava ML Cheat Sheet abil. Siin avastame, et meie mitmeklassi probleemi jaoks on mõned valikud:
Microsofti algoritmi spikri osa, mis kirjeldab mitmeklassi klassifikatsiooni valikuid
✅ Laadi see spikker alla, prindi see välja ja riputa seinale!
Põhjendamine
Vaatame, kas suudame erinevaid lähenemisi põhjendada, arvestades meie piiranguid:
- Närvivõrgud on liiga rasked. Arvestades meie puhast, kuid minimaalset andmestikku ja asjaolu, et treenime kohapeal märkmike kaudu, on närvivõrgud selle ülesande jaoks liiga rasked.
- Kaheklassi klassifikaator ei sobi. Me ei kasuta kaheklassi klassifikaatorit, seega välistame one-vs-all meetodi.
- Otsustuspuu või logistiline regressioon võiks sobida. Otsustuspuu võiks sobida, või logistiline regressioon mitmeklassi andmete jaoks.
- Mitmeklassi tõhustatud otsustuspuud lahendavad teistsuguse probleemi. Mitmeklassi tõhustatud otsustuspuu sobib kõige paremini mitteparametriliste ülesannete jaoks, näiteks ülesannete jaoks, mis on mõeldud järjestuste loomiseks, seega ei ole see meile kasulik.
Scikit-learn'i kasutamine
Kasutame Scikit-learn'i, et analüüsida oma andmeid. Siiski on palju viise, kuidas kasutada logistilist regressiooni Scikit-learn'is. Vaata parameetreid, mida saab määrata.
Sisuliselt on kaks olulist parameetrit - multi_class ja solver -, mida peame määrama, kui palume Scikit-learn'il teha logistilist regressiooni. multi_class väärtus rakendab teatud käitumist. Solveri väärtus määrab, millist algoritmi kasutada. Mitte kõik solverid ei sobi kõigi multi_class väärtustega.
Dokumentatsiooni järgi mitmeklassi puhul treeningalgoritm:
- Kasutab one-vs-rest (OvR) skeemi, kui
multi_classvalik on määratudovr - Kasutab ristentropia kaotust, kui
multi_classvalik on määratudmultinomial. (Praegu toetavadmultinomialvalikut ainult solverid ‘lbfgs’, ‘sag’, ‘saga’ ja ‘newton-cg’.)
🎓 'Skeem' võib olla kas 'ovr' (one-vs-rest) või 'multinomial'. Kuna logistiline regressioon on tegelikult mõeldud binaarse klassifikatsiooni toetamiseks, võimaldavad need skeemid paremini käsitleda mitmeklassi klassifikatsiooni ülesandeid. allikas
🎓 'Solver' on defineeritud kui "algoritm, mida kasutatakse optimeerimisprobleemi lahendamiseks". allikas.
Scikit-learn pakub seda tabelit, et selgitada, kuidas solverid käsitlevad erinevaid väljakutseid, mida esitavad erinevat tüüpi andmestruktuurid:
Harjutus - andmete jagamine
Keskendume logistilisele regressioonile meie esimese treeningkatse jaoks, kuna sa õppisid seda hiljuti eelmises tunnis.
Jaga oma andmed treening- ja testimisgruppideks, kutsudes train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Harjutus - logistilise regressiooni rakendamine
Kuna kasutad mitmeklassi juhtumit, pead valima, millist skeemi kasutada ja millist solverit määrata. Kasuta LogisticRegression'i mitmeklassi seadistusega ja liblinear solverit treenimiseks.
-
Loo logistiline regressioon, kus multi_class on määratud
ovrja solver määratudliblinear: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))✅ Proovi teist solverit, näiteks
lbfgs, mis on sageli määratud vaikimisi.Märkus: kasuta Pandas
ravelfunktsiooni, et vajadusel oma andmeid tasandada.Täpsus on hea, üle 80%!
-
Näed seda mudelit tegevuses, testides ühte andmerida (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')Tulemus trükitakse:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian
✅ Proovi teist rea numbrit ja kontrolli tulemusi
-
Süvenedes, saad kontrollida selle ennustuse täpsust:
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()Tulemus trükitakse välja - India köök on parim oletus, üsna suure tõenäosusega:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Kas oskad selgitada, miks mudel on üsna kindel, et tegemist on India köögiga?
-
Saad rohkem detaile, trükkides välja klassifikatsiooni aruande, nagu tegid regressiooni tundides:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))täpsus tagasikutsumine f1-skoor tugi 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 täpsus 0.80 1199 makro keskm. 0.80 0.80 0.80 1199 kaalutud keskm. 0.80 0.80 0.80 1199
🚀Väljakutse
Selles tunnis kasutasid puhastatud andmeid, et luua masinõppe mudel, mis suudab ennustada rahvuskööki koostisosade põhjal. Võta aega, et tutvuda Scikit-learn'i paljude võimalustega andmete klassifitseerimiseks. Süvene 'lahendaja' (solver) kontseptsiooni, et mõista, mis toimub kulisside taga.
Loengu järgne viktoriin
Ülevaade ja iseseisev õppimine
Süvene veidi rohkem logistilise regressiooni matemaatikasse selles tunnis
Ülesanne
Lahtiütlus:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.


