2017-02-19 3 views
-1

Ich versuche, PCA zu verwenden, um einige Hauptkomponenten von K auszuwählen.So verwenden Sie PCA auf dem Testset (Code)

Ich verstehe, dass man PCA auf dem Test-Set NICHT erneut ausführen sollte, aber die Eigenvektoren verwenden, die beim Modellieren des Trainingssatzes gefunden wurden.

Ich habe 2 CSV ist - Eins gesetzt Ausbildung,

Der andere ein Test-Set (ohne das Etikett pro Datensatz)

PCA-Prozess auf dem Trainingssatz mit der getan wird folgender code:

Nachdem ich fertig bin, ein Modell mit dem Trainingssatz zu bauen, müsste ich die Testi laden ng setze und führe mein Vorhersagemodell darauf aus.

Die Schwierigkeiten, die ich habe, im Sinne von ‚Wie es codieren?‘:

  1. Wie K extrahieren PC nach dem Ausführen von PCA (auf der Ausbildung (Wird basierend auf Screeplot gewählt werden) Set), also basiert die Modellierung für das Trainingsszenario auf diesen? (Planung auf lineare Regression)

  2. Wie K extrahierte PCs zu verwenden, wenn Sie das Modell auf einem tatsächlichen Testset ausführen möchten?

  3. Soll ich zuerst die Merkmale im Testset nullstellen oder STD skalieren? Für das Trainingssatz verstehe ich prcomp Methode tut das schon für mich, also bin ich nicht sicher, ob ich es manuell auf dem Testset tun sollte.

  4. Sollte ich kategorische Variablen des Test-Sets mit Dummy-Variablen in numerische umwandeln, wie ich es mit dem Trainingssatz getan habe?

I DO der Grund verstehen - die gleichen Operationen auf den Trainingssatz angewandt wird, soll auch auf die Prüfung angewandt werden.

Aber - ich bin mir nicht sicher, was genau das in Bezug auf Code bedeutet.

Dank

+0

Nicht das richtige Forum, um dies zu fragen. Sie können versuchen, [Cross Validated] (http://stats.stackexchange.com) –

+0

@KarthikArelumugham, Wenn diese Frage auf Cross Validated, ich habe auch einen Kommentar, dass es nicht das richtige Forum. Siehe hier: http://stats.stackexchange.com/questions/262698/r-how-to-use-principal-component-on-test-set?noredirect=1#comment502651_262698 – Adiel

Antwort

2

Ich bin mit dem USArrests-Datensatz Ihnen eine Idee, die Abfolge von Schritten zu geben, zu befolge PCA auf Testdaten durchzuführen.

library(dplyr) 
library(tibble) 
data(USArrests) 
train <- USArrests %>% rownames_to_column(var = "rowname") 
test <- USArrests %>% rownames_to_column(var = "rowname") 

Ansatz 1 - Kombinierte Zug & Test

# Join train and test set 
df <- bind_rows("train" = train, "test" = test, .id="group") 
# Run Principal Components Analysis 
pc <- prcomp(df %>% select(-rowname, -group), scale = TRUE) 
# Plot ScreePlot 
pc_var <- (pc$sdev^2)/sum(pc$sdev^2) 
plot(pc_var, xlab = "Principal Component", ylab = "Proportion of Variance Explained", type = "b") 
# Extract PCs (e.g. 1st 3 PCs) 
df <- augment(pc,df) %>% select(group, rowname, .fittedPC1 : .fittedPC3) 
# Split into train and test 
train <- df %>% filter(group == "train") %>% select(-group) 
test <- df %>% filter(group == "test") %>% select(-group) 

die Testdaten auslaufen können in die Zugdaten Bei diesem Ansatz.

Ansatz 2 - Mit predict() Testdaten aus PCA Beladungen von Zugdaten

# Run Principal Components Analysis 
pc <- prcomp(train %>% select(-rowname), scale = TRUE) 
# Extract PCs (e.g. 1st 3 PCs) 
train <- tbl_df(pc1$x) %>% select(PC1:PC3) 
test <- tbl_df(predict(pc, newdata = test %>% select(-rowname))) %>% select(PC1:PC3) 

Dieser Ansatz ist robuster gegenüber dem einem früher im Vergleich zu transformieren.

+0

Danke, Das scheint einige meiner zu beantworten Gedanken. So klar sein - 1. Legen Sie Training & set CSV Prüfung 2. Entfernen Antwortvariable aus dem Trainingssatz 3. beide Sätze Kombinieren zusammen 4. PCA Perform Ist das Fluss richtig? Und noch habe ich einige der Fragen unklar für mich - Könnten Sie bitte erklären: 1. Die letzten zwei Zeilen, die 'df' verwenden, um zurück zu teilen - Wird dies tatsächlich meine Daten mit dem PC darstellen? 2. Nach dem Split - Zug und Test enthält die transformierten Features? Also könnte ich das Etikett (am Zugset) anbringen und eine lineare Regression verwenden? – Adiel

+0

Es tut mir leid, aber als durchschauen: https://www.analyticsvidhya.com/blog/2016/03/practical-guide-principal-component-analysis-python/ Der Autor sagt genau das Gegenteil von dem, was Sie Ich sage: 'Wir sollten den Zug und das Testset nicht kombinieren, um PCA-Komponenten von ganzen Daten auf einmal zu erhalten. Denn dies würde die gesamte Annahme der Generalisierung verletzen, da Testdaten in den Trainingssatz "durchsickern" würden. Mit anderen Worten, der Testdatensatz würde nicht mehr "ungesehen" bleiben. Letztendlich wird dies die Generalisierungsfähigkeit des Modells einschränken. " – Adiel

+0

@Adiel. Vielen Dank. Behoben. Was ich damit meinte war, dass du keine PCA im Zug machen und separat testen solltest - Der zweite Vorbehalt laut Autor. –