Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Train-Test-delningsmetod och Korsvalidering | Sektion
Grunder i Övervakad Inlärning

bookTrain-Test-delningsmetod 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.

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.

Detta kan uppnås med funktionen train_test_split() från sklearn.

Argument:

  • X — en array med feature-värden;
  • y — en array med target-värden;
  • test_size — andelen för testmängden;

Returnerar:

  • X_train, X_test, y_train, y_test — arrayer av samma datatyper som X, y.

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

Note
Notering

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 hjälp av 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_scaled = scaler.fit_transform(X_train) X_test_scaled = 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 detta noggrannhetsmått 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. Därefter genomgå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.

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äknar vi 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 bra modellen presterar kan vi träna om den med hela datasettet.

Lyckligtvis 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:

Argument:

  • estimator — modellobjektet;
  • X — en array med egenskapsvärden;
  • y — en array med målvariabelvärden;
  • cv — antal vikningar (5 som standard);
  • scoring — metrik (noggrannhet som standard);

Returnerar:

  • scores — en array med poäng för varje iteration.

Här är ett exempel på hur du använder cross-validation 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

Standardpoängen som används för klassificering är noggrannhet.

question mark

Välj alla korrekta påståenden.

Select all correct answers

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 19

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

bookTrain-Test-delningsmetod 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.

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.

Detta kan uppnås med funktionen train_test_split() från sklearn.

Argument:

  • X — en array med feature-värden;
  • y — en array med target-värden;
  • test_size — andelen för testmängden;

Returnerar:

  • X_train, X_test, y_train, y_test — arrayer av samma datatyper som X, y.

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

Note
Notering

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 hjälp av 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_scaled = scaler.fit_transform(X_train) X_test_scaled = 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 detta noggrannhetsmått 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. Därefter genomgå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.

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äknar vi 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 bra modellen presterar kan vi träna om den med hela datasettet.

Lyckligtvis 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:

Argument:

  • estimator — modellobjektet;
  • X — en array med egenskapsvärden;
  • y — en array med målvariabelvärden;
  • cv — antal vikningar (5 som standard);
  • scoring — metrik (noggrannhet som standard);

Returnerar:

  • scores — en array med poäng för varje iteration.

Här är ett exempel på hur du använder cross-validation 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

Standardpoängen som används för klassificering är noggrannhet.

question mark

Välj alla korrekta påståenden.

Select all correct answers

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 19
some-alt