क्या एयूसी मूल्य वाले व्यक्तिगत ड्राइवरों का मूल्यांकन करना सही है?

Aug 18 2020

मेरे पास पर्यवेक्षक के साथ एयूसी के उपयोग के बारे में एक चर्चा है, मूल रूप से, तीन अलग-अलग ड्राइवरों के महत्व में प्रत्येक में कई चर शामिल हैं। उनका दावा है कि मैं समग्र मॉडल के लिए एयूसी मूल्य में देख सकता हूं और फिर एक समय में केवल एक ड्राइवर का उपयोग करके एक समान मॉडल चलाने का प्रयास कर सकता हूं, प्रत्येक ड्राइवर के लिए एयूसी मूल्य प्राप्त कर सकता हूं और तब तक प्रत्येक चालक के महत्व का आकलन कर सकता हूं।

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

तो एक बाइनरी ElasticNet मॉडल से मेरा AUC आउटपुट निम्न होगा:

Overall AUC score (all drivers included): 0.89

तब मैं एक ही इलास्टिकनेट मॉडल का प्रदर्शन करता हूं, लेकिन केवल मेरे दो चर चयनित होते हैं inherent driverऔर आश्रित चर। और इतने पर अगले ड्राइवर आदि के साथ। AUC मान निम्नानुसार हैं:

Inherent driver:                          0.58
Static driver:                            0.67
Dynamic driver:                           0.88
  1. क्या परिणाम तब मुझे बताता है कि मेरे dynamic driverअपेक्षाकृत अधिक महत्वपूर्ण हैं, या केवल 1 से 0 को अलग करना बेहतर है?
  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 की गुणवत्ता मीट्रिक में संभावित त्रुटि के बारे में जानकारी शामिल करने की आवश्यकता है। आप 0.67 के AUC की तुलना 0.67 में से एक के साथ नहीं कर सकते हैं जब तक कि आपको पता न हो कि उन अनुमानों को कितना परिवर्तनशील किया जा सकता है।

इसे संभालने का एक सरल तरीका यह होगा कि प्रक्रिया को एक एकल के बजाय कई (जैसे कई सौ) परीक्षण / ट्रेन विभाजन के साथ प्रक्रिया दोहराई जाए जैसा कि वे वर्तमान में करते हैं। एकल परीक्षण / ट्रेन विभाजन कई हजार मामलों से नीचे कुछ भी होने वाले डेटा सेट के साथ अविश्वसनीय हो सकता है । (जैसा कि आपको शायद अल्पसंख्यक वर्ग में 200 से कम मामलों की आवश्यकता होगी, एक गैर-सूचीबद्ध मॉडल को 11 भविष्यवाणियों के साथ विश्वसनीय रूप से फिट करने के लिए, मेरा मानना ​​है कि आपके पास कई हज़ार मामले नहीं हैं और इस तरह किसी भी घटना में अधिक पुनरावर्तन होना चाहिए।) (कई सौ) परीक्षण-सेट AUC मानों के बीच परिवर्तनशीलता यह निर्धारित करने के लिए कि भविष्यवक्ता उपसमुच्चय के बीच कोई अंतर सांख्यिकीय विश्वसनीय है या नहीं।

आप कई परीक्षण / ट्रेन विभाजन के बजाय बूटस्ट्रैपिंग के आधार पर एक समान दृष्टिकोण के साथ बेहतर हो सकते हैं। आप एक पूर्ण मॉडल को फिट करने के लिए सबसे पहले सभी डेटा का उपयोग करते हैं। इस तरह से आपको एक पूर्ण मॉडल मिलता है, जो आपके दृष्टिकोण के विपरीत, उपलब्ध डेटा के सभी का उपयोग करता है और किसी विशेष परीक्षण / ट्रेन विभाजन की योनि पर निर्भर नहीं करता है।

इसके बाद आप पूरे मॉडलिंग की प्रक्रिया (के चुनाव सहित दोहराने alphaऔर lambdaडेटा सेट के कुछ सौ बूटस्ट्रैप नमूनों पर आंतरिक पार सत्यापन के माध्यम से), और पूरे डेटा प्रत्येक मामले में परीक्षण सेट के रूप में सेट का उपयोग करें। बूटस्ट्रैप सिद्धांत के तहत, जो ब्याज की पूरी आबादी से कई नमूनों पर मॉडल बनाने और फिर उन्हें आबादी पर परीक्षण करने के लिए अनुरूप है। इस प्रकार आपको मॉडलिंग प्रक्रिया की गुणवत्ता का एक उचित अनुमान मिलता है: गुणांक मूल्यों में आशावाद (ओवरफिटिंग), और आपके गुणवत्ता माप के अनुमानों में पूर्वाग्रह और परिवर्तनशीलता।

मॉडलिंग, भले ही आप अपने अंतिम उपाय के रूप में एयूसी उपयोग करने का चुनाव के संदर्भ में, आप के पार सत्यापन चुनाव के लिए मापदंड के रूप में एयूसी के बजाय विचलन का उपयोग कर किया जाना चाहिए alphaऔर lambda। मॉडल के बीच अंतर करने के लिए AUC (या C-index) बहुत संवेदनशील नहीं है । इसके अलावा, ध्यान से सोचें कि क्या lambda.1seइस उदाहरण में एक अच्छा विकल्प है। यह एक आदर्श मॉडल प्राप्त करने में मदद करता है, लेकिन इतने कम भविष्यवक्ताओं के साथ शुरू करने के लिए (आपके दूसरे उदाहरण में केवल 2) आप उस lambda.minमूल्य के साथ बहुत बेहतर हो सकते हैं जो क्रॉस-वैधीकरण त्रुटि को कम करता है (फिर से, भले ही अंतिम रूप से विचलन के साथ किया गया हो मूल्यांकन AUC के साथ किए जाने की आवश्यकता है)।