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

bookTränings-Testuppdelning och Korsvalidering

I de föregående 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.

Train-Test Split

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

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

Vanligtvis delar du upp modellen med 70-90 % för träningsuppsättningen och 10-30 % för testuppsättningen.

Note
Notera

När din datamängd har miljontals instanser räcker det oftast med 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_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

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 denna noggrannhetspoäng vara opålitlig 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. Därefter genomgår modellen n iterationer. Vid varje iteration används n-1 folds för träning och 1 fold används 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.

Observera att korsvalidering inte är 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 vikningar är 5. I detta fall används en vikning som testuppsättning, och de återstående 4 vikningarna används för träning.

Vi tränar fem modeller med något olika delmängder. För varje modell beräknas testuppsättningens noggrannhet:

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

När detta är gjort kan vi beräkna medelvärdet av dessa 5 noggrannhetspoäng, vilket blir vårt korsvalideringsvärde:

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 väl 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 korsvalidering, så du behöver inte implementera det själv:

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

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

Standardscoret som används för klassificering är noggrannhet.

question mark

Välj alla korrekta påståenden.

Select the correct answer

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

Awesome!

Completion rate improved to 4.17

bookTränings-Testuppdelning och Korsvalidering

Svep för att visa menyn

I de föregående 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.

Train-Test Split

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

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

Vanligtvis delar du upp modellen med 70-90 % för träningsuppsättningen och 10-30 % för testuppsättningen.

Note
Notera

När din datamängd har miljontals instanser räcker det oftast med 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_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

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 denna noggrannhetspoäng vara opålitlig 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. Därefter genomgår modellen n iterationer. Vid varje iteration används n-1 folds för träning och 1 fold används 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.

Observera att korsvalidering inte är 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 vikningar är 5. I detta fall används en vikning som testuppsättning, och de återstående 4 vikningarna används för träning.

Vi tränar fem modeller med något olika delmängder. För varje modell beräknas testuppsättningens noggrannhet:

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

När detta är gjort kan vi beräkna medelvärdet av dessa 5 noggrannhetspoäng, vilket blir vårt korsvalideringsvärde:

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 väl 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 korsvalidering, så du behöver inte implementera det själv:

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

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

Standardscoret som används för klassificering är noggrannhet.

question mark

Välj alla korrekta påståenden.

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 6
some-alt