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.
Detta kan uppnås med hjälp av funktionen train_test_split() från sklearn.
Vanligtvis delas modellen upp i 70-90 % för träningsdata och 10-30 % för testdata.
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.
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 = 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.
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.
Vi tränar fem modeller med något olika delmängder. För varje modell beräknar vi testsetets noggrannhet:
accuracy=predicted correctly+predicted incorrectlypredicted correctlyNä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=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.
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:
Här är ett exempel på hur du använder cross-validation med en k-NN-modell tränad på Star Wars-ratingsdatasettet:
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())
Det mått som används som standard 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