您好我已经使用ROCR包来检查模型的性能,我想做更多的评估,比如具有kappa值或k fold的混淆矩阵。 以下是模型和预测,任何帮助都会很棒。
model <- cv.glmnet(sparesemx[train.set,],
first.round[train.set],
alpha = 0.05,
family = 'binomial')
training$sparse.fr.hat <- predict(model, newx = sparesemx, type =
'response')[,1]
predictions <- prediction(training$sparse.fr.hat[test.set],
first.round[test.set])
perform <- performance(predictions, 'tpr', 'fpr')
plot(perform)
performance(predictions, 'auc')
我正在尝试使用带有confusionMatrix()函数的插入库,但我无法生成矩阵。我已经尝试了两个agruments的几个输入,但我不确定需要什么
答案 0 :(得分:0)
工作示例,一步一步明确细节。
library(OptimalCutpoints)
library(caret)
library(glmnet)
library(e1071)
data(elas) #predicting for variable "status"
将elas
数据拆分为训练(dev)和测试(val)
sample.ind <- sample(2,
nrow(elas),
replace = T,
prob = c(0.6,0.4))
elas.dev <- elas[sample.ind==1,]
elas.val <- elas[sample.ind==2,]
此示例使用逻辑模型,因此这是指定公式的方式,类似于sparesemx
矩阵。
formula.glm<-glm(status ~ gender + elas, data = elas, family = binomial)
xfactors<-model.matrix(formula.glm)[,-1]
glmnet.x<-as.matrix(xfactors)
glmmod<-glmnet(x=glmnet.x[sample.ind==1,],y=elas.dev$status,alpha=1,
family='binomial')
#if you care; the lasso model includes both predictors
#cv.glmmod <- cv.glmnet(x=glmnet.x[sample.ind==1,], y=elas.dev$status, alpha=1, family='binomial')
#plot(cv.glmmod)
#cv.glmmod$lambda.min
#coef(cv.glmmod, s="lambda.min")
现在你必须使用来自glmnet的两个选定的预测变量获得状态变量的预测值。
bestglm<-glm(status ~ gender + elas, data = elas.dev, family = binomial)
你到目前为止。我正在使用我的对象中的fitted.values
而你正在使用prediction
,但你应该得到一列实际值和拟合值。这并不能告诉你切割点在哪里。你在哪里画出“积极”和“消极”之间的界线?
我建议您使用OptimalCutpoints
。
为optimal.cutpoints
设置此项;接下来的容器就是data.frame
,其中两个变量的长度相同。它包含来自glm的实际与预测。
container.for.OC<-data.frame(fit=bestglm$fitted.values, truth=elas.dev$status)
我在这里使用Youden标准,但标准有很多选择。
optimal.cutpoint.Youden<-optimal.cutpoints(X = fit ~ truth , tag.healthy = 0,
methods = "Youden", pop.prev = NULL, data=container.for.OC,
control = control.cutpoints(), ci.fit = FALSE, conf.level = 0.95, trace = FALSE)
summary(optimal.cutpoint.Youden)
这是我得到的:
Area under the ROC curve (AUC): 0.818 (0.731, 0.905)
CRITERION: Youden
Number of optimal cutoffs: 1
Estimate
cutoff 0.4863188
Se 0.9180328
Sp 0.5882353
PPV 0.8000000
NPV 0.8000000
DLR.Positive 2.2295082
DLR.Negative 0.1393443
FP 14.0000000
FN 5.0000000
Optimal criterion 0.5062681
#not run
#plot(optimal.cutpoint.Youden)
现在将您从Youden cutoff中学到的内容应用到验证集elas.val
。
这应与上表中的截止值相匹配。
MaxYoudenCutoff <- optimal.cutpoint.Youden$Youden$Global$optimal.cutoff$cutoff
这将为您提供Youden切割点的预测水平。它们必须是confusionMatrix
函数的因子对象。
val.predicted<-predict(object=bestglm, newdata=elas.val, type="response")
val.factor.level<-factor(ifelse(val.predicted >=MaxYoudenCutoff,"1","0"))
像之前一样,为confusionMatrix
函数创建一个小容器。
container.for.CM <- data.frame(truth=factor(elas.val$status), fit=val.factor.level)
confusionMatrix(data=container.for.CM$fit, reference=container.for.CM$truth)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 7 8
1 6 37
Accuracy : 0.7586
95% CI : (0.6283, 0.8613)
No Information Rate : 0.7759
P-Value [Acc > NIR] : 0.6895
Kappa : 0.342
Mcnemar's Test P-Value : 0.7893
Sensitivity : 0.5385
Specificity : 0.8222
Pos Pred Value : 0.4667
Neg Pred Value : 0.8605
Prevalence : 0.2241
Detection Rate : 0.1207
Detection Prevalence : 0.2586
Balanced Accuracy : 0.6803
'Positive' Class : 0