我试图使用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;:
如何在运行PCA(训练集)后提取K(将根据scree图选择)PC,因此训练集的建模将基于这些? (计划线性回归)
如果想要运行基于实际测试集的模型,如何使用K提取的PC?
我应首先将测试集中的功能置零,还是缩放它们的STD?
对于训练集,我理解prcomp
方法已经为我做了,所以我不确定是否应该在测试集上手动完成。
我是否应该使用虚拟变量将测试集的分类变量转换为数字?正如我对训练集所做的那样?
我 DO 了解基本 - 应用于训练集的相同操作也应该应用于测试集。
但是 - 我不确定这在代码方面究竟意味着什么。
由于
答案 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)
与早期方法相比,这种方法更加强大。