Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Tränings-Testuppdelning och Korsvalidering | K-NN-Klassificerare
Klassificering med Python

Tränings-Testuppdelning och Korsvalidering

Svep för att visa menyn

I de tidigare kapitlen byggde vi modellerna och förutsade nya värden. Men vi har ingen uppfattning om hur väl modellen presterar eller om dessa förutsägelser är tillförlitliga.

Tränings- och testuppdelning

För att mäta modellens prestanda behöver vi en delmängd av märkta data som modellen inte har sett. Därför delar vi slumpmässigt upp alla märkta data i träningsmängd och testmängd.

traintestset

Detta kan uppnås med hjälp av funktionen train_test_split() från sklearn.

TrainTestFunc

Vanligtvis delas modellen upp i 70-90 % för träningsdata och 10-30 % för testdata.

Note
Notering

När din datamängd har miljontals instanser räcker det oftast att använda några tusen för testning. I sådana fall kan du reservera till och med mindre än 10 % av datan för testning.

Nu kan vi träna modellen med träningsuppsättningen och utvärdera dess noggrannhet på testuppsättningen.

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 detta tillvägagångssätt har vissa brister:

  • Vi använder inte all tillgänglig data för träning, vilket skulle kunna förbättra vår modell;
  • Eftersom vi utvärderar modellens noggrannhet på en liten del av datan (testuppsättningen), kan detta noggrannhetsvärde vara opålitligt vid mindre datamängder. Du kan köra koden ovan flera gånger och observera hur noggrannheten förändras varje gång en ny testuppsättning väljs.

Korsvalidering

Korsvalidering är utformad för att hantera problemet med överanpassning och för att säkerställa att modellen kan generalisera väl till ny, osedd data. Tänk på det som klassrumsträning för din modell — det hjälper modellen att lära sig på ett mer balanserat sätt innan det verkliga slutprovet.

Idén är att blanda hela datamängden och dela upp den i n lika stora delar, kallade folds. Sedan genomför modellen n iterationer. Vid varje iteration används n-1 folds för träning och 1 fold för validering. På så sätt används varje del av datan för validering en gång, och vi får en mer tillförlitlig uppskattning av modellens prestanda.

Kom ihåg, korsvalidering är inte avsedd att ersätta testuppsättningen. Efter att ha använt korsvalidering för att välja och finjustera din modell, bör du utvärdera den på en separat testuppsättning för att få en opartisk bedömning av dess verkliga prestanda.

Note
Notering

Ett vanligt val för antalet folds är 5. I det fallet används en fold som testuppsättning, och de återstående 4 folds används för träning.

kors

Vi tränar fem modeller med något olika delmängder. För varje modell beräknar vi testsetets noggrannhet:

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

När vi har gjort detta kan vi beräkna genomsnittet av dessa 5 noggrannhetsvärden, vilket blir vårt korsvalideringsvärde för noggrannhet:

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

Det är mer tillförlitligt eftersom vi beräknade noggrannhetspoängen med all vår data – bara uppdelad på olika sätt i fem iterationer.

Nu när vi vet hur bra modellen presterar kan vi träna om den med hela datasettet.

Som tur är tillhandahåller sklearn funktionen cross_val_score() för att utvärdera modellen med cross-validation, så du behöver inte implementera det själv:

CrossValFunc

Här är ett exempel på hur du använder cross-validation med en k-NN-modell tränad på Star Wars-ratingsdatasettet:

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

Det mått som används som standard för klassificering är noggrannhet.

question mark

Välj alla korrekta påståenden.

Välj alla rätta svar

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 6

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 1. Kapitel 6
some-alt