PCA und k-fache Kreuzvalidierung in Caret-Packung in R


16

Ich habe mir gerade einen Vortrag aus dem Kurs über maschinelles Lernen auf Coursera noch einmal angesehen. In dem Abschnitt, in dem der Professor PCA für die Vorverarbeitung von Daten in beaufsichtigten Lernanwendungen bespricht, sagt er, dass PCA nur für die Trainingsdaten durchgeführt werden sollte und dann das Mapping verwendet wird, um die Kreuzvalidierungs- und Test-Sets zu transformieren. Siehe auch PCA und die Zug- / Testaufteilung .

In der caret R-Paket werden die Trainingsdaten, die Sie an die train()Funktion übergeben, jedoch bereits von PCA verarbeitet. Wenn der Algorithmus eine k-fache Kreuzvalidierung durchführt, wurde der Kreuzvalidierungssatz bereits mit PCA über preProcess()und verarbeitet predict()und wird tatsächlich in der PCA- "Anpassung" verwendet.

Ist mein Verständnis der Situation korrekt? Das heißt, das Verfahren von Caret zur Kreuzvalidierung mit PCA (oder in der Tat mit einer Methode zum erneuten Skalieren / Zentrieren) ist "falsch", weil die Vorverarbeitung von Daten sowohl auf dem Kreuzvalidierungssatz als auch auf dem Trainingssatz durchgeführt wird. Und wenn ja, wie stark würde sich dies auf die Ergebnisse auswirken?


1
Interessante Frage. Begründet Professor Ng, warum "PCA nur an den Trainingsdaten durchgeführt werden sollte und dann das Mapping verwendet wird, um die Kreuzvalidierungs- und Test-Sets zu transformieren"? Meiner Intuition nach sollte die Auswirkung minimal sein, da angenommen wird, dass Zug- / Lebenslauf- / Testdaten von derselben Verteilung stammen und PCA nicht die Ausgabe- / abhängigen Variablen umfasst.
Miura

1
@ miura Ja, das tut er. Bei der Durchführung einer PCA müssen wir die minimale Anzahl k der Dimensionen in den Ausgangsvektoren ermitteln, die erforderlich sind, um die gewünschte "beibehaltene Varianz" zu erzielen. Dieser Parameter k ist nun (nach meinem Verständnis) ein zusätzlicher Parameter unseres Algorithmus, den wir anpassen müssen. Wenn wir PCA auch für den Kreuzvalidierungssatz durchführen, trainieren wir tatsächlich einen Teil unseres Algorithmus für den CV-Satz, wodurch der Wert der Kreuzvalidierung verringert wird.
mchangun

Ich denke, Sie verwechseln PCA und MDS, aber bei beiden Methoden stellen Sie keine gewünschte beibehaltene Varianz ein. Aber Sie können es aus der Anpassung berechnen, die sie zur Reduzierung auf k-Dimensionen bringen. Sie müssen es nicht anpassen, da die erste Dimension immer mehr Varianz reduziert als die zweite und die zweite mehr als die dritte ...
11.11.16

Antworten:


18

Ich habe die Vorlesung nicht gesehen, daher kann ich nicht kommentieren, was gesagt wurde.

My $ 0.02: Wenn Sie mit Resampling gute Schätzungen der Leistung erhalten möchten, sollten Sie wirklich alle Vorgänge während des Resamplings ausführen, anstatt zuvor. Dies gilt sowohl für die Funktionsauswahl [1] als auch für nicht triviale Operationen wie PCA. Wenn die Ergebnisse dadurch unsicherer werden, schließen Sie sie in die erneute Abtastung ein.

Denken Sie an die Hauptkomponentenregression: PCA gefolgt von linearer Regression für einige der Komponenten. PCA schätzt die Parameter (mit Rauschen) und die Anzahl der Komponenten muss ebenfalls ausgewählt werden (unterschiedliche Werte führen zu unterschiedlichen Ergebnissen => mehr Rauschen).

Angenommen, wir haben einen 10-fachen Lebenslauf mit Schema 1 verwendet:

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:

oder Schema 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:

Es sollte klar sein, dass der zweite Ansatz zu Fehlerschätzungen führen sollte, die die durch PCA verursachte Unsicherheit, die Auswahl der Anzahl der Komponenten und die lineare Regression widerspiegeln. In der Tat hat der Lebenslauf im ersten Schema keine Ahnung, was davor war.

Ich bin schuld daran, nicht immer alle Operationen w / in Resampling zu tun, aber nur, wenn mir Leistungsschätzungen nicht wirklich wichtig sind (was ungewöhnlich ist).

Gibt es einen großen Unterschied zwischen den beiden Schemata? Es kommt auf die Daten und die Vorverarbeitung an. Wenn Sie nur zentrieren und skalieren, wahrscheinlich nicht. Wenn Sie eine Menge Daten haben, wahrscheinlich nicht. Wenn die Größe des Trainingssatzes abnimmt, steigt das Risiko, schlechte Schätzungen zu erhalten, insbesondere wenn n in der Nähe von p liegt.

Aus Erfahrung kann ich mit Sicherheit sagen, dass es eine wirklich schlechte Idee ist, die überwachte Merkmalsauswahl nicht in das Resampling einzubeziehen (ohne große Trainingssätze). Ich verstehe nicht, warum die Vorverarbeitung (bis zu einem gewissen Grad) dagegen immun ist.

@mchangun: Ich denke, dass die Anzahl der Komponenten ein Optimierungsparameter ist, und Sie möchten ihn wahrscheinlich anhand von verallgemeinerbaren Leistungsschätzungen auswählen. Sie können K automatisch so auswählen, dass mindestens X% der Varianz erklärt werden, und diesen Prozess in die Neuabtastung einbeziehen, damit wir das Rauschen in diesem Prozess berücksichtigen.

Max

[1] Ambroise, C. & McLachlan, G. (2002). Selektionsbias bei der Genextraktion auf Basis von Microarray-Genexpressionsdaten. Verfahren der National Academy of Sciences, 99 (10), 6562–6566.


21

Verarbeiten Sie die Daten nicht vor dem Ausführen der trainFunktion! Verwenden Sie diepreProcess Argument für die Zugfunktion, und die Vorverarbeitung wird auf jede Iteration der erneuten Abtastung angewendet.

zB mach das nicht :

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"))

mach das!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

1
Muss ich neue Daten vorverarbeiten, wenn ich das Modell für Vorhersagen verwenden möchte, wenn ich den von Ihnen vorgeschlagenen Prozess durchführe? Im Moment mache ich nur: pred <- predict(knnFit2, newdata) Wo newdataist nicht skaliert. Ist Caret intelligent genug, um zu wissen, dass es newdatavor der Verwendung für Vorhersagen eine Vorverarbeitung durchführen muss ?
mchangun

7
@mchangun nein. caret speichert die Vorverarbeitungsparameter und verarbeitet die neuen Daten im predict.caret-Aufruf vor. Es ist ziemlich glatt!
Zach
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.