glmnet & caret: ROC, Sensitivity, 训练模型的特异性
glmnet & caret: ROC, Sensitivity, Specificity of training model
我想使用 GLMNET 来拟合二项逻辑回归模型。
我可以直接使用 caret 或 glmnet-package。让我们以数据(BinomialExample)为例来执行以下代码,其中我实现了两者:
#rm(list = ls(all.names = TRUE))
library(glmnet)
library(caret)
data(BinomialExample)
y[y==0] = "low"
y[y==1] = "high"
y <- as.factor(y)
#split data in training & validation set
set.seed(1)
splitSample <- createDataPartition(y, p = 0.8, list = FALSE)
training_expression <- x[splitSample,]
training_phenotype <- y[splitSample]
validation_expression <- x[-splitSample,]
validation_phenotype <- y[-splitSample]
#####################
##GLMNET with CARET##
#####################
eGrid <- expand.grid(.alpha=seq(0.1,0.9, by=0.1),.lambda=seq(0,1,by=0.01))
Control <- trainControl(verboseIter=TRUE, classProbs=TRUE, summaryFunction=twoClassSummary, method="cv")
set.seed(1)
netFit <- train(x = training_expression, y = training_phenotype,method = "glmnet", metric = "ROC", tuneGrid=eGrid,trControl = Control)
netFitPerf <- getTrainPerf(netFit)
trainROC <- netFitPerf[,1]
trainSens <- netFitPerf[,2]
trainSpec <- netFitPerf[,3]
trainAlpha <- netFit$bestTune[,1]
trainLambda <- netFit$bestTune[,2]
print(sprintf("ROC: %s Sens: %s Spec: %s Alpha: %s Lambda: %s", round(trainROC,2), round(trainSens,2), round(trainSpec,2), round(trainAlpha,2),round(trainLambda,2)))
predict_validation <- predict(netFit, newdata = validation_expression)
confusionMatrix(predict_validation,validation_phenotype)
######################
#GLMNET without CARET#
######################
set.seed(1)
elasticnet <- cv.glmnet(training_expression, training_phenotype, family = "binomial", type.measure = "class", nfolds=10, alpha=0.5, nlambda = 100)
plot(elasticnet)
predict_validation <- predict(elasticnet, newx = validation_expression, s = c(elasticnet$lambda.min), type = "class")
confusionMatrix(predict_validation,validation_phenotype)
如您所见,如果我使用插入符数据包,我可以轻松打印模型的 ROC、灵敏度和特异性。但是,如果我在没有 CARET 的情况下直接使用 glmnet,我无法找到类似的方法来打印 ROC、Sens、Spec——是否有类似的方法来获取这些指标?
感谢您的帮助!
您可以从 glmnet
工作流程生成的各种对象中获取所需的值。例如,如果您这样做
cm = confusionMatrix(predict_validation,validation_phenotype)
然后 cm$byClass
包括特异性和敏感性:
cm$byClass
Sensitivity Specificity Pos Pred Value Neg Pred Value Prevalence
0.8181818 1.0000000 1.0000000 0.8000000 0.5789474
Detection Rate Detection Prevalence Balanced Accuracy
0.4736842 0.4736842 0.9090909
同样,您可以从 elasticnet$lambda.min
获得 Lambda,从 gsub(".*alpha = ([0-9]\.[0-9]*).*","\1",deparse(elasticnet$glmnet.fit$call)[2])
获得 alpha
(尽管可能有比那段可怕的代码更好的方法)。实际上,由于 alpha
值是函数的输入,您甚至不需要提取它。但是,如果除了 lambda
之外还对 alpha
进行交叉验证,则需要使用循环来尝试多个 alpha
值,然后您需要一些方法来提取alpha
最佳模型的值。如果您决定在交叉验证中包含 alpha
,请务必阅读 cv.glmnet
的 Details
部分。
对于 ROC 曲线的 AUC,cv.glmnet
会给你那个,但你需要使用 type.measure="auc"
而不是 type.measure="class"
,这将改变最佳模型的方式是 selected。此外,对于这个特定的数据样本,您需要使用更少的 CV 折叠,但这可能不是您的真实数据的问题。例如:
elasticnet <- cv.glmnet(training_expression, training_phenotype, family = "binomial",
type.measure = "auc", nfolds=5, alpha=0.5, nlambda = 100)
然后,获取 AUC:
elasticnet$cvm[which(elasticnet$lambda==elasticnet$lambda.min)]
或
max(elasticnet$cvm)
如果您想在不使用 AUC 的情况下计算 AUC 到 select 最佳模型,您可能需要自己计算或为此使用预先存在的函数,例如 auc
来自pROC
包。
您可以直接使用 assess.glmnet 函数轻松查看 AUC 和 MSE 等其他指标。
我想使用 GLMNET 来拟合二项逻辑回归模型。 我可以直接使用 caret 或 glmnet-package。让我们以数据(BinomialExample)为例来执行以下代码,其中我实现了两者:
#rm(list = ls(all.names = TRUE))
library(glmnet)
library(caret)
data(BinomialExample)
y[y==0] = "low"
y[y==1] = "high"
y <- as.factor(y)
#split data in training & validation set
set.seed(1)
splitSample <- createDataPartition(y, p = 0.8, list = FALSE)
training_expression <- x[splitSample,]
training_phenotype <- y[splitSample]
validation_expression <- x[-splitSample,]
validation_phenotype <- y[-splitSample]
#####################
##GLMNET with CARET##
#####################
eGrid <- expand.grid(.alpha=seq(0.1,0.9, by=0.1),.lambda=seq(0,1,by=0.01))
Control <- trainControl(verboseIter=TRUE, classProbs=TRUE, summaryFunction=twoClassSummary, method="cv")
set.seed(1)
netFit <- train(x = training_expression, y = training_phenotype,method = "glmnet", metric = "ROC", tuneGrid=eGrid,trControl = Control)
netFitPerf <- getTrainPerf(netFit)
trainROC <- netFitPerf[,1]
trainSens <- netFitPerf[,2]
trainSpec <- netFitPerf[,3]
trainAlpha <- netFit$bestTune[,1]
trainLambda <- netFit$bestTune[,2]
print(sprintf("ROC: %s Sens: %s Spec: %s Alpha: %s Lambda: %s", round(trainROC,2), round(trainSens,2), round(trainSpec,2), round(trainAlpha,2),round(trainLambda,2)))
predict_validation <- predict(netFit, newdata = validation_expression)
confusionMatrix(predict_validation,validation_phenotype)
######################
#GLMNET without CARET#
######################
set.seed(1)
elasticnet <- cv.glmnet(training_expression, training_phenotype, family = "binomial", type.measure = "class", nfolds=10, alpha=0.5, nlambda = 100)
plot(elasticnet)
predict_validation <- predict(elasticnet, newx = validation_expression, s = c(elasticnet$lambda.min), type = "class")
confusionMatrix(predict_validation,validation_phenotype)
如您所见,如果我使用插入符数据包,我可以轻松打印模型的 ROC、灵敏度和特异性。但是,如果我在没有 CARET 的情况下直接使用 glmnet,我无法找到类似的方法来打印 ROC、Sens、Spec——是否有类似的方法来获取这些指标?
感谢您的帮助!
您可以从 glmnet
工作流程生成的各种对象中获取所需的值。例如,如果您这样做
cm = confusionMatrix(predict_validation,validation_phenotype)
然后 cm$byClass
包括特异性和敏感性:
cm$byClass
Sensitivity Specificity Pos Pred Value Neg Pred Value Prevalence
0.8181818 1.0000000 1.0000000 0.8000000 0.5789474
Detection Rate Detection Prevalence Balanced Accuracy
0.4736842 0.4736842 0.9090909
同样,您可以从 elasticnet$lambda.min
获得 Lambda,从 gsub(".*alpha = ([0-9]\.[0-9]*).*","\1",deparse(elasticnet$glmnet.fit$call)[2])
获得 alpha
(尽管可能有比那段可怕的代码更好的方法)。实际上,由于 alpha
值是函数的输入,您甚至不需要提取它。但是,如果除了 lambda
之外还对 alpha
进行交叉验证,则需要使用循环来尝试多个 alpha
值,然后您需要一些方法来提取alpha
最佳模型的值。如果您决定在交叉验证中包含 alpha
,请务必阅读 cv.glmnet
的 Details
部分。
对于 ROC 曲线的 AUC,cv.glmnet
会给你那个,但你需要使用 type.measure="auc"
而不是 type.measure="class"
,这将改变最佳模型的方式是 selected。此外,对于这个特定的数据样本,您需要使用更少的 CV 折叠,但这可能不是您的真实数据的问题。例如:
elasticnet <- cv.glmnet(training_expression, training_phenotype, family = "binomial",
type.measure = "auc", nfolds=5, alpha=0.5, nlambda = 100)
然后,获取 AUC:
elasticnet$cvm[which(elasticnet$lambda==elasticnet$lambda.min)]
或
max(elasticnet$cvm)
如果您想在不使用 AUC 的情况下计算 AUC 到 select 最佳模型,您可能需要自己计算或为此使用预先存在的函数,例如 auc
来自pROC
包。
您可以直接使用 assess.glmnet 函数轻松查看 AUC 和 MSE 等其他指标。