Walidacja krzyżowa leave-one-out w pythonie (z przykładami)
Aby ocenić wydajność modelu na zbiorze danych, musimy zmierzyć, jak dobrze przewidywania dokonane przez model odpowiadają obserwowanym danym.
Powszechnie stosowaną metodą jest weryfikacja krzyżowa Leave-One-Out (LOOCV) , która wykorzystuje następujące podejście:
1. Podziel zbiór danych na zbiór uczący i testowy, wykorzystując wszystkie obserwacje z wyjątkiem jednej jako część zbioru uczącego.
2. Utwórz model wykorzystując wyłącznie dane ze zbioru uczącego.
3. Wykorzystać model do przewidzenia wartości odpowiedzi obserwacji wyłączonej z modelu i obliczyć błąd średniokwadratowy (MSE).
4. Powtórz ten proces n razy. Oblicz testowe MSE jako średnią ze wszystkich testowych MSE.
Ten samouczek zawiera przykładowy krok po kroku sposób uruchomienia LOOCV 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 LeaveOneOut
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 Leave-One-Out
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 = LeaveOneOut()
#build multiple linear regression model
model = LinearRegression()
#use LOOCV 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.1461548083469726
Z wyniku widzimy, że średni błąd bezwzględny (MAE) wyniósł 3,146 . Oznacza to, że średni błąd bezwzględny pomiędzy przewidywaniem modelu a danymi faktycznie zaobserwowanymi wynosi 3,146.
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 = LeaveOneOut()
#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)))
3.619456476385567
Z wyniku widzimy, że średni błąd kwadratowy (RMSE) wyniósł 3,619 . 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.
Dodatkowe zasoby
Szybkie wprowadzenie do walidacji krzyżowej typu Leave-One-Out (LOOCV)
Kompletny przewodnik po regresji liniowej w Pythonie