Jaka jest odpowiednia strategia podziału zestawu danych?
Pytam o opinie na następujące podejście (nie na poszczególnych parametrów, takich jak test_size
czy n_iter
, ale jeśli kiedyś X
, y
, X_train
, y_train
, X_test
, a y_test
właściwie i czy sekwencja ma sens):
(rozszerzenie tego przykładu z dokumentacji scikit-learn)
1. Załaduj zestaw danych
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. Podział na zestaw treningowy i testowy (np. 80/20)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3. Wybierz estymator
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. Wybierz iterator weryfikacji krzyżowej
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. Dostrój hiperparametry
zastosowanie iteratora walidacji krzyżowej na zestawie szkoleniowym
from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)
6. Algorytm debugowania z krzywą uczenia się
X_train
jest losowo dzielony na trening i zestaw testów 10 razy ( n_iter=10
). Każdy punkt na krzywej szkolenia-wynik jest średnią z 10 punktów, gdzie model wyszkolonych i oceniane pierwszych ı przykładami treningu. Każdy punkt na punktowej krzywej walidacji krzyżowej jest średnią z 10 punktów, gdzie model wyszkolonych na pierwszych i przykładami treningu i oceniane wszystkie przykłady zestawu testowego.
from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()
plot_learning_curve () można znaleźć w bieżącej wersji programistycznej scikit-learn (0.15-git).
7. Ocena końcowa zestawu testowego
classifier.score(X_test, y_test)
7a. Testowanie nadmiernego dopasowania w wyborze modelu z zagnieżdżoną weryfikacją krzyżową (przy użyciu całego zestawu danych)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
Dodatkowe pytanie: Czy sensowne jest zastąpienie kroku 7 zagnieżdżoną weryfikacją krzyżową? Lub należy zagnieżdżone cv uznać za komplementarne do kroku 7
(wydaje się, że kod działa z walidacją krzyżową k-fold w scikit-learn, ale nie z shuffle & split. Dlatego cv
należy zmienić powyżej, aby kod działał)
8. Wytrenuj ostateczny model dla całego zestawu danych
classifier.fit(X, y)
EDYCJA: Teraz zgadzam się z cbeleitami, że krok 7a nie ma większego sensu w tej sekwencji. Więc nie przyjąłbym tego.
Odpowiedzi:
Nie jestem pewien, co chcesz zrobić w kroku 7a. Jak rozumiem teraz, nie ma to dla mnie sensu.
Oto jak rozumiem twój opis: w kroku 7 chcesz porównać skuteczność wstrzymania z wynikami krzyżowej weryfikacji obejmującej kroki 4–6 (więc tak, to byłaby konfiguracja zagnieżdżona).
Głównymi punktami, dla których nie sądzę, by to porównanie miało sens, są:
To porównanie nie może wykryć dwóch głównych źródeł nadmiernie optymistycznych wyników walidacji, które napotykam w praktyce:
wycieki danych (zależność) między danymi szkoleniowymi i testowymi, które są spowodowane hierarchiczną (aka klastrowaną) strukturą danych i która nie jest uwzględniana w podziale. W mojej dziedzinie mamy zazwyczaj wiele (czasem tysiące) odczytów (= wierszy w matrycy danych) tego samego pacjenta lub biologiczną replikę eksperymentu. Nie są one niezależne, więc podział walidacji należy przeprowadzić na poziomie pacjenta. Jednak taki wyciek danych występuje, zarówno przy podziale zestawu wstrzymania, jak i przy podziale walidacji krzyżowej. Hold-out będzie wtedy równie optymistycznie tendencyjny jak krzyżowa walidacja.
Wstępne przetwarzanie danych wykonane na całej macierzy danych, gdzie obliczenia nie są niezależne dla każdego wiersza, ale wiele / wszystkie wiersze są wykorzystywane do parametrów obliczeniowych dla wstępnego przetwarzania. Typowymi przykładami byłyby np. Projekcja PCA przed „faktyczną” klasyfikacją.
Ponownie, miałoby to wpływ zarówno na twoje powstrzymanie, jak i na zewnętrzną weryfikację krzyżową, więc nie możesz go wykryć.
W przypadku danych, z którymi pracuję, oba błędy mogą łatwo spowodować, że część błędnych klasyfikacji zostanie niedoceniona o rząd wielkości!
Jeśli jesteś ograniczony do tej zliczonej części wydajności przypadków testowych, porównania modeli wymagają albo bardzo dużej liczby przypadków testowych, albo absurdalnie dużych różnic w prawdziwej wydajności. Porównanie 2 klasyfikatorów z nieograniczoną liczbą danych treningowych może być dobrym początkiem do dalszej lektury.
Jednak porównywanie jakości modelu twierdzi, że wewnętrzna weryfikacja krzyżowa dla modelu „optymalnego” i zewnętrzna weryfikacja krzyżowa lub wstrzymanie sprawdzania poprawności ma sens: jeśli rozbieżność jest wysoka, wątpliwe jest, czy optymalizacja wyszukiwania siatki działała (możesz mieć wariancja odtłuszczona ze względu na dużą wariancję miary wydajności). To porównanie jest łatwiejsze, ponieważ można dostrzec kłopoty, jeśli wewnętrzne oszacowanie jest absurdalnie dobre w porównaniu do innych - jeśli tak nie jest, nie musisz się zbytnio przejmować optymalizacją. Ale w każdym razie, jeśli twój zewnętrzny (7) pomiar wydajności jest rzetelny i solidny, masz przynajmniej przydatne oszacowanie uzyskanego modelu, niezależnie od tego, czy jest optymalny, czy nie.
IMHO mierzenie krzywej uczenia się to jeszcze inny problem. Pewnie bym sobie z tym oddzielnie, i myślę, że trzeba zdefiniować jaśniej co trzeba krzywej uczenia się dla (nie trzeba krzywej uczenia się dla pomocą zbioru danych dotyczących danego problemu, danych i sposobu klasyfikacji lub krzywej uczenia się dla tego zestawu danych danego problemu, danych i metody klasyfikacji) oraz szereg dalszych decyzji (np. jak poradzić sobie ze złożonością modelu jako funkcją wielkości próbki treningowej? Zoptymalizować ponownie, użyć stałych hiperparametrów, zdecydować o funkcja do naprawy hiperparametrów w zależności od wielkości zestawu treningowego?)
(Moje dane zwykle mają tak mało niezależnych przypadków, aby pomiar krzywej uczenia się był wystarczająco precyzyjny, aby można go było wykorzystać w praktyce - ale może być lepiej, jeśli 1200 wierszy jest rzeczywiście niezależnych)
aktualizacja: Co jest „nie tak” w przykładzie scikit-learn?
Po pierwsze, tutaj nie ma nic złego z walidacją krzyżową. Zagnieżdżona walidacja ma ogromne znaczenie dla optymalizacji opartej na danych, a walidacja krzyżowa jest bardzo skutecznym podejściem (szczególnie w przypadku iteracji / powtarzania).
Zatem, czy w ogóle coś jest nie tak, zależy od twojego punktu widzenia: dopóki wykonasz uczciwą zagnieżdżoną walidację (zachowując ściśle niezależne zewnętrzne dane testowe), zewnętrzna walidacja jest właściwą miarą wydajności „optymalnego” modelu. Nic w tym złego.
Ale kilka rzeczy może i może pójść nie tak z wyszukiwaniem siatki tych miar wydajności typu proporcjonalnego do dostrajania hiperparametrów SVM. Zasadniczo oznaczają one, że możesz (prawdopodobnie?) Nie polegać na optymalizacji. Niemniej jednak, dopóki twój podział zewnętrzny został wykonany prawidłowo, nawet jeśli model nie jest najlepszy z możliwych, masz uczciwe oszacowanie wydajności uzyskanego modelu.
Spróbuję podać intuicyjne wyjaśnienie, dlaczego optymalizacja może mieć problemy:
Potrzebujesz absurdalnie ogromnej liczby przypadków (przynajmniej w porównaniu z liczbą przypadków, które zwykle mogę mieć), aby osiągnąć wymaganą precyzję (wyczucie odchylenia / wariancji) do oszacowania przywołania, precyzję (sens wydajności uczenia maszynowego). Dotyczy to oczywiście również współczynników obliczanych z takich proporcji. Spójrz na przedziały ufności dla proporcji dwumianowych. Są szokująco duże! Często większa niż prawdziwa poprawa wydajności w porównaniu do siatki hiperparametrów. I statystycznie rzecz biorąc, wyszukiwanie siatki jest ogromnym problemem wielokrotnego porównywania: im więcej punktów siatki oceniasz, tym większe jest ryzyko znalezienia kombinacji hiperparametrów, która przypadkowo wygląda bardzo dobrze dla ocenianego podziału pociągu / testu. To właśnie mam na myśli przez odchylenie wariancji.
Intuicyjnie rozważ hipotetyczną zmianę hiperparametru, która powoli powoduje pogorszenie modelu: jeden przypadek testowy przesuwa się w kierunku granicy decyzji. Miary wydajności „twardej” nie wykrywają tego, dopóki sprawa nie przekroczy granicy i nie znajdzie się po złej stronie. Następnie jednak natychmiast przypisują pełny błąd dla nieskończenie małej zmiany hiperparametru.
Aby przeprowadzić optymalizację numeryczną, należy dobrze zachować miarę wydajności. Oznacza to: ani zwarta (nie do ciągłego różnicowania) część pomiaru wydajności typu proporcjonalnego, ani fakt, że poza tym skokiem, faktycznie występujące zmiany nie są wykrywane, nie są odpowiednie do optymalizacji.
Właściwe reguły punktacji są zdefiniowane w sposób szczególnie odpowiedni do optymalizacji. Mają swoje maksimum globalne, gdy przewidywane prawdopodobieństwa odpowiadają prawdziwym prawdopodobieństwom, że każdy przypadek należy do danej klasy.
W przypadku SVM masz dodatkowy problem, że nie tylko miary wydajności, ale także model reaguje w ten skokowy sposób: niewielkie zmiany hiperparametru nic nie zmienią. Model zmienia się tylko wtedy, gdy hiperparametry są wystarczającymi zmianami, aby spowodować, że jakiś przypadek przestanie być wektorem podporowym lub stanie się wektorem podporowym. Ponownie, takie modele są trudne do optymalizacji.
Literatura:
Gneiting, T. & Raftery, AE: Strictly Proper Scoring Rules, Prediction and Estimation, Journal of American Statistics Association, 102, 359-378 (2007). DOI: 10.1198 / 016214506000001437
Brereton, R .: Chemometrics for rozpoznawania wzorców, Wiley, (2009).
wskazuje na skokowe zachowanie SVM jako funkcję hiperparametrów.
Aktualizacja II: wariancja szumowania
to, na co możesz sobie pozwolić w porównaniu modeli, oczywiście zależy od liczby niezależnych przypadków. Wykonajmy szybką i brudną symulację dotyczącą ryzyka odchylenia wariancji tutaj:
scikit.learn
mówi, że mają 1797 są wdigits
danych.tzn. wszystkie modele mają taką samą rzeczywistą wydajność, powiedzmy, 97% (typowa wydajność dla
digits
zestawu danych).digits
Oto rozkład najlepiej obserwowanej wydajności:
Czerwona linia oznacza prawdziwe działanie wszystkich naszych hipotetycznych modeli. Średnio obserwujemy tylko 2/3 prawdziwego poziomu błędu dla pozornie najlepszego z 100 porównywanych modeli (dla symulacji wiemy, że wszystkie one działają jednakowo przy 97% poprawnych prognozach).
Ta symulacja jest oczywiście bardzo uproszczona:
Zasadniczo jednak zarówno mała liczba niezależnych przypadków testowych, jak i duża liczba porównywanych modeli zwiększają błąd systematyczny. Ponadto artykuł Cawleya i Talbota podaje empirycznie obserwowane zachowanie.
źródło