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

时间:2017-02-19 08:49:38

标签: r pca

我试图使用PCA来选择一些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
<.....>

在我使用训练集构建模型之后,我需要加载测试集并在其上运行我的预测模型。

我遇到的困难,如何编码?&#39;:

  1. 如何在运行PCA(训练集)后提取K(将根据scree图选择)PC,因此训练集的建模将基于这些? (计划线性回归)

  2. 如果想要运行基于实际测试集的模型,如何使用K提取的PC?

  3. 我应首先将测试集中的功能置零,还是缩放它们的STD? 对于训练集,我理解prcomp方法已经为我做了,所以我不确定是否应该在测试集上手动完成。

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

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

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

    由于

1 个答案:

答案 0 :(得分:2)

我正在使用USArrests数据集来了解在测试数据上执行PCA时要遵循的步骤顺序。

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

方法1 - 组合列车&amp;测试

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

与早期方法相比,这种方法更加强大。