Wybór funkcji i walidacja krzyżowa

76

Ostatnio dużo czytałem na tej stronie (@Aniko, @Dikran Marsupial, @Erik) i gdzie indziej na temat problemu nadmiaru występującego przy krzyżowej walidacji - (Smialowski i in. 2010 Bioinformatics, Hastie, Elementy uczenia statystycznego). Sugeruje się, że każdy nadzorowany wybór funkcji (przy użyciu korelacji z etykietami klas) wykonywany poza oszacowaniem wydajności modelu za pomocą walidacji krzyżowej (lub innej metody szacowania modelu, takiej jak ładowanie początkowe) może spowodować przeregulowanie.

Wydaje mi się to nieintuicyjne - na pewno, jeśli wybierzesz zestaw funkcji, a następnie ocenisz model przy użyciu tylko wybranych funkcji za pomocą weryfikacji krzyżowej, wówczas otrzymujesz obiektywne oszacowanie ogólnej wydajności modelu w odniesieniu do tych funkcji (zakłada to, że badana próbka jest reprezentatywna ludności)?

Dzięki tej procedurze nie można oczywiście twierdzić, że zestaw funkcji jest optymalny, ale czy można zgłosić wydajność wybranego zestawu funkcji na niewidzialnych danych jako prawidłową?

Zgadzam się z tym, że wybór funkcji na podstawie całego zestawu danych może spowodować wyciek danych między zestawem testowym a zestawem pociągów. Ale jeśli zestaw funkcji jest statyczny po początkowym wyborze i nie jest wykonywane żadne inne dostrojenie, to z pewnością poprawne jest raportowanie wskaźników wydajności zweryfikowanych krzyżowo?

W moim przypadku mam 56 funkcji i 259 skrzynek, więc # skrzynki> # cechy. Funkcje pochodzą z danych czujnika.

Przepraszam, jeśli moje pytanie wydaje się pochodne, ale wydaje się to istotną kwestią do wyjaśnienia.

Edycja: po wdrożeniu wyboru funkcji w ramach weryfikacji krzyżowej na zestawie danych wyszczególnionym powyżej (dzięki odpowiedziom poniżej), mogę potwierdzić, że wybór funkcji przed weryfikacją krzyżową w tym zestawie danych wprowadził znaczącystronniczość. To uprzedzenie / nadmierne dopasowanie było największe, gdy robiono to dla preparatu 3-klasowego, w porównaniu do preparatu 2-klasowego. Myślę, że fakt, że użyłem regresji krokowej do wyboru funkcji, wzmógł to przeregulowanie; dla celów porównawczych na innym, ale powiązanym zbiorze danych porównałem sekwencyjną procedurę wybierania cech do przodu wykonaną przed weryfikacją krzyżową z wynikami, które wcześniej uzyskałem z wyborem cech w CV. Wyniki między obiema metodami nie różniły się drastycznie. Może to oznaczać, że regresja krokowa jest bardziej podatna na nadmierne dopasowanie niż sekwencyjny FS lub może być dziwactwem tego zestawu danych.

BGreene
źródło
7
Nie sądzę, że to (całkiem) to, co Hastie i in. są zwolennikami. Ogólnym argumentem jest to, że jeśli wybór funkcji korzysta z odpowiedzi , lepiej ją uwzględnić jako część procedury CV. Jeśli wykonujesz przesiewanie predyktorów, np. Patrząc na ich wariancje próbne i wykluczając predyktory o małej zmienności, jest to w porządku procedura jednorazowa.
kardynał
3
+1, jednak nawet w tym przypadku weryfikacja krzyżowa nie reprezentuje wariancji w procesie wyboru funkcji, co może stanowić problem, jeśli wybór funkcji jest niestabilny. Jeśli najpierw wykonasz badanie przesiewowe, wówczas zmienność wydajności w każdym zakładaniu będzie niedostatecznie reprezentować prawdziwą zmienność. Jeśli wykonasz przesiewanie w każdej zakładce, odpowiednio zwiększy to zmienność wydajności w każdej zakładce. Nadal zawsze przeprowadzałbym badanie przesiewowe w każdym folderze, jeśli było mnie stać na koszt obliczeniowy.
Dikran Torbacz
1
Myślę, że stwierdzenie „DOWOLNY wybór funkcji dokonany przed oszacowaniem wydajności modelu przy użyciu weryfikacji krzyżowej może spowodować przeregulowanie”. jest błędnym cytatem lub sugestią Hastie i innych. Jeśli zmienisz słowo „przed” na „bez”, to ma to większy sens. Wydaje się również, że zdanie sugeruje, że krzyżowa walidacja jest jedynym sposobem legalnego przetestowania odpowiedniości wybranych zmiennych. Na przykład bootstrap może być innym uzasadnionym podejściem ,
Michael Chernick
@MichaelChernick - uzgodniono. Edytowałem powyżej, aby lepiej odzwierciedlić moje znaczenie.
BGreene
1
@Bgreene: niedawno odbyła się dyskusja na ten temat, którą można przeczytać na goo.gl/C8BUa .
Alekk,

Odpowiedzi:

68

Jeśli dokonasz wyboru funkcji na wszystkich danych, a następnie zweryfikujesz krzyżowo, wtedy dane testowe w każdym folderze procedury krzyżowej weryfikacji zostaną również użyte do wybrania funkcji i to właśnie wpływa na analizę wydajności.

Rozważ ten przykład. Generujemy niektóre dane docelowe, przerzucając monetę 10 razy i rejestrując, czy spadają jako główki czy reszki. Następnie generujemy 20 funkcji, przewracając monetę 10 razy dla każdej funkcji i zapisujemy, co otrzymujemy. Następnie dokonujemy wyboru funkcji, wybierając funkcję, która najlepiej odpowiada docelowym danym i wykorzystujemy ją jako naszą prognozę. Jeśli następnie przeprowadzimy walidację krzyżową, otrzymamy oczekiwany poziom błędu nieco niższy niż 0,5. Wynika to z faktu, że wybraliśmy tę funkcję na podstawie korelacji zarówno z zestawem treningowym, jak i zestawem testowym w każdym folderze procedury walidacji krzyżowej. Jednak prawdziwy poziom błędu wyniesie 0,5, ponieważ dane docelowe są po prostu losowe. Jeśli wybierzesz funkcję niezależnie w ramach każdego krotności weryfikacji krzyżowej, oczekiwana wartość wskaźnika błędów wynosi 0.

Kluczową ideą jest to, że walidacja krzyżowa jest sposobem oszacowania wydajności uogólnienia procesu budowania modelu, dlatego należy powtarzać cały proces w każdym folderze. W przeciwnym razie skończysz z tendencyjnym oszacowaniem lub niedoszacowaniem wariancji oszacowania (lub obu).

HTH

Oto kod MATLAB, który wykonuje symulację Monte-Carlo tego zestawu, z 56 funkcjami i 259 przypadkami, aby pasować do twojego przykładu, dane wyjściowe są następujące:

Pobierany estymator: erate = 0,429210 (0,397683 - 0,451737)

Bezstronny estymator: erate = 0,499689 (0,397683 - 0,590734)

Bieżący estymator to taki, w którym selekcja cech jest przeprowadzana przed walidacją krzyżową, bezstronny estymator to taki, w którym selekcja cech jest przeprowadzana niezależnie w każdym krotności walidacji krzyżowej. Sugeruje to, że uprzedzenie może być w tym przypadku dość poważne, w zależności od charakteru zadania uczenia się.

NF    = 56;
NC    = 259;
NFOLD = 10;
NMC   = 1e+4;

% perform Monte-Carlo simulation of biased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform feature selection

   err       = mean(repmat(y,1,NF) ~= x);
   [err,idx] = min(err);

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, '  Biased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

% perform Monte-Carlo simulation of unbiased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      % perform feature selection

      err       = mean(repmat(y(partition~=j),1,NF) ~= x(partition~=j,:));
      [err,idx] = min(err);

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, 'Unbiased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));
Dikran Torbacz
źródło
3
Dziękuję - to jest bardzo pomocne. Jeśli przyjmiesz sugerowane podejście, jak ocenisz swój ostateczny model? Ponieważ będziesz mieć wiele zestawów funkcji, w jaki sposób wybierzesz ostateczny zestaw funkcji? Historycznie zgłaszałem również wyniki oparte na pojedynczej walidacji krzyżowej z wybranymi parametrami modelu i cechami.
BGreene
15
Walidację krzyżową najlepiej postrzegać jako ocenę wydajności procedury dopasowania modelu, a nie samego modelu. Najlepszą rzeczą do zrobienia jest zwykle przeprowadzenie weryfikacji krzyżowej, jak powyżej, a następnie zbudowanie ostatecznego modelu przy użyciu całego zestawu danych, przy użyciu tej samej procedury stosowanej w każdym folderze procedury weryfikacji krzyżowej.
Dikran Torbacz
2
Czy w takim przypadku zgłaszamy wyniki klasyfikacji na podstawie weryfikacji krzyżowej (potencjalnie wiele różnych zestawów cech), ale zgłaszamy, że model zawiera tylko jeden z tych zestawów cech, tj. Wyniki klasyfikacji potwierdzonej krzyżowo niekoniecznie pasują do zestawu cech?
BGreene
10
Zasadniczo tak, weryfikacja krzyżowa jedynie szacuje oczekiwaną wydajność procesu budowania modelu, a nie sam model. Jeśli zestaw cech różni się znacznie w zależności od jednej wartości walidacji krzyżowej do drugiej, oznacza to, że wybór cech jest niestabilny i prawdopodobnie mało znaczący. Często najlepiej jest stosować regularyzację (np. Regresję grzbietu) zamiast wyboru funkcji, szczególnie jeśli ta ostatnia jest niestabilna.
Dikran Torbacz
3
To bardzo ważny post. Zadziwiające, jak wielu tego nie stosuje.
Chris A.
12

Aby dodać nieco inny i bardziej ogólny opis problemu:

Jeśli wykonujesz jakiekolwiek wstępne przetwarzanie danych , np

  1. optymalizacja parametrów prowadzona przez cross-validation / out-of-bootstrap
  2. redukcja wymiarowości za pomocą technik takich jak PCA lub PLS w celu uzyskania danych wejściowych dla modelu (np. PLS-LDA, PCA-LDA)
  3. ...

i chcesz użyć walidacji krzyżowej / out-of-bootstrap (/ hold out) w celu oszacowania wydajności ostatecznego modelu, oparte na danych wstępne przetwarzanie musi zostać wykonane na danych szkoleniowych zastępczych, tj. osobno dla każdego modelu zastępczego.

Jeżeli wstępne przetwarzanie oparte na danych jest typu 1., prowadzi to do „podwójnej” lub „zagnieżdżonej” krzyżowej walidacji: estymacja parametru jest wykonywana w krzyżowej walidacji przy użyciu tylko zestawu szkoleniowego „zewnętrznej” walidacji krzyżowej. ElemStatLearn ma ilustrację ( https://web.stanford.edu/~hastie/Papers/ESLII.pdf strona 222 wydruku 5).

Można powiedzieć, że wstępne przetwarzanie jest tak naprawdę częścią budowy modelu. wykonywane jest tylko wstępne przetwarzanie

  • niezależnie dla każdego przypadku lub
  • niezależnie od faktycznego zestawu danych

można wyjąć z pętli sprawdzania poprawności, aby zapisać obliczenia.

I na odwrót: jeśli Twój model jest całkowicie zbudowany na podstawie wiedzy zewnętrznej dla określonego zbioru danych (np. Na podstawie wcześniejszej wiedzy eksperta decydujesz, że kanały pomiarowe 63–79 nie mogą pomóc w rozwiązaniu problemu, możesz oczywiście wykluczyć te kanały , zbuduj model i zweryfikuj go krzyżowo. To samo, jeśli wykonasz regresję PLS i na podstawie własnego doświadczenia zdecydujesz, że 3 ukryte zmienne są rozsądnym wyborem (ale nie baw się, czy 2 lub 5 lv dają lepsze wyniki), możesz kontynuuj normalną walidację poza bootstrap / cross.

cbeleity
źródło
Niestety link do wydruku 5 książki ElemStatLearn nie działa. Zastanawiałem się, czy ilustracja, do której się odwołujesz, wciąż znajduje się na tej samej stronie. Proszę również wspomnieć o podpisie.
rraadd88
Więc jeśli mam dwa zestawy danych, czy wybór funkcji / inżynieria na jednym z nich, a CV na drugim, nie byłoby problemów?
Milos
1
@Milos: nie, o ile funkcje te stają się stałymi parametrami dla modeli do wzajemnej weryfikacji, to powinno być OK. Byłoby to prawidłowe ustawienie generowania hipotez (= rozwój funkcji w zbiorze danych A) / testowania hipotez (= mierzenie wydajności obecnie ustalonych funkcji za pomocą zestawu danych B).
cbeleites,
@cbeleites Tak, właśnie to zamierzałem zrobić. Określ funkcje na A, a następnie napraw te funkcje i przeprowadź weryfikację krzyżową modeli na B. Dzięki. :)
Milos
@Milos: pamiętaj jednak, że twoja argumentacja za osiągniętą wydajnością jest jeszcze lepsza, jeśli w pełni trenujesz swój model na A, a następnie używasz B tylko do testowania.
cbeleites
5

Spróbujmy uczynić to nieco intuicyjnym. Rozważ ten przykład: masz binarne zależne i dwa binarne predyktory. Chcesz model z tylko jednym predyktorem. Oba predyktory mają szansę powiedzieć, że 95% jest równe zależnej, a szansa 5% nie zgadzać się z zależną.

Teraz, przypadkowo na twoich danych, jeden predyktor jest zależny od całych danych w 97% przypadków, a drugi tylko w 93% przypadków. Wybierz predyktor z 97% i zbuduj swoje modele. W każdym folderze walidacji krzyżowej model będzie zależny od predyktora, ponieważ prawie zawsze ma on rację. Dzięki temu uzyskasz 97% przewidywaną wydajność.

Teraz możesz powiedzieć, ok, to po prostu pech. Ale jeśli predyktory są skonstruowane jak powyżej, masz szansę 75%, że co najmniej jeden z nich ma dokładność> 95% na całym zbiorze danych i to właśnie wybierzesz. Masz więc 75% szansy na przeszacowanie wydajności.

W praktyce oszacowanie efektu wcale nie jest trywialne. Jest całkowicie możliwe, że wybór funkcji wybierze te same funkcje w każdym folderze, tak jakbyś zrobił to w całym zestawie danych, a wtedy nie będzie stronniczości. Efekt staje się również mniejszy, jeśli masz dużo więcej próbek, ale funkcji. Korzystne może być użycie obu danych w obu kierunkach i sprawdzenie, jak różnią się wyniki.

Możesz także odłożyć na bok pewną ilość danych (powiedzmy 20%), użyć zarówno swojej, jak i prawidłowej metody, aby uzyskać oszacowania wydajności poprzez wzajemne sprawdzanie poprawności na 80% i zobaczyć, która prognoza wydajności okaże się bardziej dokładna po przeniesieniu modelu do 20 % odłożonych danych. Pamiętaj, że aby to zadziałało, wybór funkcji przed CV będzie musiał zostać dokonany tylko na 80% danych. W przeciwnym razie nie będzie symulować przeniesienia modelu do danych poza próbką.

Erik
źródło
Czy mógłbyś bardziej szczegółowo opisać właściwy sposób dokonywania wyboru funkcji na intuicyjnym przykładzie? Dziękuję Ci.
uared1776