Walidacja krzyżowa k-fold w pythonie (krok po kroku)
Aby ocenić wydajność modelu na zbiorze danych, musimy zmierzyć, jak dobrze przewidywania dokonane przez model odpowiadają obserwowanym danym.
Powszechnie stosowaną metodą jest k-krotna walidacja krzyżowa , która wykorzystuje następujące podejście:
1. Losowo podziel zbiór danych na k grup, czyli „fałd”, o mniej więcej równej wielkości.
2. Wybierz jedną z zagięć jako zestaw utwierdzający. Dopasuj szablon do pozostałych zakładek k-1. Oblicz test MSE na podstawie obserwacji w naprężonej warstwie.
3. Powtórz ten proces k razy, za każdym razem używając innego zbioru jako zbioru wykluczającego.
4. Oblicz ogólny test MSE jako średnią k MSE testu.
W tym samouczku przedstawiono krok po kroku przykład przeprowadzania k-krotnej walidacji krzyżowej dla danego modelu w języku Python.
Krok 1: Załaduj niezbędne biblioteki
Najpierw załadujemy funkcje i biblioteki potrzebne w tym przykładzie:
from sklearn. model_selection import train_test_split
from sklearn. model_selection import KFold
from sklearn. model_selection import cross_val_score
from sklearn. linear_model import LinearRegression
from numpy import means
from numpy import absolute
from numpy import sqrt
import pandas as pd
Krok 2: Utwórz dane
Następnie utworzymy ramkę danych pandy zawierającą dwie zmienne predykcyjne, x1 i x2 , oraz jedną zmienną odpowiedzi y.
df = pd.DataFrame({' y ': [6, 8, 12, 14, 14, 15, 17, 22, 24, 23],
' x1 ': [2, 5, 4, 3, 4, 6, 7, 5, 8, 9],
' x2 ': [14, 12, 12, 13, 7, 8, 7, 4, 6, 5]})
Krok 3: Wykonaj weryfikację krzyżową typu K
Następnie dopasujemy model regresji liniowej do zbioru danych i wykonamy LOOCV, aby ocenić wydajność modelu.
#define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']
#define cross-validation method to use
cv = KFold ( n_splits = 10 , random_state = 1 , shuffle = True )
#build multiple linear regression model
model = LinearRegression()
#use k-fold CV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_absolute_error ',
cv=cv, n_jobs=-1)
#view mean absolute error
mean(absolute(scores))
3.6141267491803646
Z wyniku widać, że średni błąd bezwzględny (MAE) wyniósł 3,614 . Oznacza to, że średni błąd bezwzględny pomiędzy przewidywaniem modelu a danymi faktycznie zaobserwowanymi wynosi 3,614.
Ogólnie rzecz biorąc, im niższy MAE, tym lepiej model jest w stanie przewidzieć rzeczywiste obserwacje.
Inną powszechnie używaną metryką do oceny wydajności modelu jest średni błąd kwadratowy (RMSE). Poniższy kod pokazuje, jak obliczyć tę metrykę za pomocą LOOCV:
#define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']
#define cross-validation method to use
cv = KFold ( n_splits = 5 , random_state = 1 , shuffle = True )
#build multiple linear regression model
model = LinearRegression()
#use LOOCV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_squared_error ',
cv=cv, n_jobs=-1)
#view RMSE
sqrt(mean(absolute(scores)))
4.284373111711816
Z wyniku widzimy, że średni błąd kwadratowy (RMSE) wyniósł 4,284 .
Im niższy RMSE, tym lepiej model jest w stanie przewidzieć rzeczywiste obserwacje.
W praktyce zazwyczaj dopasowujemy kilka różnych modeli i porównujemy RMSE lub MAE każdego modelu, aby zdecydować, który model daje najniższy poziom błędów testowych i dlatego jest najlepszym modelem do zastosowania.
Zauważ również, że w tym przykładzie użyliśmy k=5 fałd, ale możesz wybrać dowolną liczbę fałd.
W praktyce zazwyczaj wybieramy pomiędzy 5 a 10 warstwami, ponieważ okazuje się, że jest to optymalna liczba warstw, która zapewnia wiarygodny poziom błędów testowych.
Pełną dokumentację funkcji KFold() sklearna znajdziesz tutaj .
Dodatkowe zasoby
Wprowadzenie do walidacji krzyżowej typu K
Kompletny przewodnik po regresji liniowej w Pythonie
Walidacja krzyżowa typu Leave-One-Out w Pythonie