使用cv.glm时predict设type='response'报错,求最佳截断值及匹配方法
咱们一步步拆解你的问题,这里其实有几个关联的点需要理清:
1. 为什么cv.glm的predict不能设置type='response'?
cv.glm是boot包提供的交叉验证工具,它返回的对象对应的预测方法(predict.cv.glm)本身就没有type参数。这是因为交叉验证的核心是评估模型在训练集折叠上的表现,predict.cv.glm内部已经默认调用了原glm模型的predict方法,并指定了type='response'(对应响应变量尺度的预测值,比如逻辑回归的概率)。也就是说,你调用predict(cv.glm对象)得到的结果,已经是普通glm中type='response'对应的输出了,不需要额外设置。
2. 解决维度不匹配与报错的问题
你遇到的Number of cross-validation runs must be equal for predictions and labels报错,以及test$Survived维度为NULL的问题,核心是两个误解:
(1)混淆了交叉验证预测的对象
predict(cv.glm对象)返回的是训练集样本在交叉验证折叠中的预测值,不是测试集的预测结果!你看到的dim(pred1)=268 2,说明你用了2折交叉验证:每一行对应一个训练集观测,每一列对应一个折叠的预测值(每个观测在被分到验证集的那个折叠里的预测结果)。
而你用test$Survived(测试集标签)去匹配这个训练集的交叉验证预测值,本身就是对象不匹配,自然会报错。
(2)标签的结构不需要转数据框
dim(test$Survived)返回NULL是正常的——因为它是一个向量,向量没有dim属性,只有length。ROCR包的prediction函数完全接受向量作为标签输入,不需要转成数据框,只要长度和预测值匹配就行。
针对不同需求的解决方法
需求A:用交叉验证结果选截断值(基于训练集)
如果你的目标是通过交叉验证来选择最佳截断值,应该用训练集的标签和交叉验证的预测值匹配:
- 先提取每个观测在自己所属折叠中的预测值(把矩阵转成和标签长度一致的向量):
# 假设你的cv.glm对象是cv_model pred1_vector <- pred1[cbind(1:nrow(pred1), cv_model$fold)] - 然后用训练集标签和这个向量创建
prediction对象:library(ROCR) pred_obj <- prediction(pred1_vector, train$Survived)
需求B:对测试集做预测(用训练好的模型)
如果是要对独立测试集做预测,cv.glm只是用来评估模型的交叉验证误差,你需要用最初训练的glm模型来预测测试集,这时就可以正常用type='response'了:
# 假设你最初训练的glm模型是glm_model test_pred <- predict(glm_model, newdata = test, type = 'response') # 用测试集标签和预测值创建对象 pred_obj <- prediction(test_pred, test$Survived)
内容的提问来源于stack exchange,提问作者Gracetam

