Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Train-Test-Splitt og Kryssvalidering | K-NN-Klassifikator
Klassifisering med Python

bookTrain-Test-Splitt og Kryssvalidering

I de forrige kapitlene bygde vi modellene og forutsa nye verdier. Men vi har ingen indikasjon på hvor godt modellen presterer, eller om disse prediksjonene er pålitelige.

Train-Test Split

For å måle modellens ytelse, trenger vi et delsett av merkede data som modellen ikke har sett. Derfor deler vi tilfeldig alle de merkede dataene inn i treningssett og testsett.

Dette kan oppnås ved å bruke funksjonen train_test_split() fra sklearn.

Vanligvis deler man modellen med omtrent 70-90 % til treningssettet og 10-30 % til testsettet.

Note
Merk

Når datasettet ditt har millioner av forekomster, er det vanligvis mer enn nok å bruke bare noen tusen til testing. I slike tilfeller kan du reservere til og med mindre enn 10 % av dataene til testing.

Nå kan vi trene modellen ved å bruke treningssettet og evaluere nøyaktigheten på testsettet.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Men denne tilnærmingen har noen svakheter:

  • Vi bruker ikke alle tilgjengelige data til trening, noe som kunne forbedret modellen vår;
  • Siden vi evaluerer modellens nøyaktighet på en liten del av dataene (testsettet), kan denne nøyaktighetsscoren være upålitelig på mindre datasett. Du kan kjøre koden ovenfor flere ganger og observere hvordan nøyaktigheten endres hver gang et nytt testsett velges.

Kryssvalidering

Kryssvalidering er utviklet for å håndtere problemet med overtilpasning og for å sikre at modellen kan generalisere godt til nye, ukjente data. Dette kan sammenlignes med klasseromstrening for modellen — det hjelper modellen å lære på en mer balansert måte før den møter den virkelige sluttprøven.

Prinsippet er å stokke hele datasettet og dele det inn i n like store deler, kalt folds. Deretter går modellen gjennom n iterasjoner. I hver iterasjon brukes n-1 folds til trening og 1 fold til validering. På denne måten blir hver del av dataene brukt til validering én gang, og vi får et mer pålitelig estimat av modellens ytelse.

Vær oppmerksom på at kryssvalidering ikke er ment å erstatte testsettet. Etter å ha brukt kryssvalidering for å velge og finjustere modellen, bør den evalueres på et separat testsett for å få en upartisk vurdering av ytelsen i praksis.

Note
Merk

Et vanlig valg for antall fold er 5. I dette tilfellet brukes én fold som testsett, og de resterende 4 foldene brukes til trening.

Vi trener fem modeller med litt forskjellige delmengder. For hver modell beregner vi nøyaktigheten på testsettet:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Når dette er gjort, kan vi beregne gjennomsnittet av disse 5 nøyaktighetsscorene, som vil være vår kryssvalideringsnøyaktighet:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Dette er mer pålitelig fordi vi beregnet nøyaktighetsscoren ved å bruke alle dataene våre – bare delt opp forskjellig i fem iterasjoner.

Nå som vi vet hvor godt modellen presterer, kan vi trene den opp på nytt ved å bruke hele datasettet.

Heldigvis tilbyr sklearn funksjonen cross_val_score() for å evaluere modellen ved hjelp av kryssvalidering, slik at du slipper å implementere det selv:

Her er et eksempel på hvordan du bruker kryssvalidering med en k-NN-modell trent på Star Wars-rangeringer datasettet:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Standardmålet som brukes for klassifisering er nøyaktighet.

question mark

Velg alle riktige påstander.

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 6

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Suggested prompts:

Can you explain the difference between train-test split and cross-validation?

How do I choose the right number of folds for cross-validation?

What are some common pitfalls when using cross-validation?

Awesome!

Completion rate improved to 4.17

bookTrain-Test-Splitt og Kryssvalidering

Sveip for å vise menyen

I de forrige kapitlene bygde vi modellene og forutsa nye verdier. Men vi har ingen indikasjon på hvor godt modellen presterer, eller om disse prediksjonene er pålitelige.

Train-Test Split

For å måle modellens ytelse, trenger vi et delsett av merkede data som modellen ikke har sett. Derfor deler vi tilfeldig alle de merkede dataene inn i treningssett og testsett.

Dette kan oppnås ved å bruke funksjonen train_test_split() fra sklearn.

Vanligvis deler man modellen med omtrent 70-90 % til treningssettet og 10-30 % til testsettet.

Note
Merk

Når datasettet ditt har millioner av forekomster, er det vanligvis mer enn nok å bruke bare noen tusen til testing. I slike tilfeller kan du reservere til og med mindre enn 10 % av dataene til testing.

Nå kan vi trene modellen ved å bruke treningssettet og evaluere nøyaktigheten på testsettet.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Men denne tilnærmingen har noen svakheter:

  • Vi bruker ikke alle tilgjengelige data til trening, noe som kunne forbedret modellen vår;
  • Siden vi evaluerer modellens nøyaktighet på en liten del av dataene (testsettet), kan denne nøyaktighetsscoren være upålitelig på mindre datasett. Du kan kjøre koden ovenfor flere ganger og observere hvordan nøyaktigheten endres hver gang et nytt testsett velges.

Kryssvalidering

Kryssvalidering er utviklet for å håndtere problemet med overtilpasning og for å sikre at modellen kan generalisere godt til nye, ukjente data. Dette kan sammenlignes med klasseromstrening for modellen — det hjelper modellen å lære på en mer balansert måte før den møter den virkelige sluttprøven.

Prinsippet er å stokke hele datasettet og dele det inn i n like store deler, kalt folds. Deretter går modellen gjennom n iterasjoner. I hver iterasjon brukes n-1 folds til trening og 1 fold til validering. På denne måten blir hver del av dataene brukt til validering én gang, og vi får et mer pålitelig estimat av modellens ytelse.

Vær oppmerksom på at kryssvalidering ikke er ment å erstatte testsettet. Etter å ha brukt kryssvalidering for å velge og finjustere modellen, bør den evalueres på et separat testsett for å få en upartisk vurdering av ytelsen i praksis.

Note
Merk

Et vanlig valg for antall fold er 5. I dette tilfellet brukes én fold som testsett, og de resterende 4 foldene brukes til trening.

Vi trener fem modeller med litt forskjellige delmengder. For hver modell beregner vi nøyaktigheten på testsettet:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Når dette er gjort, kan vi beregne gjennomsnittet av disse 5 nøyaktighetsscorene, som vil være vår kryssvalideringsnøyaktighet:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Dette er mer pålitelig fordi vi beregnet nøyaktighetsscoren ved å bruke alle dataene våre – bare delt opp forskjellig i fem iterasjoner.

Nå som vi vet hvor godt modellen presterer, kan vi trene den opp på nytt ved å bruke hele datasettet.

Heldigvis tilbyr sklearn funksjonen cross_val_score() for å evaluere modellen ved hjelp av kryssvalidering, slik at du slipper å implementere det selv:

Her er et eksempel på hvordan du bruker kryssvalidering med en k-NN-modell trent på Star Wars-rangeringer datasettet:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Standardmålet som brukes for klassifisering er nøyaktighet.

question mark

Velg alle riktige påstander.

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 6
some-alt