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 caret
pakiecie 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?
źródło
Odpowiedzi:
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:
lub schemat 2:
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.
źródło
Nie przetwarzaj danych przed uruchomieniem
train
funkcji! UżyjpreProcess
argumentu funkcji pociągu, a wstępne przetwarzanie zostanie zastosowane do każdej iteracji ponownego próbkowania.np. nie rób tego:
Zrób to!
źródło
pred <- predict(knnFit2, newdata)
gdzienewdata
nie jest skalowane. Czy Caret jest wystarczająco inteligentny, aby wiedzieć, że musi go wstępnie przetworzyćnewdata
przed użyciem go do prognoz?