我正在尝试构建一个循环来绘制10个ROC并使用R库ROCR
存储10个模型的AUC分数。我创建的循环生成错误:
预测错误(as.numeric(var_name [i]),s_test $ clickthrough): 每次运行中的预测数量必须等于标签数量 每次运行。
当我尝试单独运行预测时,不等于预测的标签数量没有任何问题。任何人都可以帮我修复for循环引起的错误吗?
个人预测(这很好):
lr.pred<- prediction(as.numeric(lda_predp),
s_test$clickthrough)
AUC1 <- performance(lr.pred,"auc")@y.values[[1]]
lr.ROC1 <- performance(lr.pred,"tpr","fpr")
plot(lr.ROC1, main= "LDA")
循环中出现问题:
par(mfrow=c(2,5))
var_name = c("nb_predp","lda_predp","qda_predp","lg_prob","lda_forwardp","lda_lassop",
"lda_pred_int_p","lda_pred_t_p","lda_pred_v_p","lda_pred_c_p")
for (i in 1:length(var_name)){
lr.pred[i] <- prediction(as.numeric(var_name[i]),
s_test$clickthrough)
AUC[i] <- performance(lr.pred[i],"auc")@y.values[[1]]
lr.ROC[i] <- performance(lr.pred[i],"tpr","fpr")
plot(lr.ROC[i], main= var_name[i])
}
我检查了lr.pred的格式,结果发现它不是一个向量,而是一个由ROCR包创建的预测类。我认为这可能是问题,但有没有人知道如何从ROCR包中提取数据以适应图形?
修 lr.pred将是一个“预测”对象,而lr.ROC将是一个具有特定类的“性能”对象。
lr.pred = list()
var_name =
c("nb_predp","lda_predp","qda_predp","lg_prob","lda_forwardp","lda_lassop",
"lda_pred_int_p","lda_pred_t_p","lda_pred_v_p","lda_pred_c_p")
for (i in 1:length(var_name)){
lr.pred[[i]] <- prediction(var_name[i], s_test$clickthrough)
AUC[i] <- performance(lr.pred[i],"auc")@y.values[[1]]
lr.ROC[i] <- performance(lr.pred[i],"tpr","fpr")
plot(lr.ROC[i], main= var_name[i])
}
答案 0 :(得分:1)
您在prediction()
调用中传递字符串而不是命名对象。
在您的个人非循环播放中,您致电:prediction(as.numeric(lda_predp)...)
在循环中,它类似于传递带引号的字符串:
prediction(as.numeric("lda_predp")...)
要解决此问题,请将 var_name 分配给命名对象(即无字符串)并按原样运行for
循环:
var_name = c(nb_pred1, lda_pred1, qda_pred1, lg_prob, lda_pred_1_p, lda_pred_2_p,
lda_pred_int_p, lda_pred_t_p, lda_pred_v_p, lda_pred_c_p)
或者使用get()
内部循环来按字符串引用环境对象:
var_name = c("nb_pred1", "lda_pred1", "qda_pred1", "lg_prob", "lda_pred_1_p", "lda_pred_2_p",
"lda_pred_int_p", "lda_pred_t_p", "lda_pred_v_p", "lda_pred_c_p")
lr.pred <- vector(); AUC <- vector(); lr.ROC <- vector()
for (i in 1:length(var_name)){
lr.pred[i] <- prediction(as.numeric(get(varname[i]), s_test$clickthrough)
...
}
但很可能,您希望运行后者,因为您将 main 分配给字符串:main=var_name[i]
。