Skip to content

Latest commit

 

History

History
247 lines (169 loc) · 14.8 KB

File metadata and controls

247 lines (169 loc) · 14.8 KB

Kjøkkenklassifikatorer 1

I denne leksjonen skal du bruke datasettet du lagret fra forrige leksjon fullt av balansert, rent data om kjøkken.

Du skal bruke dette datasettet med en rekke klassifikatorer for å forutsi en gitt nasjonal kjøkken basert på en gruppe ingredienser. Mens du gjør dette, vil du lære mer om noen av måtene algoritmer kan utnyttes til klassifiseringsoppgaver.

Forberedelse

Forutsatt at du fullførte Leksjon 1, sørg for at en fil kalt cleaned_cuisines.csv finnes i rotmappen /data for disse fire leksjonene.

Øvelse - forutsi et nasjonalt kjøkken

  1. Arbeid i denne leksjonens notebook.ipynb-mappe, importer den filen sammen med Pandas-biblioteket:

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

    Dataene ser slik ut:

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
  1. Nå, importer flere biblioteker:

    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. Del X og y koordinatene inn i to dataframes for trening. cuisine kan være labels-dataframen:

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

    Det vil se slik ut:

    0    indian
    1    indian
    2    indian
    3    indian
    4    indian
    Name: cuisine, dtype: object
    
  3. Dropp kolonnen Unnamed: 0 og kolonnen cuisine ved å bruke drop(). Lagre resten av dataene som trenbare funksjoner:

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

    Funksjonene dine ser slik ut:

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å er du klar til å trene modellen din!

Velge klassifikatoren din

Nå som dataene dine er rene og klare for trening, må du bestemme hvilket algoritme du vil bruke.

Scikit-learn grupperer klassifisering under Overvåket Læring, og i den kategorien finner du mange måter å klassifisere på. Variasjonen kan virke overveldende ved første øyekast. Følgende metoder inkluderer alle klassifiseringsteknikker:

  • Lineære modeller
  • Støttevektormaskiner
  • Stokastisk gradientnedstigning
  • Nærmeste naboer
  • Gaussiske prosesser
  • Beslutningstrær
  • Ensemble-metoder (votering Klassifikator)
  • Multiklasse og multioutput-algoritmer (multiklasse og multilabel klassifisering, multiklasse-multioutput klassifisering)

Du kan også bruke nevrale nettverk for å klassifisere data, men det er utenfor omfanget av denne leksjonen.

Hvilken klassifikator skal du velge?

Så, hvilken klassifikator bør du velge? Ofte er det en god metode å prøve flere for å finne et godt resultat. Scikit-learn tilbyr en side-ved-side sammenligning på et opprettet datasett, som sammenligner KNeighbors, SVC på to måter, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB og QuadraticDiscrinationAnalysis, og viser resultatene visualisert:

sammenligning av klassifikatorer

Plottene er generert i Scikit-learns dokumentasjon

AutoML løser dette problemet elegant ved å kjøre disse sammenligningene i skyen, slik at du kan velge den beste algoritmen for dine data. Prøv det her

En bedre tilnærming

En bedre måte enn å gjette vilt på, er å følge ideene i dette nedlastbare ML jukseark. Her oppdager vi at for vårt multiklasseproblem, har vi noen valg:

jukseark for multiklasseproblemer

En seksjon fra Microsofts Algorithm Cheat Sheet, som detaljerer alternativer for multiklasseklassifisering

✅ Last ned dette juksearket, skriv det ut og heng det opp på veggen din!

Resonnement

La oss se om vi kan resonnere oss gjennom forskjellige tilnærminger gitt de begrensningene vi har:

  • Nevrale nettverk er for tunge. Gitt vårt rene, men minimale datasett, og at vi kjører treningen lokalt via notebooks, er nevrale nettverk for tunge for denne oppgaven.
  • Ingen to-klasses klassifikator. Vi bruker ikke en to-klassers klassifikator, så det utelukker one-vs-all.
  • Beslutningstre eller logistisk regresjon kan fungere. Et beslutningstre kan fungere, eller logistisk regresjon for multiklasse-data.
  • Multiklasse Boosted Decision Trees løser et annet problem. Multiklasse boosted beslutningstre er mest egnet for ikke-parametriske oppgaver, f.eks. oppgaver designet for å bygge rangeringer, så det er ikke nyttig for oss.

Bruke Scikit-learn

Vi skal bruke Scikit-learn for å analysere dataene våre. Det finnes imidlertid mange måter å bruke logistisk regresjon i Scikit-learn. Ta en titt på parametrene som kan settes.

I hovedsak er det to viktige parametere - multi_class og solver - som vi må spesifisere når vi spør Scikit-learn om å utføre logistisk regresjon. multi_class-verdien bestemmer en spesiell oppførsel. Verdien for solver er hvilken algoritme som skal brukes. Ikke alle solvere kan kombineres med alle multi_class-verdier.

Ifølge dokumentasjonen, i multiklasse-tilfelle, bruker treningsalgoritmen:

  • En en-mot-de-andre (OvR) ordning, hvis multi_class-alternativet settes til ovr
  • Krysstaps-tapet (cross-entropy loss), hvis multi_class-alternativet settes til multinomial. (Foreløpig støttes multinomial-alternativet kun av ‘lbfgs’, ‘sag’, ‘saga’ og ‘newton-cg’ solverne.)"

🎓 'Ordningen' her kan enten være 'ovr' (one-vs-rest) eller 'multinomial'. Fordi logistisk regresjon egentlig er designet for binærklassifisering, tillater disse ordningene den å håndtere multiklasseklassifikasjonsoppgaver bedre. kilde

🎓 'Solveren' defineres som "algoritmen som skal brukes i optimaliseringsproblemet". kilde.

Scikit-learn tilbyr denne tabellen for å forklare hvordan solvere håndterer ulike utfordringer som forskjellige typer datastrukturer presenterer:

solvere

Øvelse - del opp dataene

Vi kan fokusere på logistisk regresjon for vårt første treningsforsøk siden du nylig lærte om sistnevnte i en tidligere leksjon. Del dataene dine i trenings- og testgrupper ved å kalle train_test_split():

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

Øvelse - bruk logistisk regresjon

Siden du bruker multiklasse-tilfelle, må du velge hvilket oppsett som skal brukes og hvilken solver som skal settes. Bruk LogisticRegression med en multiklasse-innstilling og liblinear solver til trening.

  1. Opprett en logistisk regresjon med multi_class satt til ovr og solveren satt til 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øv en annen solver som lbfgs, som ofte settes som standard

    Merk, bruk Pandas ravel funksjon for å flate ut dataene dine når det trengs.

    Nøyaktigheten er god, over 80%!

  2. Du kan se denne modellen i aksjon ved å teste en rad med data (#50):

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

    Resultatet printes:

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

    ✅ Prøv et annet radnummer og sjekk resultatene

  3. Grav dypere, du kan sjekke nøyaktigheten av denne prediksjonen:

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

    Resultatet skrives ut - Indisk mat er det beste gjetningen, med god sannsynlighet:

    0
    indian 0.715851
    chinese 0.229475
    japanese 0.029763
    korean 0.017277
    thai 0.007634

    ✅ Kan du forklare hvorfor modellen er ganske sikker på at dette er indisk mat?

  4. Få mer detalj ved å skrive ut en klassifiseringsrapport, slik du gjorde i regresjonsleksjonene:

    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

🚀Utfordring

I denne leksjonen brukte du dine rensede data for å bygge en maskinlæringsmodell som kan forutsi en nasjonal matrett basert på en rekke ingredienser. Ta deg tid til å lese gjennom de mange alternativene Scikit-learn tilbyr for å klassifisere data. Grav dypere inn i konseptet 'solver' for å forstå hva som skjer bak kulissene.

Gjennomgang og Selvstudium

Grav litt mer i matematikken bak logistisk regresjon i denne leksjonen

Oppgave

Studer løserne


Ansvarsfraskrivelse: Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten Co-op Translator. Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på dets opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feilaktige tolkninger som oppstår ved bruk av denne oversettelsen.