Walidacja krzyżowa PCA i k-krotnie w pakiecie karetki w R.

16

Właśnie obejrzałem ponownie wykład z kursu Machine Learning na Coursera. W części, w której profesor omawia PCA do wstępnego przetwarzania danych w nadzorowanych aplikacjach edukacyjnych, mówi, że PCA powinno być wykonywane tylko na danych szkoleniowych, a następnie mapowanie służy do transformacji zestawów walidacji krzyżowej i testów. Zobacz także PCA i podział pociąg / test .

Jednak w caretpakiecie R dane treningowe przekazywane do train()funkcji są już przetwarzane przez PCA. Kiedy więc algorytm wykonuje k-krotną walidację krzyżową, zestaw walidacji krzyżowej został już przetworzony za pomocą PCA przez preProcess()i predict()faktycznie jest używany w „dopasowaniu” PCA.

Czy moje rozumienie sytuacji jest prawidłowe? Czyli procedura walidacji krzyżowej z PCA (a właściwie dowolną metodą przeskalowania / centrowania) jest „nieprawidłowa”, ponieważ wstępne przetwarzanie danych odbywa się na zestawie walidacji krzyżowej, a także na zestawie szkoleniowym? A jeśli tak, to jak duży będzie to miało wpływ na wyniki?

mchangun
źródło
1
Interesujące pytanie. Czy profesor Ng podaje powody, dla których „PCA powinno być wykonywane tylko na danych szkoleniowych, a następnie mapowanie służy do transformacji zestawów walidacji krzyżowej i testów”? Moją intuicją jest to, że wpływ powinien być minimalny, ponieważ zakłada się, że dane dotyczące pociągu / cv / testu pochodzą z tego samego rozkładu, a PCA nie obejmuje zmiennych wyjściowych / zależnych.
miura,
1
@miura Tak, robi. Wykonując PCA, musimy rozwiązać dla minimalnej liczby k wymiarów wektorów wyjściowych potrzebnych do osiągnięcia pożądanej „zachowanej wariancji”. Ten parametr k jest obecnie (moim zdaniem) dodatkowym parametrem naszego algorytmu, który musimy dopasować. Jeśli wykonamy PCA również na zestawie weryfikacji krzyżowej, w efekcie szkolimy część naszego algorytmu na zestawie CV, zmniejszając w ten sposób wartość weryfikacji krzyżowej.
mchangun,
Myślę, że mylisz PCA i MDS, ale w obu metodach nie ustawiasz pożądanej zachowanej wariancji. Ale można to obliczyć na podstawie przyniesienia, aby zredukować do k wymiarów. Nie musisz go dopasowywać, ponieważ pierwszy wymiar zawsze redukuje więcej wariancji niż drugi, a drugi więcej niż trzeci ...
llrs

Odpowiedzi:

18

Nie widziałem wykładu, więc nie mogę komentować tego, co zostało powiedziane.

Moje 0,02 USD: Jeśli chcesz uzyskać dobre oszacowania wydajności za pomocą ponownego próbkowania, powinieneś naprawdę wykonać wszystkie operacje podczas ponownego próbkowania zamiast wcześniejszego. Dotyczy to w szczególności wyboru funkcji [1], a także trywialnych operacji, takich jak PCA. Jeśli powoduje to niepewność wyników, należy uwzględnić to w ponownym próbkowaniu.

Pomyśl o regresji głównych składników: PCA, po której następuje regresja liniowa niektórych składników. PCA szacuje parametry (z hałasem) i liczbę komponentów również należy wybrać (różne wartości spowodują różne wyniki => więcej hałasu).

Powiedzmy, że użyliśmy 10-krotnego CV ze schematem 1:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

lub schemat 2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

Powinno być jasne, że drugie podejście powinno dawać oszacowania błędów, które odzwierciedlają niepewność spowodowaną PCA, wybór liczby składników i regresję liniową. W efekcie CV w pierwszym schemacie nie ma pojęcia, co go poprzedziło.

Jestem winny, że nie zawsze wykonuję wszystkie operacje z ponownym próbkowaniem, ale tylko wtedy, gdy tak naprawdę nie dbam o oszacowania wydajności (co jest niezwykłe).

Czy istnieje duża różnica między tymi dwoma programami? To zależy od danych i przetwarzania wstępnego. Jeśli tylko centrujesz i skalujesz, prawdopodobnie nie. Jeśli masz mnóstwo danych, prawdopodobnie nie. W miarę zmniejszania się rozmiaru zestawu treningowego rośnie ryzyko uzyskania złych oszacowań, szczególnie jeśli n jest bliskie p.

Mogę z całą pewnością stwierdzić z doświadczenia, że ​​nie uwzględnienie nadzorowanego wyboru funkcji podczas ponownego próbkowania jest naprawdę złym pomysłem (bez dużych zestawów szkoleniowych). Nie rozumiem, dlaczego przetwarzanie wstępne byłoby na to odporne (do pewnego stopnia).

@mchangun: Myślę, że liczba komponentów jest parametrem dostrajającym i prawdopodobnie zechcesz go wybrać przy użyciu oszacowań wydajności, które można uogólnić. Możesz automatycznie wybrać K, aby wyjaśnić co najmniej X% wariancji i uwzględnić ten proces w ponownym próbkowaniu, aby uwzględnić szum w tym procesie.

Max

[1] Ambroise, C., i McLachlan, G. (2002). Błąd selekcji w ekstrakcji genów na podstawie danych ekspresji genów mikromacierzy. Postępowania z National Academy of Sciences, 99 (10), 6562–6566.

topepo
źródło
21

Nie przetwarzaj danych przed uruchomieniem trainfunkcji! Użyj preProcess argumentu funkcji pociągu, a wstępne przetwarzanie zostanie zastosowane do każdej iteracji ponownego próbkowania.

np. nie rób tego:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

Zrób to!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))
Zach
źródło
1
Jeśli wykonuję proces prProcess zgodnie z sugestią, czy muszę wstępnie przetwarzać nowe dane, gdy chcę użyć modelu do prognoz? W tej chwili robię tylko: pred <- predict(knnFit2, newdata) gdzie newdatanie jest skalowane. Czy Caret jest wystarczająco inteligentny, aby wiedzieć, że musi go wstępnie przetworzyć newdataprzed użyciem go do prognoz?
mchangun
7
@mchangun no. Caret zapisuje parametry przetwarzania wstępnego i wstępnie przetworzy nowe dane w wywołaniu predykcji. to całkiem śliskie!
Zach