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 Testdatasæt samt Krydsvalidering | K-NN-Klassifikator
Klassifikation med Python

Opdeling i Trænings- og Testdatasæt 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, og 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.

traintestset

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

TrainTestFunc

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 instanser, 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 vi træne modellen ved hjælp af træningssættet og evaluere dens nøjagtighed 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, y_train) # Printing the accuracy on the test set print(knn.score(X_test, y_test))

Men denne tilgang har nogle mangler:

  • Vi bruger ikke alle tilgængelige data til træning, hvilket kunne forbedre vores model;
  • Da vi vurderer modellens nøjagtighed på en lille del af dataene (testdatasættet), kan denne nøjagtighedsscore 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 testdatasæt udtages.

Krydsvalidering

Krydsvalidering er designet til at løse 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, krydsvalidering er ikke ment som erstatning for testdatasættet. Efter at have brugt krydsvalidering til at vælge og finjustere din model, bør du evaluere den på et separat testdatasæ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 så fald vil én fold blive brugt som testdatasæt, og de resterende 4 fold vil blive brugt til træning.

cross

Vi træner fem modeller med let forskellige delmængder. For hver model beregner vi test-sæt 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 vil være 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 tilbyder sklearn funktionen cross_val_score() til at evaluere modellen ved hjælp af krydsgodkendelse, så du ikke behøver at implementere det selv:

CrossValFunc

Her er et eksempel på, hvordan man bruger krydsgodkendelse med en k-NN-model trænet på Star Wars ratings datasæ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())

Den standardmæssige score, der bruges til klassifikation, er nøjagtighed.

question mark

Vælg alle de korrekte udsagn.

Vælg alle korrekte svar

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

Sektion 1. Kapitel 6
some-alt