如何使用 R prcomp 结果进行预测?

机器算法验证 r 主成分分析
2022-01-30 06:47:53

我有一个 800 obs 的 data.frame。40 个变量,并且想使用主成分分析来改进我的预测结果(到目前为止,在大约 15 个手工挑选的变量上使用支持向量机效果最好)。

我知道 prcomp 可以帮助我改进我的预测,但我不知道如何使用 prcomp 函数的结果。

我得到结果:

> PCAAnalysis <- prcomp(TrainTrainingData, scale.=TRUE)
> summary(PCAAnalysis)
Importance of components:
                          PC1    PC2    PC3    PC4    PC5   PC6    PC7    PC8    PC9   PC10   PC11   PC12   PC13   PC14
Standard deviation     1.7231 1.5802 1.3358 1.2542 1.1899 1.166 1.1249 1.1082 1.0888 1.0863 1.0805 1.0679 1.0568 1.0520
Proportion of Variance 0.0742 0.0624 0.0446 0.0393 0.0354 0.034 0.0316 0.0307 0.0296 0.0295 0.0292 0.0285 0.0279 0.0277
Cumulative Proportion  0.0742 0.1367 0.1813 0.2206 0.2560 0.290 0.3216 0.3523 0.3820 0.4115 0.4407 0.4692 0.4971 0.5248
                         PC15   PC16   PC17   PC18  PC19   PC20   PC21   PC22   PC23   PC24   PC25   PC26   PC27   PC28
Standard deviation     1.0419 1.0283 1.0170 1.0071 1.001 0.9923 0.9819 0.9691 0.9635 0.9451 0.9427 0.9238 0.9111 0.9073
Proportion of Variance 0.0271 0.0264 0.0259 0.0254 0.025 0.0246 0.0241 0.0235 0.0232 0.0223 0.0222 0.0213 0.0208 0.0206
Cumulative Proportion  0.5519 0.5783 0.6042 0.6296 0.655 0.6792 0.7033 0.7268 0.7500 0.7723 0.7945 0.8159 0.8366 0.8572
                         PC29   PC30   PC31   PC32   PC33   PC34   PC35   PC36    PC37                 PC38
Standard deviation     0.8961 0.8825 0.8759 0.8617 0.8325 0.7643 0.7238 0.6704 0.60846 0.000000000000000765
Proportion of Variance 0.0201 0.0195 0.0192 0.0186 0.0173 0.0146 0.0131 0.0112 0.00926 0.000000000000000000
Cumulative Proportion  0.8773 0.8967 0.9159 0.9345 0.9518 0.9664 0.9795 0.9907 1.00000 1.000000000000000000
                                       PC39                 PC40
Standard deviation     0.000000000000000223 0.000000000000000223
Proportion of Variance 0.000000000000000000 0.000000000000000000
Cumulative Proportion  1.000000000000000000 1.000000000000000000

我以为我会获得最重要的参数,但我只是没有找到这些信息。我所看到的只是 PC 上的标准偏差等。但是我如何用它来预测呢?

2个回答

虽然我不确定您的问题的性质,但我可以告诉您,我在稍后的模型构建中使用 PCA 作为在一组预测变量中提取主导模式的方法。在您的示例中,这些将在主成分 (PC) 中找到PCAAnalysis$x,它们将基于在 中找到的变量的权重PCAAnalysis$rotation此过程的一个优点是 PC 是正交的,因此您可以消除模型预测变量之间的多重共线性问题。第二,您可能能够识别出较小的 PC 子集,这些 PC 可以捕获预测变量中的大部分方差。此信息可在summary(PCAAnalysis)或 中找到PCAAnalysis$sdev最后,如果您有兴趣使用 PC 的子集进行预测,那么您可以将tol参数设置为prcomp到更高的级别以删除尾随 PC。

现在,您可以使用该功能将新数据“投影”到 PCA 坐标基础上predict.prcomp()由于您将数据集称为“训练”数据集,因此将验证数据集投影到 PCA 基础上以计算它们各自的 PC 坐标可能是有意义的。下面是一个将 PCA 拟合到不同虹膜物种的 4 个生物特征测量值的示例(它们在一定程度上相关)。在此之后,我预测了一组新的花的生物特征值,这些数据集对三种鸢尾花中的每一种都有相似的这些测量值组合。您将从最终图表中看到,他们的投影 PC 位于与原始数据集相似的绘图区域。

iris使用数据集的示例:

### pca - calculated for the first 4 columns of the data set that correspond to biometric measurements ("Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width")
data(iris)

# split data into 2 parts for pca training (75%) and prediction (25%)
set.seed(1)
samp <- sample(nrow(iris), nrow(iris)*0.75)
iris.train <- iris[samp,]
iris.valid <- iris[-samp,]

# conduct PCA on training dataset
pca <- prcomp(iris.train[,1:4], retx=TRUE, center=TRUE, scale=TRUE)
expl.var <- round(pca$sdev^2/sum(pca$sdev^2)*100) # percent explained variance

# prediction of PCs for validation dataset
pred <- predict(pca, newdata=iris.valid[,1:4])

###Plot result
COLOR <- c(2:4)
PCH <- c(1,16)

pc <- c(1,2) # principal components to plot

png("pca_pred.png", units="in", width=5, height=4, res=200)
op <- par(mar=c(4,4,1,1), ps=10)
plot(pca$x[,pc], col=COLOR[iris.train$Species], cex=PCH[1], 
 xlab=paste0("PC ", pc[1], " (", expl.var[pc[1]], "%)"), 
 ylab=paste0("PC ", pc[2], " (", expl.var[pc[2]], "%)")
)
points(pred[,pc], col=COLOR[iris.valid$Species], pch=PCH[2])
legend("topright", legend=levels(iris$Species), fill = COLOR, border=COLOR)
legend("topleft", legend=c("training data", "validation data"), col=1, pch=PCH)
par(op)
dev.off()

在此处输入图像描述

您附加到问题的 summary() 命令的信息允许您查看,例如,每个主成分捕获的方差比例(方差比例)。此外,计算累积比例以输出。例如,您需要 23 台 PC 才能捕获数据集中 75% 的方差。

这当然不是您通常用作进一步分析输入的信息。相反,您通常需要的是旋转后的数据,它在 prcomp 创建的对象中保存为“x”。

使用 R 代码作为一个简短的示例。

pr<-prcomp(USArrests, scale = TRUE)
summary(pr) # two PCs for cumulative proportion of >80% 
newdat<-pr$x[,1:2]

然后,您可以使用 newdat 中的数据进行进一步分析,例如,作为 SVM 或某些回归模型的输入。此外,请参阅例如https://stackoverflow.com/questions/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r了解更多信息。