You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/no/4-Classification/2-Classifiers-1/README.md

15 KiB

Klassifisering av matretter 1

I denne leksjonen skal du bruke datasettet du lagret fra forrige leksjon, som inneholder balanserte og rene data om matretter.

Du vil bruke dette datasettet med ulike klassifiseringsmetoder for å forutsi en nasjonal matrett basert på en gruppe ingredienser. Mens du gjør dette, vil du lære mer om hvordan algoritmer kan brukes til klassifiseringsoppgaver.

Quiz før leksjonen

Forberedelse

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

Øvelse - forutsi en nasjonal matrett

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

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

    Dataen 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. Importer nå 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 etikett-datasettet:

    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. Fjern 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 klassifiseringsmetode

Nå som dataene dine er rene og klare for trening, må du bestemme hvilken algoritme du skal bruke til oppgaven.

Scikit-learn grupperer klassifisering under Supervised Learning, og i den kategorien finner du mange måter å klassifisere på. Utvalget kan virke overveldende ved første øyekast. Følgende metoder inkluderer klassifiseringsteknikker:

  • Lineære modeller
  • Support Vector Machines
  • Stokastisk gradientnedstigning
  • Nærmeste naboer
  • Gaussiske prosesser
  • Beslutningstrær
  • Ensemble-metoder (voting Classifier)
  • Multiklasse- og multioutput-algoritmer (multiklasse- og multilabel-klassifisering, multiklasse-multioutput-klassifisering)

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

Hvilken klassifiseringsmetode skal du velge?

Så, hvilken klassifiseringsmetode bør du velge? Ofte kan det være nyttig å teste flere metoder og se etter gode resultater. 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 QuadraticDiscriminationAnalysis, og viser resultatene visuelt:

sammenligning av klassifiseringsmetoder

Diagrammer generert fra 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 dataene dine. Prøv det her

En bedre tilnærming

En bedre tilnærming enn å gjette vilkårlig er å følge ideene i dette nedlastbare ML Cheat Sheet. Her oppdager vi at vi har noen valg for vårt multiklasse-problem:

jukselapp for multiklasse-problemer

En del av Microsofts Algorithm Cheat Sheet, som beskriver alternativer for multiklasse-klassifisering

Last ned denne jukselappen, skriv den ut, og heng den på veggen!

Resonnement

La oss se om vi kan resonnere oss frem til ulike tilnærminger gitt de begrensningene vi har:

  • Nevrale nettverk er for tunge. Gitt vårt rene, men minimale datasett, og det faktum at vi kjører trening lokalt via notebooks, er nevrale nettverk for tunge for denne oppgaven.
  • Ingen to-klasse klassifiserer. Vi bruker ikke en to-klasse klassifiserer, 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 Decision Trees 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 til å analysere dataene våre. Det finnes imidlertid mange måter å bruke logistisk regresjon i Scikit-learn. Ta en titt på parametrene du kan sende.

I hovedsak er det to viktige parametere - multi_class og solver - som vi må spesifisere når vi ber Scikit-learn om å utføre en logistisk regresjon. multi_class-verdien gir en viss oppførsel. Verdien av solver angir hvilken algoritme som skal brukes. Ikke alle solvers kan kombineres med alle multi_class-verdier.

Ifølge dokumentasjonen, i multiklasse-tilfellet, treningsalgoritmen:

  • Bruker one-vs-rest (OvR)-skjemaet, hvis multi_class-alternativet er satt til ovr
  • Bruker kryssentropitap, hvis multi_class-alternativet er satt til multinomial. (For øyeblikket støttes multinomial-alternativet kun av solverne lbfgs, sag, saga og newton-cg.)

🎓 'Skjemaet' her kan enten være 'ovr' (one-vs-rest) eller 'multinomial'. Siden logistisk regresjon egentlig er designet for å støtte binær klassifisering, lar disse skjemaene den håndtere multiklasse-klassifiseringsoppgaver bedre. kilde

🎓 'Solver' er definert som "algoritmen som skal brukes i optimaliseringsproblemet". kilde.

Scikit-learn tilbyr denne tabellen for å forklare hvordan solvers håndterer ulike utfordringer presentert av forskjellige typer datastrukturer:

solvers

Øvelse - del dataene

Vi kan fokusere på logistisk regresjon for vår første treningsrunde siden du nylig lærte om dette i en tidligere leksjon. Del dataene dine inn i trenings- og testgrupper ved å bruke 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-tilfellet, må du velge hvilket skjema du skal bruke og hvilken solver du skal sette. Bruk LogisticRegression med en multiklasse-innstilling og liblinear solver for å trene.

  1. Opprett en logistisk regresjon med multi_class satt til ovr og solver 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 er satt som standard

Merk, bruk Pandas ravel-funksjonen for å flate ut dataene dine når det er nødvendig. Nøyaktigheten er god på over 80%!

  1. Du kan se denne modellen i aksjon ved å teste én 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 skrives ut:

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

    Prøv et annet radnummer og sjekk resultatene

  2. For å gå dypere, kan du sjekke nøyaktigheten til 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 modellens beste gjetning, med høy 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?

  3. Få mer detaljert informasjon ved å skrive ut en klassifikasjonsrapport, slik du gjorde i regresjonsleksjonene:

    y_pred = model.predict(X_test)
    print(classification_report(y_test,y_pred))
    
    presisjon recall f1-score støtte
    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
    nøyaktighet 0.80 1199
    makro snitt 0.80 0.80 0.80 1199
    vektet snitt 0.80 0.80 0.80 1199

🚀Utfordring

I denne leksjonen brukte du de rensede dataene dine til å 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. Gå dypere inn i konseptet 'solver' for å forstå hva som skjer i bakgrunnen.

Quiz etter forelesning

Gjennomgang & Selvstudium

Grav litt dypere i matematikken bak logistisk regresjon i denne leksjonen

Oppgave

Studer solverne


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å sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.