如何使用主成分逻辑回归(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
相关产品推荐
相关产品推荐

