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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *