Train-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.
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.
123456789101112131415161718192021from 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))
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.
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 correctly+predicted incorrectlypredicted correctlyNär detta är gjort kan vi beräkna medelvärdet av dessa 5 noggrannhetspoäng, vilket blir vårt korsvalideringsvärde:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Det ä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:
12345678910111213141516171819from 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())
Standardpoängen som används för klassificering är noggrannhet.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Fantastiskt!
Completion betyg förbättrat till 3.33
Train-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.
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.
123456789101112131415161718192021from 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))
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.
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 correctly+predicted incorrectlypredicted correctlyNär detta är gjort kan vi beräkna medelvärdet av dessa 5 noggrannhetspoäng, vilket blir vårt korsvalideringsvärde:
accuracyavg=5accuracy1+accuracy2+...+accuracy5Det ä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:
12345678910111213141516171819from 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())
Standardpoängen som används för klassificering är noggrannhet.
Tack för dina kommentarer!