การประเมินไดรเวอร์แต่ละตัวด้วยค่า AUC ถูกต้องหรือไม่
ฉันได้พูดคุยกับหัวหน้างานของฉันเกี่ยวกับการใช้ 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
- ผลลัพธ์บอกฉันว่าของฉัน
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
ตอนนี้ฉันทำซ้ำขั้นตอนการสร้างแบบจำลองสุทธิยืดหยุ่นทั้งหมด (ค้นหาการแลกเปลี่ยนสัน / เชือกที่เหมาะสมที่สุดและค่าโทษที่เหมาะสมที่สุด) ด้วยตัวแปรเพียงสองตัว โดยพื้นฐานแล้วฉันเปลี่ยนสิ่งต่อไปนี้:
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 คุณไม่สามารถเปรียบเทียบ AUC ที่ 0.58 กับหนึ่งใน 0.67 ได้เว้นแต่คุณจะรู้ว่าค่าประมาณเหล่านั้นแปรผันอย่างไร
วิธีง่ายๆในการจัดการสิ่งนี้คือการทำซ้ำขั้นตอนด้วยการทดสอบ / แยกการทดสอบหลาย ๆ ครั้ง (พูดหลายร้อย) แทนที่จะเป็นแบบเดียวตามที่คุณทำอยู่ เดี่ยวแยกการทดสอบ / รถไฟสามารถไว้ใจไม่ได้กับชุดข้อมูลมีอะไรด้านล่างหลายพันกรณี (ในขณะที่คุณอาจต้องการน้อยกว่า 200 กรณีในชั้นเรียนของชนกลุ่มน้อยเพื่อให้พอดีกับแบบจำลองที่ไม่มีการคาดคะเนกับ 11 ตัวทำนายได้อย่างน่าเชื่อถือฉันถือว่าคุณไม่มีหลายพันเคสดังนั้นจึงควรทำการสุ่มตัวอย่างเพิ่มเติมในทุกกรณี) ความแปรปรวนระหว่างค่า AUC ที่ตั้งค่าการทดสอบ (หลายร้อย) เพื่อวัดว่าความแตกต่างระหว่างชุดย่อยตัวทำนายมีความน่าเชื่อถือทางสถิติหรือไม่
คุณอาจจะดีกว่าด้วยวิธีการที่คล้ายกันโดยใช้ bootstrapping แทนการแยกทดสอบ / รถไฟหลาย ๆ ก่อนอื่นคุณต้องใช้ข้อมูลทั้งหมดเพื่อให้พอดีกับแบบจำลองทั้งหมด ด้วยวิธีนี้คุณจะได้แบบจำลองเต็มรูปแบบที่ไม่เหมือนแนวทางของคุณคือใช้ข้อมูลที่มีอยู่ทั้งหมดในการสร้างและไม่ได้ขึ้นอยู่กับความหลากหลายของการแยกการทดสอบ / รถไฟโดยเฉพาะ
จากนั้นคุณทำซ้ำขั้นตอนการสร้างแบบจำลองทั้งหมด (รวมถึงการเลือกalpha
และlambda
ผ่านการตรวจสอบความถูกต้องข้ามภายใน) กับตัวอย่าง bootstrap สองสามร้อยชุดของชุดข้อมูลและใช้ชุดข้อมูลทั้งหมดเป็นชุดทดสอบในแต่ละกรณี ภายใต้หลักการ bootstrapที่คล้ายคลึงกับการสร้างแบบจำลองในหลาย ๆ ตัวอย่างจากประชากรทั้งหมดที่สนใจแล้วทดสอบกับประชากร ดังนั้นคุณจะได้รับการประมาณคุณภาพของกระบวนการสร้างแบบจำลองที่สมเหตุสมผล: การมองโลกในแง่ดี (การใส่มากเกินไป) ในค่าสัมประสิทธิ์และความเอนเอียงและความแปรปรวนในการประมาณการวัดคุณภาพของคุณ
ในแง่ของการสร้างแบบจำลองแม้ว่าคุณเลือกที่จะใช้ AUC เป็นมาตรการสุดท้ายของคุณคุณควรจะใช้อันซ์แทน AUC เป็นเกณฑ์สำหรับทางเลือกที่ตรวจสอบข้ามของและalpha
lambda
AUC (หรือดัชนี C) ไม่ได้มีความละเอียดอ่อนมากนักสำหรับการแยกแยะระหว่างโมเดล นอกจากนี้ควรคิดให้ดีว่าlambda.1se
เป็นทางเลือกที่ดีในกรณีนี้หรือไม่ ที่ช่วยในการรับแบบจำลองที่ไม่เหมาะสม แต่มีตัวทำนายเพียงไม่กี่ตัวที่จะเริ่มต้นด้วย (มีเพียง 2 ตัวในตัวอย่างที่สองของคุณ) คุณอาจจะดีกว่ามากด้วยlambda.min
ค่าที่ลดข้อผิดพลาดการตรวจสอบความถูกต้องข้าม (อีกครั้งทำได้ดีที่สุดด้วยการเบี่ยงเบนแม้ว่าขั้นสุดท้ายของคุณ ต้องทำการประเมินผลด้วย AUC)