Szukaj…


Walidacja krzyżowa

Poznanie parametrów funkcji prognozowania i przetestowanie jej na tych samych danych jest błędem metodologicznym: model, który po prostu powtórzyłby etykiety próbek, które właśnie widział, miałby doskonały wynik, ale nie przewidziałby niczego użytecznego na jeszcze- niewidoczne dane. Ta sytuacja nazywa się nadmiernym dopasowaniem . Aby tego uniknąć, powszechną praktyką podczas przeprowadzania (nadzorowanego) eksperymentu uczenia maszynowego jest przechowywanie części dostępnych danych jako zestawu testowego X_test, y_test . Zauważ, że słowo „eksperyment” nie ma oznaczać wyłącznie użytku akademickiego, ponieważ nawet w warunkach komercyjnych uczenie maszynowe zwykle rozpoczyna się eksperymentalnie.

W scikit-learn losowy podział na zestawy szkoleniowe i testowe można szybko obliczyć za pomocą funkcji pomocniczej train_test_split . Załadujmy zestaw danych tęczówki, aby dopasować do niego maszynę wektora liniowego wsparcia:

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

Możemy teraz szybko próbkować zestaw treningowy, jednocześnie trzymając 40% danych do testowania (oceny) naszego klasyfikatora:

>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

Teraz, gdy mamy już zestawy treningów i testów, użyjmy go:

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)   

K-Fold Cross Validation

K-krotna walidacja krzyżowa jest systematycznym procesem wielokrotnego powtarzania procedury podziału pociągu / testu, w celu zmniejszenia wariancji związanej z pojedynczą próbą podziału pociągu / testu. Zasadniczo dzielisz cały zestaw danych na „fałdy” K o równej wielkości, a każda fałda jest używana raz do testowania modelu, a K-1 do treningu modelu.

W bibliotece scikit dostępnych jest wiele technik składania. Ich użycie zależy od charakterystyki danych wejściowych. Niektóre przykłady to

K-Fold

Zasadniczo dzielisz cały zestaw danych na „fałdy” K o równej wielkości, a każda fałda jest używana raz do testowania modelu, a K-1 do treningu modelu.

from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = KFold(n_splits=3, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1 3] TEST: [2]
TRAIN: [0 1 2] TEST: [3]

StratifiedKFold to odmiana k-fold, która zwraca fałdy warstwowe: każdy zestaw zawiera w przybliżeniu taki sam procent próbek każdej klasy docelowej, co pełny zestaw

ShuffleSplit

Służy do generowania zdefiniowanej przez użytkownika liczby niezależnych podziałów zestawu danych pociągu / testu. Próbki są najpierw tasowane, a następnie dzielone na parę pociągów i zestawów testowych.

from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [3 1 0] TEST: [2]
TRAIN: [2 1 3] TEST: [0]
TRAIN: [0 2 1] TEST: [3]

StratifiedShuffleSplit to odmiana ShuffleSplit, która zwraca podziały warstwowe, tj. Które tworzy podziały, zachowując taki sam procent dla każdej klasy docelowej, jak w pełnym zestawie.

Inne techniki składania, takie jak Leave One / p Out i TimeSeriesSplit (odmiana K-fold) są dostępne w bibliotece scikit model_selection.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow