Skip to content

Latest commit

 

History

History
246 lines (169 loc) · 14.6 KB

File metadata and controls

246 lines (169 loc) · 14.6 KB

Köökide klassifikaatorid 1

Selles õppetükis kasutad andmekogumit, mille salvestasid eelmisest õppetükist, täis tasakaalustatud, puhast infot kõikide köökide kohta.

Sa kasutad seda andmekogumit mitmesuguste klassifikaatoritega, et ennustada kindlat rahvuskööki koostisosade grupi põhjal. Selle käigus õpid rohkem meetodite kohta, kuidas algoritme saab kasutada klassifitseerimisülesannetes.

Ettevalmistus

Eeldades, et oled lõpetanud Õppetüki 1, veendu, et puhastatud fail cleaned_cuisines.csv on olemas juurkaustas /data selleks neljaks õppetükiks.

Harjutus - rahvusköögi ennustamine

  1. Töötades selle õppetüki kaustas notebook.ipynb, impordi see 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 köök mandel angelika aniis aniisi_seeme õun õunabrandy aprikoos armagnac ... viski valge_leib valge_vein täistera_nisu_jahu vein puit bataat pärm jogurt suvikõrvits
0 0 india 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 1 india 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 2 india 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 3 india 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 4 india 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0
  1. Nüüd impordi veel mõningaid teeke:

    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. Jaga X ja y koordinaadid kaheks DataFrame’iks treenimiseks. küök võib olla sildi DataFrame:

    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
    
  3. Eemalda sarjad Unnamed: 0 ja küök drop() abil. Salvestage ülejäänud andmed treenimiseks sobivate tunnustena:

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

    Sinu tunnused näevad välja sellised:

mandel angelika aniis aniisi_seeme õun õunabrandy aprikoos armagnac artemisia artišokk ... viski valge_leib valge_vein täistera_nisu_jahu vein puit bataat pärm jogurt suvikõrvits
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 sinu andmed on puhtad ja treenimiseks valmis, pead otsustama, millist algoritmi kasutada.

Scikit-learn ühendab klassifikatsioonid Juhendatud Õppimise alla ning selles kategoorias leiad palju võimalusi klassifikatsiooniks. Valik on esmapilgul üsna segadusttekitav. Järgmised meetodid sisaldavad kõik klassifikatsioonitehnikaid:

  • Lineaarsed mudelid
  • Tugivektormasinad
  • Stohhastiline gradientlangus
  • Lähimad naabrid
  • Gaussi protsessid
  • Otsustuspuud
  • Ansamblimeetodid (hääletuskassifikaator)
  • Multiklasse ja multiväljundiga algoritmid (multiklasse ja multilabel klassifikatsioon, multiklasse-multiväljundiga klassifikatsioon)

Võid kasutada ka neurvõrke andmete klassifitseerimiseks, kuid see jääb selle õppetüki teemast väljapoole.

Millise klassifikaatori valida?

Millise klassifikaatori valida? Sageli testitakse ennast läbi erinevate variantide ja otsitakse head tulemust. Scikit-learn pakub kõrvuti võrdlust loodud andmestikul, võrdeldes KNeighbors, kahte SVC võimalust, GaussianProcessClassifierit, DecisionTreeClassifierit, RandomForestClassifierit, MLPClassifierit, AdaBoostClassifierit, GaussianNB ja QuadraticDiscrinationAnalysist ning kuvades tulemused visuaalselt:

klassifikaatorite võrdlus

Graafikud on genereeritud Scikit-learn dokumentatsioonis

AutoML lahendab selle probleemi kenasti, käivitades need võrdlused pilves, võimaldades valida parima algoritmi oma andmete jaoks. Proovi seda siin

Parem lähenemine

Parem kui lihtsalt meelevaldselt arvata, on järgida mõtteid selle allalaaditava ML petulehe põhjal. Siin saame teada, et meie mitmeklassilise probleemi puhul on mitmeid valikuid:

mitmeklassilise probleemi petuleht

Microsofti algoritmipetulehe osa, mis kirjeldab mitmeklassilise klassifikatsiooni võimalusi

✅ Laadi see petuleht alla, prindi välja ja kleebi seinale!

Loogika

Vaatame, kas suudame loogiliselt läbi mõelda erinevad lähenemised antud piirangute valguses:

  • Neurvõrgud on liiga mahukad. Arvestades meie puhast, kuid minimaalseid andmeid ning asjaolu, et me treenime lokaalselt notebookide kaudu, on neurvõrgud selleks ülesandeks liiga rasked.
  • Ühe- või kahekordse klassifikaatori puudumine. Me ei kasuta kaheklassi klassifikaatorit, seega välistatakse one-vs-all.
  • Otsustuspuu või logistiline regressioon võiks töötada. Otsustuspuu võiks töötada või logistiline regressioon mitmeklassiliste andmete jaoks.
  • Mitmeklassilised tugevdussõelad lahendavad teistsuguse probleemi. Mitmeklassiline tugevdusotsustuspuu sobib rohkem mitteparametrilisteks ülesanneteks, näiteks järjestuse loomiseks, seega see ei ole meile kasulik.

Scikit-learn kasutamine

Analüüsime andmeid Scikit-learniga. Siiski on logistilise regressiooni kasutamiseks Scikit-learnis palju viise. Vaata parameetrite dokumentatsiooni.

Põhimõtteliselt on kaks olulist parameetrit - multi_class ja solver -, mida pead määrama, kui palud Scikit-learnil logistilist regressiooni kasutada. multi_class määrab teatud käitumise, solver määrab algoritmi. Kõik lahendajad ei sobi kõigi multi_class väärtustega.

Dokumentatsiooni järgi, mitmeklassilises juhul kasutab treening:

  • one-vs-rest (OvR) skeemi, kui multi_class on ovr
  • ristentropia kaotust, kui multi_class on multinomial. (Praegu toetavad multinomial võimalust ainult ‘lbfgs’, ‘sag’, ‘saga’ ja ‘newton-cg’ lahendajad.)"

🎓 "Skeem" võib olla 'ovr' (üks-võrdne-kõigiga) või 'multinomial'. Kuna logistiline regressioon on mõeldud peamiselt binaarklassifikatsiooniks, võimaldavad need skeemid paremini käsitleda mitmeklassilisi klassifikatsioone. allikas

🎓 'Solver' on määratletud kui "optimeerimisprobleemis kasutatav algoritm". allikas.

Scikit-learn pakub selle tabeli, mis selgitab, kuidas erinevad lahendajad käitlevad erinevat tüüpi andmete omadusi:

lahendajad

Harjutus - andmete jagamine

Võime keskenduda logistilisele regressioonile oma esimeses treeningukatsetuses, sest sa just õppisid seda eelnevas õppetükis. Jaga andmed treening- ja testkomplektideks, kasutades 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 mitmeklassilist juhtumit, pead valima, millist skeemi kasutada ja millise lahendaja seada. Kasuta LogisticRegressioni mitmeklassilise seade ja lahendajaga liblinear treenimiseks.

  1. Loo logistiline regressioon seadistusega multi_class = ovr ja lahendajaga 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))

    ✅ Proovi ka teist lahendajat nagu lbfgs, mis on sageli vaikimisi seatud

    Märkus, kasuta Pandas ravel funktsiooni andmete tasandamiseks, kui vaja.

    Täpsus on hea, üle 80%!

  2. Sa saad seda mudelit toimimas näha, testides ühe rea (#50) andmeid:

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

    Tulemus trükitakse välja:

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

    ✅ Proovi teist rea numbrit ja vaata tulemusi

  3. Süvenedes võite kontrollida selle prognoosi 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()

    Tulemused prinditakse välja - India köök on selle parim aimdus, hea tõenäosusega:

    0
    indian 0.715851
    chinese 0.229475
    japanese 0.029763
    korean 0.017277
    thai 0.007634

    ✅ Kas saate seletada, miks mudel on üsna kindel, et tegemist on India köögiga?

  4. Saage täpsemat teavet, trükkides välja klassifikatsiooniraporti, nagu tegite regressioonitundides:

    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äljakutse

Selles õppetükis kasutasite oma puhastatud andmeid masinaõppemudeli loomiseks, mis suudab prognoosida riiklikku kööki koostisosade põhjal. Võtke aega, et lugeda läbi Scikit-learni pakutavad arvukad võimalused andmete klassifitseerimiseks. Süvenege rohkem 'lahendaja' (solver) mõistetesse, et mõista, mis toimub kaadri taga.

Kordamine & Iseteadmine

Süvenege natuke rohkem logistilise regressiooni matemaatikasse selles õppetükis

Kodutöö

Õppige lahendajaid


Vastutusest loobumine:
See dokument on tõlgitud kasutades tehisintellekti tõlkimisteenust Co-op Translator. Kuigi püüame tagada täpsust, palun pidage meeles, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Originaaldokument oma algkeeles tuleks pidada autoriteetseks allikaks. Kriitilise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei võta vastutust selle tõlke kasutamisest tingitud arusaamatuste ega valesti mõistmiste eest.