การประเมินไดรเวอร์แต่ละตัวด้วยค่า AUC ถูกต้องหรือไม่

Aug 18 2020

ฉันได้พูดคุยกับหัวหน้างานของฉันเกี่ยวกับการใช้ AUC เพื่อพิจารณาโดยพื้นฐานแล้วความสำคัญของไดรเวอร์ที่แตกต่างกันสามตัวซึ่งประกอบด้วยตัวแปรหลายตัว เขาอ้างว่าฉันสามารถดูค่า AUC สำหรับโมเดลโดยรวมแล้วลองเรียกใช้โมเดลที่คล้ายกันโดยใช้ไดรเวอร์ทีละหนึ่งตัวเท่านั้นรับค่า AUC สำหรับไดรเวอร์แต่ละตัวจากนั้นประเมินความสำคัญของไดรเวอร์แต่ละตัว

Inherent driver: 2 variables
Static driver: 2 variables
Dynamic driver: 7 variables

ดังนั้นผลลัพธ์ AUC ของฉันจากโมเดล ElasticNet ไบนารีจะเป็นดังต่อไปนี้:

Overall AUC score (all drivers included): 0.89

จากนั้นฉันจะใช้แบบจำลอง ElasticNet เดียวกัน แต่มีเพียงสองตัวแปรที่เลือกในinherent driverตัวแปรตามและ และอื่น ๆ กับไดรเวอร์ถัดไปเป็นต้นค่า AUC มีดังต่อไปนี้:

Inherent driver:                          0.58
Static driver:                            0.67
Dynamic driver:                           0.88
  1. ผลลัพธ์บอกฉันว่าของฉันdynamic driverค่อนข้างสำคัญกว่าหรือดีกว่าในการแยกแยะ 0 จาก 1?
  2. นี่เป็นวิธีการทางสถิติหรือไม่? ถ้าไม่มีฉันจะประเมินได้อย่างไร?

แก้ไข:

       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

ตอนนี้ฉันทำซ้ำขั้นตอนการสร้างแบบจำลองสุทธิยืดหยุ่นทั้งหมด (ค้นหาการแลกเปลี่ยนสัน / เชือกที่เหมาะสมที่สุดและค่าโทษที่เหมาะสมที่สุด) ด้วยตัวแปรเพียงสองตัว โดยพื้นฐานแล้วฉันเปลี่ยนสิ่งต่อไปนี้:

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 ถามในความคิดเห็น

คำตอบ

2 EdM Aug 20 2020 at 00:47

เนื่องจากการลงโทษเป็นสิ่งสำคัญสำหรับการสร้างแบบจำลองของคุณคุณอยู่ในแนวทางที่ดี แต่คุณจำเป็นต้องรวมข้อมูลเกี่ยวกับข้อผิดพลาดที่อาจเกิดขึ้นในเมตริกคุณภาพของ AUC คุณไม่สามารถเปรียบเทียบ AUC ที่ 0.58 กับหนึ่งใน 0.67 ได้เว้นแต่คุณจะรู้ว่าค่าประมาณเหล่านั้นแปรผันอย่างไร

วิธีง่ายๆในการจัดการสิ่งนี้คือการทำซ้ำขั้นตอนด้วยการทดสอบ / แยกการทดสอบหลาย ๆ ครั้ง (พูดหลายร้อย) แทนที่จะเป็นแบบเดียวตามที่คุณทำอยู่ เดี่ยวแยกการทดสอบ / รถไฟสามารถไว้ใจไม่ได้กับชุดข้อมูลมีอะไรด้านล่างหลายพันกรณี (ในขณะที่คุณอาจต้องการน้อยกว่า 200 กรณีในชั้นเรียนของชนกลุ่มน้อยเพื่อให้พอดีกับแบบจำลองที่ไม่มีการคาดคะเนกับ 11 ตัวทำนายได้อย่างน่าเชื่อถือฉันถือว่าคุณไม่มีหลายพันเคสดังนั้นจึงควรทำการสุ่มตัวอย่างเพิ่มเติมในทุกกรณี) ความแปรปรวนระหว่างค่า AUC ที่ตั้งค่าการทดสอบ (หลายร้อย) เพื่อวัดว่าความแตกต่างระหว่างชุดย่อยตัวทำนายมีความน่าเชื่อถือทางสถิติหรือไม่

คุณอาจจะดีกว่าด้วยวิธีการที่คล้ายกันโดยใช้ bootstrapping แทนการแยกทดสอบ / รถไฟหลาย ๆ ก่อนอื่นคุณต้องใช้ข้อมูลทั้งหมดเพื่อให้พอดีกับแบบจำลองทั้งหมด ด้วยวิธีนี้คุณจะได้แบบจำลองเต็มรูปแบบที่ไม่เหมือนแนวทางของคุณคือใช้ข้อมูลที่มีอยู่ทั้งหมดในการสร้างและไม่ได้ขึ้นอยู่กับความหลากหลายของการแยกการทดสอบ / รถไฟโดยเฉพาะ

จากนั้นคุณทำซ้ำขั้นตอนการสร้างแบบจำลองทั้งหมด (รวมถึงการเลือกalphaและlambdaผ่านการตรวจสอบความถูกต้องข้ามภายใน) กับตัวอย่าง bootstrap สองสามร้อยชุดของชุดข้อมูลและใช้ชุดข้อมูลทั้งหมดเป็นชุดทดสอบในแต่ละกรณี ภายใต้หลักการ bootstrapที่คล้ายคลึงกับการสร้างแบบจำลองในหลาย ๆ ตัวอย่างจากประชากรทั้งหมดที่สนใจแล้วทดสอบกับประชากร ดังนั้นคุณจะได้รับการประมาณคุณภาพของกระบวนการสร้างแบบจำลองที่สมเหตุสมผล: การมองโลกในแง่ดี (การใส่มากเกินไป) ในค่าสัมประสิทธิ์และความเอนเอียงและความแปรปรวนในการประมาณการวัดคุณภาพของคุณ

ในแง่ของการสร้างแบบจำลองแม้ว่าคุณเลือกที่จะใช้ AUC เป็นมาตรการสุดท้ายของคุณคุณควรจะใช้อันซ์แทน AUC เป็นเกณฑ์สำหรับทางเลือกที่ตรวจสอบข้ามของและalpha lambdaAUC (หรือดัชนี C) ไม่ได้มีความละเอียดอ่อนมากนักสำหรับการแยกแยะระหว่างโมเดล นอกจากนี้ควรคิดให้ดีว่าlambda.1seเป็นทางเลือกที่ดีในกรณีนี้หรือไม่ ที่ช่วยในการรับแบบจำลองที่ไม่เหมาะสม แต่มีตัวทำนายเพียงไม่กี่ตัวที่จะเริ่มต้นด้วย (มีเพียง 2 ตัวในตัวอย่างที่สองของคุณ) คุณอาจจะดีกว่ามากด้วยlambda.minค่าที่ลดข้อผิดพลาดการตรวจสอบความถูกต้องข้าม (อีกครั้งทำได้ดีที่สุดด้วยการเบี่ยงเบนแม้ว่าขั้นสุดท้ายของคุณ ต้องทำการประเมินผลด้วย AUC)