You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用主成分逻辑回归(PCLR)模型获取预测类别

如何从主成分逻辑回归(PCLR)模型获取预测类别

问题原因

R中glm()拟合的二项逻辑回归模型,其predict()函数本身不支持type="class"参数——无论是否结合PCA(即PCLR),该函数仅允许link(默认,输出logit变换值)、response(输出预测概率)、terms这三种类型。你之前误以为普通逻辑回归能直接获取类别,实际上普通逻辑回归也需要手动从预测值(logit或概率)转换为类别。

解决方法

通过type="response"获取预测概率后,设定分类阈值(通常取0.5,可根据业务需求调整),手动将概率转换为类别。

完整修改后的PCLR代码

df <- read.csv("task8.csv")
sample <- sample(c(TRUE, FALSE), nrow(df), replace=TRUE, prob=c(0.7,0.3))
train <- df[sample, ]
test <- df[!sample, ]

# 对训练集特征做PCA
pca.out <- prcomp(train[,c(-61)], center=TRUE, scale.=TRUE)
# 构建PCA特征+标签的数据集
md <- data.frame(Class=train[,"Class"], pca.out$x[,1:20])
# 拟合PCLR模型
PCLR <- glm(Class~., data=md, family=binomial)

# 对测试集做PCA转换(注意参数是newdata,不是nd)
test_pca <- predict(pca.out, newdata=test[,1:60])
# 获取测试集的预测概率
pred_prob <- predict(PCLR, newdata=data.frame(test_pca[,1:20]), type="response")

# 将概率转换为预测类别
threshold <- 0.5
# 如果Class是因子型,按水平转换
pred_class <- ifelse(pred_prob > threshold, levels(train$Class)[2], levels(train$Class)[1])
# 如果Class是数值型(如0/1),可简化为:
# pred_class <- as.integer(pred_prob > threshold)

# 查看结果
head(pred_class)

普通逻辑回归的类别获取方式(对照)

其实普通逻辑回归也需要相同的转换步骤,你之前得到的predicted是logit变换值,并非类别,转换方式如下:

# 普通逻辑回归获取类别
model <- glm(Class~., data=train, family=binomial)
# 先获取概率
pred_prob <- predict(model, test, type="response")
# 再转换为类别
pred_class <- ifelse(pred_prob > 0.5, levels(train$Class)[2], levels(train$Class)[1])

注意事项

  • 代码中predict(pca.out, newdata=test[,1:60])的参数是newdata,而非你之前写的nd,虽然R允许省略参数名,但规范写法能避免潜在错误。
  • 分类阈值可根据模型的召回率、精确率需求调整,不一定必须用0.5。

内容的提问来源于stack exchange,提问作者user21268575

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:39:57