Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Opdeling i Trænings- og Testdata samt Krydsvalidering | K-NN-Klassifikator
Klassifikation med Python

bookOpdeling i Trænings- og Testdata samt Krydsvalidering

I de foregående kapitler byggede vi modellerne og forudsagde nye værdier. Men vi har ingen idé om, hvor godt modellen præsterer, eller om disse forudsigelser er pålidelige.

Opdeling i trænings- og testdatasæt

For at måle modellens præstation har vi brug for et delmængde af mærkede data, som modellen ikke har set. Derfor opdeler vi tilfældigt alle de mærkede data i et træningssæt og et testsæt.

Dette kan opnås ved hjælp af funktionen train_test_split() fra sklearn.

Normalt opdeles modellen med omkring 70-90% til træningssættet og 10-30% til testdatasættet.

Note
Bemærk

Når dit datasæt har millioner af forekomster, er det som regel mere end tilstrækkeligt at bruge blot nogle få tusinde til test. I sådanne tilfælde kan du reservere endda mindre end 10% af dataene til test.

Nu kan modellen trænes ved hjælp af træningssættet og dens nøjagtighed evalueres på testdatasættet.

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 tilgang har nogle mangler:

  • Vi bruger ikke alle tilgængelige data til træning, hvilket kunne forbedre vores model;
  • Da vi evaluerer modellens nøjagtighed på en lille del af dataene (test-sættet), kan denne nøjagtighed være upålidelig på mindre datasæt. Du kan køre koden ovenfor flere gange og observere, hvordan nøjagtigheden ændrer sig, hver gang et nyt test-sæt udvælges.

Krydsvalidering

Krydsvalidering er designet til at håndtere problemet med overfitting og for at sikre, at modellen kan generalisere godt til nye, usete data. Tænk på det som klasseundervisning for din model — det hjælper modellen med at lære på en mere balanceret måde, før den står over for den reelle afsluttende test.

Idéen er at blande hele datasættet og opdele det i n lige store dele, kaldet folds. Derefter gennemgår modellen n iterationer. I hver iteration bruges n-1 fold til træning og 1 fold til validering. På denne måde bliver hver del af dataene brugt til validering én gang, og vi får et mere pålideligt estimat af modellens præstation.

Bemærk, at krydsvalidering ikke er beregnet til at erstatte test-sættet. Efter at have brugt krydsvalidering til at vælge og finjustere din model, bør du evaluere den på et separat test-sæt for at få en upartisk vurdering af dens præstation i praksis.

Note
Bemærk

Et almindeligt valg for antallet af fold er 5. I dette tilfælde bruges én fold som testdatasæt, og de resterende 4 fold bruges til træning.

Vi træner fem modeller med let forskellige delmængder. For hver model beregnes testdatasættets nøjagtighed:

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 gennemsnittet af de 5 nøjagtighedsscorer, hvilket bliver vores krydsvaliderings-nøjagtighedsscore:

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

Det er mere pålideligt, fordi vi beregnede nøjagtighedsscoren ved hjælp af alle vores data – blot opdelt forskelligt i fem iterationer.

Nu hvor vi ved, hvor godt modellen præsterer, kan vi genoptræne den ved at bruge hele datasættet.

Heldigvis stiller sklearn funktionen cross_val_score() til rådighed til at evaluere modellen ved hjælp af krydsgodkendelse, så du ikke behøver at implementere det selv:

Her er et eksempel på, hvordan du bruger krydsgodkendelse med en k-NN-model trænet på Star Wars-bedømmelsesdatasættet:

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

Scoren, der bruges som standard til klassifikation, er nøjagtighed.

question mark

Vælg alle de korrekte udsagn.

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 6

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

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

bookOpdeling i Trænings- og Testdata samt Krydsvalidering

Stryg for at vise menuen

I de foregående kapitler byggede vi modellerne og forudsagde nye værdier. Men vi har ingen idé om, hvor godt modellen præsterer, eller om disse forudsigelser er pålidelige.

Opdeling i trænings- og testdatasæt

For at måle modellens præstation har vi brug for et delmængde af mærkede data, som modellen ikke har set. Derfor opdeler vi tilfældigt alle de mærkede data i et træningssæt og et testsæt.

Dette kan opnås ved hjælp af funktionen train_test_split() fra sklearn.

Normalt opdeles modellen med omkring 70-90% til træningssættet og 10-30% til testdatasættet.

Note
Bemærk

Når dit datasæt har millioner af forekomster, er det som regel mere end tilstrækkeligt at bruge blot nogle få tusinde til test. I sådanne tilfælde kan du reservere endda mindre end 10% af dataene til test.

Nu kan modellen trænes ved hjælp af træningssættet og dens nøjagtighed evalueres på testdatasættet.

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 tilgang har nogle mangler:

  • Vi bruger ikke alle tilgængelige data til træning, hvilket kunne forbedre vores model;
  • Da vi evaluerer modellens nøjagtighed på en lille del af dataene (test-sættet), kan denne nøjagtighed være upålidelig på mindre datasæt. Du kan køre koden ovenfor flere gange og observere, hvordan nøjagtigheden ændrer sig, hver gang et nyt test-sæt udvælges.

Krydsvalidering

Krydsvalidering er designet til at håndtere problemet med overfitting og for at sikre, at modellen kan generalisere godt til nye, usete data. Tænk på det som klasseundervisning for din model — det hjælper modellen med at lære på en mere balanceret måde, før den står over for den reelle afsluttende test.

Idéen er at blande hele datasættet og opdele det i n lige store dele, kaldet folds. Derefter gennemgår modellen n iterationer. I hver iteration bruges n-1 fold til træning og 1 fold til validering. På denne måde bliver hver del af dataene brugt til validering én gang, og vi får et mere pålideligt estimat af modellens præstation.

Bemærk, at krydsvalidering ikke er beregnet til at erstatte test-sættet. Efter at have brugt krydsvalidering til at vælge og finjustere din model, bør du evaluere den på et separat test-sæt for at få en upartisk vurdering af dens præstation i praksis.

Note
Bemærk

Et almindeligt valg for antallet af fold er 5. I dette tilfælde bruges én fold som testdatasæt, og de resterende 4 fold bruges til træning.

Vi træner fem modeller med let forskellige delmængder. For hver model beregnes testdatasættets nøjagtighed:

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 gennemsnittet af de 5 nøjagtighedsscorer, hvilket bliver vores krydsvaliderings-nøjagtighedsscore:

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

Det er mere pålideligt, fordi vi beregnede nøjagtighedsscoren ved hjælp af alle vores data – blot opdelt forskelligt i fem iterationer.

Nu hvor vi ved, hvor godt modellen præsterer, kan vi genoptræne den ved at bruge hele datasættet.

Heldigvis stiller sklearn funktionen cross_val_score() til rådighed til at evaluere modellen ved hjælp af krydsgodkendelse, så du ikke behøver at implementere det selv:

Her er et eksempel på, hvordan du bruger krydsgodkendelse med en k-NN-model trænet på Star Wars-bedømmelsesdatasættet:

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

Scoren, der bruges som standard til klassifikation, er nøjagtighed.

question mark

Vælg alle de korrekte udsagn.

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 6
some-alt