3

GLMNET を使用して、二項ロジスティック回帰モデルを適合させたいと考えています。キャレットまたは 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 を出力する同様の方法を見つけることができませんでした。これらのメトリックを取得する同様の方法はありますか?

ご協力いただきありがとうございます!

4

2 に答える 2

4

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 

同様に、Lambdaelasticnet$lambda.minalphaの間で取得することもできますgsub(".*alpha = ([0-9]\\.[0-9]*).*","\\1",deparse(elasticnet$glmnet.fit$call)[2])(ただし、その巨大なコード片よりも優れた方法があるかもしれません)。実際には、alpha値は関数への入力であるため、抽出する必要さえありません。alphaただし、さらにクロス検証をlambda行う場合は、ループを使用して複数の値を試す必要があり、最適なモデルalphaの値を抽出する方法が必要になります。交差検証にalpha含めることにした場合は、必ず のセクションを読んでください。alphaDetailscv.glmnet

ROC 曲線の AUC については、cv.glmnetそれが得られますが、type.measure="auc"代わりにを使用する必要がありますtype.measure="class"。これにより、最適なモデルの選択方法が変わります。また、この特定のデータ サンプルでは、​​より少ない 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)

aucAUC を使用せずに AUC を計算して最適なモデルを選択する場合は、自分で計算するか、pROCパッケージなどの既存の関数を使用する必要があります。

于 2016-02-18T17:13:40.063 に答える