如何在测试集上使用 PCA(代码)

How to use PCA on test set (code)

我正在尝试使用 PCA select 一些 K 主成分来处理。

我知道不应该在测试集上重新运行 PCA,而是在对训练集建模时使用发现的特征向量\PC。

我有 2 个 CSV - 一个是训练集,

另外一个测试集(每条记录不带标签)

训练集 上的 PCA 过程使用以下代码完成:

# Load CSV file
train_set.init_data <- read.csv("D:\train.csv", header = TRUE)

# Remove identifier and respone variables (ID, and SalePrice):
train_set.vars <- subset(train_set.init_data, select = -c(Id, SalePrice))

# Convert catergorical variables into numerical using dummy variables:
library(dummies)
train_set.vars_dummy <- dummy.data.frame(train_set.vars, sep = ".")

# Principal Component Analysis:
train_set.prin_comp <- prcomp(train_set.vars_dummy, scale. = T)

# Choose some K components
????

# Run linear regression model based on PC's
<.....>

使用训练集构建模型后,我需要加载测试集和 运行 我的预测模型。

我遇到的困难 'How to code it?':

  1. 如何在 运行ning PCA(在训练集上)之后提取 K(将根据碎石图选择)PC,因此训练集的建模将基于那些? (规划线性回归)

  2. 想运行在实际测试集上构建模型时如何使用K个提取的PC?

  3. 我应该先对测试集中的特征进行零均值处理,还是对其进行缩放 STD? 对于训练集,我知道 prcomp 方法已经为我完成了,所以我不确定是否应该在测试集上手动完成。

  4. 我是否应该像我对训练集所做的那样,使用虚拟变量将测试集的分类变量转换为数值?

DO 了解基本知识 - 应用于训练集的相同操作也应应用于测试集。

但是 - 我不确定这在代码方面到底意味着什么。

谢谢

我正在使用 USArrests 数据集来让您了解对测试数据执行 PCA 的步骤顺序。

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

方法 1 - 组合训练和测试

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

在这种方法中,测试数据可能会泄漏到训练数据中。

方法 2 - 使用 predict() 从训练数据的 PCA 加载中转换测试数据

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

与之前的方法相比,这种方法更加稳健。