在R中如何将主成分用于线性与逻辑回归预测求助
嘿,我刚好碰到过类似的情况,把PCA主成分当作常规变量用来做多分类逻辑回归其实没那么复杂,我给你一步步捋清楚怎么做:
第一步:从PCA结果里提取可用的主成分得分
首先假设你已经用R完成了PCA分析(比如用prcomp(),这是R里最常用的PCA函数),咱们得先把主成分得分提取出来——这些得分就是能直接用来建模的“新变量”。
举个实际代码例子,假设你的数据集叫raw_data,因变量是target(多分类):
# 先把因变量从自变量里分离出来,PCA只针对自变量做 pca_input <- raw_data[, !names(raw_data) %in% "target"] # 执行PCA,记得加scale.=TRUE做标准化,不然量纲会干扰结果 pca_result <- prcomp(pca_input, scale. = TRUE) # 提取主成分得分,这会生成PC1、PC2、PC3...这样的列 pc_scores <- as.data.frame(pca_result$x) # 把因变量加回到主成分得分数据框里,方便后续建模 model_df <- cbind(pc_scores, target = raw_data$target)
这里pca_result$x就是每个样本在各个主成分上的得分,直接转成数据框就和你平时用的数据集一模一样了。
第二步:用主成分做多分类逻辑回归
之前你用的多分类逻辑回归,这里给你两种常用的实现方式,都是把主成分当普通自变量用就行:
基础版:用nnet::multinom()
library(nnet) # 拟合模型,比如选前3个主成分(你可以根据方差解释率调整数量) multi_model <- multinom(target ~ PC1 + PC2 + PC3, data = model_df) # 查看模型细节 summary(multi_model) # 生成预测结果 preds <- predict(multi_model, newdata = model_df, type = "class")
进阶版:用caret做交叉验证(推荐,帮你优化精度)
既然你之前精度没达标,交叉验证能帮你更严谨地评估模型,还能帮你选最优的主成分数量:
library(caret) # 设置10折交叉验证 train_ctrl <- trainControl(method = "cv", number = 10) # 拟合模型,这里可以指定用前n个主成分,或者后续优化数量 caret_model <- train(target ~ PC1 + PC2 + PC3 + PC4, data = model_df, method = "multinom", trControl = train_ctrl, trace = FALSE) # 查看模型的交叉验证精度 print(caret_model) # 生成预测 caret_preds <- predict(caret_model, model_df)
第三步:选对主成分数量很关键(提升精度的核心)
精度不够的话,很可能是你选的主成分数量不对,给你两个实用的方法来确定保留多少个:
- 碎石图法:找方差突然下降的“拐点”,拐点后的主成分可以不用保留
screeplot(pca_result, type = "lines", main = "碎石图:主成分方差解释率")
- 累积方差解释率:比如保留累积解释率超过80%的主成分,确保信息损失最少
# 计算单个主成分的方差解释率 var_explained <- pca_result$sdev^2 / sum(pca_result$sdev^2) # 计算累积方差解释率 cum_var <- cumsum(var_explained) # 找到第一个累积方差超过80%的主成分位置 n_optimal <- which(cum_var >= 0.8)[1] # 这样就可以用前n_optimal个主成分建模,比如 target ~ PC1 + ... + PC{n_optimal}
几个避坑提醒
- 做PCA时一定要标准化变量(
prcomp()里的scale.=TRUE),不然数值大的变量会主导主成分,结果完全失真 - 绝对不要把因变量放进PCA的输入里!PCA是对自变量做降维,和因变量无关
- 如果你用的是
princomp()而不是prcomp(),提取得分的命令是pca_result$scores,和prcomp()的x作用一样
内容的提问来源于stack exchange,提问作者Sameen
相关产品推荐
相关产品推荐

