AUC値で個々のドライバーを評価するのは正しいですか?
基本的に、それぞれ複数の変数で構成される3つの異なるドライバーの重要性を判断するために、AUCの使用法について上司と話し合っています。彼は、モデル全体のAUC値を調べて、一度に1つのドライバーのみを使用して同様のモデルを実行し、各ドライバーのAUC値を取得して、各ドライバーの重要性を評価できると主張しています。
Inherent driver: 2 variables
Static driver: 2 variables
Dynamic driver: 7 variables
したがって、バイナリElasticNetモデルからのAUC出力は次のようになります。
Overall AUC score (all drivers included): 0.89
次に、同じElasticNetモデルを実行しますが、inherent driver
と従属変数で2つの変数を選択した場合のみです。次のドライバなどについても同様です。AUC値は次のとおりです。
Inherent driver: 0.58
Static driver: 0.67
Dynamic driver: 0.88
- 結果は、私
dynamic driver
が比較的重要である、または0と1を区別するのに優れていることを教えてくれますか? - これは統計的にも適切な方法ですか?そうでない場合、他にどのように評価できますか?
編集:
V1 dependent V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 -1.3 0 494. 34.1 2.23 43.0 4.58 46.7 283. 0.442 34.5 0
2 -4.2 0 231. 16.9 1.01 69.4 0 66.4 277. 0.959 11.1 0
3 -11.7 0 646. 132. 20.5 88.0 0.063 34.0 291. 5.63 21 0
4 -9.3 0 44.0 16.4 0.397 39.1 2.37 77.6 279. 7.24 31.8 0
5 -14.2 0 88.2 128. 40.6 83.4 1.09 47.2 284. 8.23 2.92 0
6 19.4 0 382. 49.4 1.15 54.4 0.914 53.6 279. 3.03 16.8 1
df <- df %>% select(V1, dependent, V2, V3, V4, V5, V6, V7, V8, V9, V11, V12)
training.samples <- df$dependent %>% createDataPartition(p = 0.8, list = FALSE) train <- df[training.samples, ] test <- df[-training.samples, ] x.train <- data.frame(train[, names(train) != "dependent"]) x.train <- data.matrix(x.train) y.train <- train$dependent
x.test <- data.frame(test[, names(test) != "dependent"])
x.test <- data.matrix(x.test)
y.test <- test$dependent list.of.fits.overall.model <- list() for (i in 0:10){ fit.name <- paste0("alpha", i/10) list.of.fits.overall.model[[fit.name]] <- cv.glmnet(x.train, y.train, type.measure = c("auc"), alpha = i/10, family = "binomial", nfolds = 10, foldid = foldid, parallel = TRUE) } predicted <- predict(list.of.fits.overall.model[[fit.name]], s = list.of.fits.overall.model[[fit.name]]$lambda.1se, newx = x.test, type = "response")
#PLOT AUC
pred <- prediction(predicted, y.test)
perf <- performance(pred, "tpr", "fpr")
plot(perf)
abline(a = 0, b = 1, lty = 2, col = "red")
auc_ROCR <- performance(pred, measure = "auc")
auc_ROCR <- [email protected][[1]]
auc_ROCR
ここで、2つの変数だけを使用して、エラスティックネットモデリング手順全体(最適なリッジ/ラッソのトレードオフと最適なペナルティ値を検索)を繰り返します。基本的に、私は以下を変更します:
df.inherent <- df %>% select(V1, dependent, V2)
training.samples <- df.inherent$dependent %>% createDataPartition(p = 0.8, list = FALSE) train <- df.inherent[training.samples, ] test <- df.inherent[-training.samples, ] x.train <- data.frame(train[, names(train) != "dependent"]) x.train <- data.matrix(x.train) y.train <- train$dependent
x.test <- data.frame(test[, names(test) != "dependent"])
x.test <- data.matrix(x.test)
y.test <- test$dependent list.of.fits.inherent <- list() for (i in 0:10){ fit.name <- paste0("alpha", i/10) list.of.fits.inherent[[fit.name]] <- cv.glmnet(x.train, y.train, type.measure = c("auc"), alpha = i/10, family = "binomial", nfolds = 10, foldid = foldid, parallel = TRUE) } predicted <- predict(list.of.fits.inherent[[fit.name]], s = list.of.fits.inherent[[fit.name]]$lambda.1se, newx = x.test, type = "response")
結局、@ EDMがコメントで最後に質問したこと。
回答
ペナルティがモデリングにとって重要であることを考えると、あなたは潜在的に良い軌道に乗っていますが、AUCの品質メトリックに潜在的なエラーに関する情報を組み込む必要があります。これらの推定値がどの程度変動するかを知らない限り、0.58のAUCを0.67のAUCと比較することはできません。
これを処理する簡単な方法は、現在実行している単一の分割ではなく、複数(たとえば数百)のテスト/トレイン分割でプロセスを繰り返すことです。単一のテスト/トレイン分割は、数千ケース未満のデータセットでは信頼できない可能性があります。(11個の予測子を持つペナルティのないモデルを確実に適合させるには、マイノリティクラスで200未満のケースが必要になる可能性があるため、数千のケースがないため、いずれにしてもより多くのリサンプリングを行う必要があると思います。)次に、予測子サブセット間の差異が統計的に信頼できるかどうかを判断するための(数百の)テストセットAUC値間の変動。
複数のテスト/トレイン分割の代わりに、ブートストラップに基づく同様のアプローチを使用した方がよい場合があります。最初にすべてのデータを使用して、完全なモデルに適合させます。このようにして、アプローチとは異なり、利用可能なすべてのデータを使用して構築し、特定のテスト/トレイン分割の変動に依存しない完全なモデルを取得します。
次に、データセットの数百のブートストラップサンプルでモデリングプロセス全体(内部相互検証の選択alpha
とlambda
経由を含む)を繰り返し、それぞれの場合にデータセット全体をテストセットとして使用します。対象の母集団全体からの複数のサンプルでモデルを構築し、それらを母集団でテストすることに類似したブートストラップ原理の下で。したがって、モデリングプロセスの品質の合理的な推定値が得られます。つまり、係数値の楽観性(過剰適合)、および品質測定値の推定値のバイアスと変動性です。
モデリングに関しては、最終的な尺度としてAUCを使用することを選択した場合でも、との交差検定の選択の基準として、AUCではなく逸脱度を使用する必要がalpha
ありlambda
ます。AUC(またはC-index)は、モデルを区別するのにそれほど敏感ではありません。また、lambda.1se
この場合にが適切かどうかを慎重に検討してください。これは、倹約的なモデルを取得するのに役立ちますが、開始する予測子が非常に少ないため(2番目の例では2つのみ)、lambda.min
交差検定エラーを最小化する値を使用する方がはるかに良い場合があります(ここでも、最終的な場合でも逸脱して行うのが最適です)評価はAUCで行う必要があります)。