Jak podzielić zestaw danych w celu weryfikacji krzyżowej, krzywej uczenia się i oceny końcowej?

69

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_sizeczy n_iter, ale jeśli kiedyś X, y, X_train, y_train, X_test, a y_testwł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_trainjest 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()

Krzywa uczenia się

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 cvnależ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.

tobip
źródło
Jakiej reguły punktacji dokładności używasz? Jeśli jest to dokładność klasyfikacji, taka niewłaściwa reguła punktacji cofnie znaczną część pracy, którą wykonałeś.
Frank Harrell,
Użyłem wartości domyślnej, która jest rzeczywiście dokładnością klasyfikacji. Wiem, że np. F1 byłoby bardziej odpowiednie. Ale tutaj jestem tylko zainteresowany, czy podziały są OK.
tobip
3
Jestem prawie pewien, że F1 to nowa nazwa starej koncepcji. Myślę, że wymyślanie nowych nazw starych rzeczy jest bezproduktywne. Co ważniejsze, jest to niewłaściwa zasada punktacji, która spowoduje wybór niewłaściwych funkcji, a także doda sporo hałasu do całego procesu.
Frank Harrell
3
... w każdym razie F1 ma problemy z dokładnością @FrankHarrell nawiązuje do: wynikają one z liczenia ułamków przypadków testowych trudnych klasyfikacji. Aby uzyskać jedną z właściwych zasad punktacji Franka, musisz przełączyć się na probabilistyczny wynik SVM, a następnie np. Użyć wyniku Briera (średni błąd kwadratu) zamiast dokładności. Wydaje mi się, że można również uzyskać wersję F1 typu MSE. Takie środki powinny rzeczywiście być lepsze na etapie dostrajania. Aby przekazać ostateczne wyniki, możesz również potrzebować typowych sposobów (np. Dokładność, F1) wyrażania wyników dla swojej społeczności.
cbeleites
1
@ ta.ft: to, czy podejście jest złe, czy nie, zależy od tego, co uważasz za złe: przeszukiwanie siatki proporcji ma poważne ryzyko odchylenia wariancji, chyba że masz absurdalnie dużą liczbę niezależnych przypadków. Tak więc w wielu sytuacjach twierdzenie, że wyszukiwanie siatki daje optymalny model, jest błędne. Jeśli jednak wykonasz prawidłowe sprawdzanie zagnieżdżone, zewnętrzne sprawdzanie poprawności daje uczciwy pomiar wydajności wybranego „optymalnego” modelu. To nie jest źle. Po prostu nie masz gwarancji, że wyszukiwanie siatki ma optymalny model. Jeśli chodzi o literaturę, zaktualizuję swoją odpowiedź.
cbeleites

Odpowiedzi:

41

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:

  • p^np
    Var(p^)=p(1p)n

    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:


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.learnmówi, że mają 1797 są w digitsdanych.

  • 10×10
  • zakładamy, że oba parametry (zakresy) w ogóle nie wpływają na modele,
  • tzn. wszystkie modele mają taką samą rzeczywistą wydajność, powiedzmy, 97% (typowa wydajność dla digitszestawu danych).

  • 104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")

Oto rozkład najlepiej obserwowanej wydajności:

symulacja wariancji szumowania

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:

  • Oprócz wariancji wielkości próbki testowej istnieje przynajmniej wariancja wynikająca z niestabilności modelu, więc tutaj nie doceniamy wariancji
  • Strojenie parametrów wpływających na złożoność modelu zazwyczaj obejmuje zestawy parametrów, w których modele są niestabilne, a zatem mają dużą zmienność.
  • W przypadku cyfr UCI z przykładu oryginalna baza danych zawiera około 11000 cyfr napisanych przez 44 osoby. Co się stanie, jeśli dane zostaną pogrupowane według osoby, która napisała? (Czyli łatwiej jest rozpoznać 8 napisane przez kogoś, jeśli wiesz, jak ta osoba pisze, powiedzmy 3?) Efektywna wielkość próbki może wtedy wynosić zaledwie 44.
  • Strojenie hiperparametrów modelu może prowadzić do korelacji między modelami (w rzeczywistości byłoby to uważane za dobrze zachowane z perspektywy optymalizacji numerycznej). Trudno jest przewidzieć wpływ tego (i podejrzewam, że jest to niemożliwe bez uwzględnienia faktycznego rodzaju klasyfikatora).

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.

cbeleity
źródło
@cbleites: Jeśli wyszukiwanie siatki może nie być odpowiednią metodą do znalezienia optymalnego modelu, jaką metodę powinienem wybrać?
tobip
1
@ ta.ft: dwa podejścia są a) uwzględniają w modelowaniu tyle samo wiedzy zewnętrznej na temat twojej aplikacji i danych, aby radykalnie zmniejszyć liczbę modeli, które należy porównać (= zdecyduj hiperparametry zamiast optymalizować). Ogólnie może być lepsza zmiana na klasyfikator, który ma wewnętrznie znaczące hiperparametry, tj. Gdzie można dowiedzieć się z aplikacji i typu danych, jaki powinien być (w przybliżeniu) hiperparametr. b) porównaj kilka pozostałych modeli, stosując odpowiednią regułę punktacji. Np. Wynik Briersa ma znacznie lepsze właściwości wariancyjne dla wielu klasyfikatorów.
cbeleites
1
Możesz także w ogóle odmówić optymalizacji (poprzez decyzje (a)). Jeśli dostaniesz wystarczająco dobry klasyfikator i możesz argumentować, że nie masz szansy udowodnić wyższości innego klasyfikatora, biorąc pod uwagę dostępną wielkość próbki (np. Wykonaj kilka obliczeń demonstracyjnych McNemar, poszukaj potrzebnej wielkości próby w celu porównania proporcji dla hipotetycznego lepszego klasyfikatora - istnieje duża szansa, że ​​będą one absurdalnie duże, nawet w przypadku absurdalnie dużych hipotetycznych ulepszeń), można argumentować, że optymalizacja nie ma żadnego sensu, a jedynie stwarza ryzyko przeregulowania.
cbeleites
Nie zgadzam się z tobą w sprawie „wariancji skimmingowej”. Jeśli masz wiele punktów na siatce do optymalizacji hiperparametrów, punkt może oportunistycznie mieć szczęście w jednym krotnie CV; ale jeśli masz, powiedzmy 10-krotne CV, jest mało prawdopodobne, aby zestaw parametrów przypadkowo miał szczęście na wszystkich 10-krotności CV.
RNA,
1
@ RNA: Prawdopodobieństwo „szczęścia” we wszystkich fałdach jest bezpośrednio związane z całkowitą liczbą przypadków (we wszystkich 10 fałdach) i zazwyczaj brana jest pod uwagę tylko średnia dla wszystkich tych fałd. Zaktualizowałem odpowiedź za pomocą symulacji hipotetycznego wybierania najlepszych ze 100 modeli (powiedzmy 2 hiperparametrów po 10 kroków każdy), co jest już związane ze znacznym odchyleniem w przykładowym scenariuszu (poziom błędu zbyt niski o 1/3) . Wiele osób tutaj rzadko ma kilka tysięcy niezależnych spraw - np. Rzadko mam nawet 44 osoby, które zapisały cyfry dla pełnego zestawu danych cyfr UCI.
cbeleites,