मॉडल चयन और क्रॉस-सत्यापन: सही तरीका


34

मॉडल चयन और क्रॉस सत्यापन के विषय पर CrossValidated कई धागे हैं। यहाँ कुछ है:

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

चीजों को यथासंभव ठोस बनाने के लिए, उदाहरण के लिए कहें कि हम एक आरवीएफ कर्नेल के साथ एक SVM के साथ काम कर रहे हैं: , और है कि मैं सुविधाओंएक्सऔर लेबलy केएक डाटासेट है, और है कि मैं चाहता हूँK(x,x)=(γ|xx|)2

  1. मेरे मॉडल ( C और C) के सर्वोत्तम संभव मान ज्ञात γC )
  2. SVM को मेरे डेटासेट के साथ प्रशिक्षित करें (अंतिम तैनाती के लिए)
  3. इस त्रुटि के आसपास सामान्यीकरण त्रुटि और अनिश्चितता (विचरण) का अनुमान लगाएं

ऐसा करने के लिए, मैं व्यक्तिगत रूप से, एक ग्रिड खोज करते हैं जैसे मैं के हर संभव संयोजन की कोशिश करेगा और γ । सादगी के लिए, हम निम्नलिखित सीमाओं को मान सकते हैं:Cγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

अधिक विशेष रूप से, मेरे पूर्ण डेटासेट का उपयोग मैं निम्नलिखित करता हूं:

  1. हर ( , γ ) जोड़ी के लिए, मैं अपने डेटासेट पर K -fold क्रॉस सत्यापन (जैसे K = 10 ) के पुनरावृत्तियों (जैसे 100 यादृच्छिक दोहराव) को दोहराता हूं, अर्थात मैं K - 1 फोल्ड पर अपने SVM ​​को प्रशिक्षित करता हूं और त्रुटि का मूल्यांकन करता हूं। सभी K सिलवटों के माध्यम से पुनरावृति गुना बाईं ओर । कुल मिलाकर, मैं 100 x 10 = 1000 परीक्षण त्रुटियों को इकट्ठा करता हूं।CγKK=10K1K
  2. ऐसे प्रत्येक (के लिए , γ ) जोड़ी, मेरा मतलब है और उन 1000 परीक्षण त्रुटियों के विचरण की गणना μ एम , σ एमCγμM,σM

अब मैं सर्वश्रेष्ठ मॉडल (सर्वोत्तम कर्नेल पैरामीटर) चुनना चाहता हूं जिसका उपयोग मैं अपने अंतिम SVM को संपूर्ण डेटासेट पर प्रशिक्षित करने के लिए करूंगा। मेरी समझ है कि मॉडल था कि चुनने है सबसे कम त्रुटि मतलब और विचरण और σ एम सही विकल्प हो सकता है, और इस मॉडल की है कि μ एम हैं σ एमμMσMμMσM मॉडल के सामान्यीकरण त्रुटि पूर्वाग्रह और विचरण के मेरे सबसे अच्छे अनुमान जब साथ प्रशिक्षण कर रहे हैं पूर्ण डेटासेट।

लेकिन, ऊपर दिए गए थ्रेड्स में उत्तर पढ़ने के बाद, मुझे यह आभास हो रहा है कि तैनाती और / या अपनी त्रुटि (सामान्यीकरण प्रदर्शन) का अनुमान लगाने के लिए सर्वश्रेष्ठ SVM चुनने की यह विधि त्रुटिपूर्ण है, और यह चुनने के बेहतर तरीके हैं सर्वश्रेष्ठ SVM और इसकी त्रुटि की रिपोर्ट करना। यदि ऐसा है, तो वो क्या हैं? कृपया मुझे एक ठोस जवाब की तलाश है।

इस समस्या से चिपके हुए, मैं विशेष रूप से सबसे अच्छा मॉडल कैसे चुन सकता हूं और इसकी सामान्यीकरण त्रुटि का ठीक से अनुमान लगा सकता हूं ?


चीजों को यथासंभव ठोस बनाने के लिए, कृपया हमें बताएं: आपके डेटा सेट में कितने सांख्यिकीय रूप से स्वतंत्र मामले हैं? अनुकूलन के लिए आपके द्वारा मूल्यांकन किया जाने वाला लक्ष्य समारोह क्या है / आप किस प्रकार के त्रुटि माप का उपयोग करते हैं? क्या आप वास्तव में अपने पैरामीटर ग्रिड पर चुने गए त्रुटि माप के अनुरूप व्यवहार का निरीक्षण करते हैं? यदि आप वर्गीकरण के बारे में बात कर रहे हैं और आपका त्रुटि माप यह अनुमति देता है: परिमित नमूना आकार के कारण आपके द्वारा अपेक्षित विचरण की तुलना में पुनरावृत्त क्रॉस सत्यापन परिणाम कैसे प्राप्त करते हैं?
केबिले मोनिका जूल 25'13 को

एक लेख जो आपको दिलचस्प लग सकता है: इष्टतमप्रकारक.com
pdf

2
बहुत स्पष्ट और विस्तृत प्रश्न के लिए +1, साथ ही बड़े पैमाने पर डेटा विज्ञान समुदाय के लिए बहुत प्रासंगिक प्रश्न।
निकरुनागेल

जवाबों:


20

जेएमएलआर में मेरा पेपर इस सटीक प्रश्न को संबोधित करता है, और यह दर्शाता है कि प्रश्न में सुझाई गई प्रक्रिया (या कम से कम बहुत पसंद करने वाली) का परिणाम आशावादी पक्षपाती प्रदर्शन अनुमानों में है:

गैविन सी। कावले, निकोला एलसी टैलबोट, "ऑन-फिटिंग ऑन माडल सिलेक्शन और उसके बाद के परफॉरमेंस इवैल्यूएशन में सिलेक्शन बायस", जर्नल ऑफ मशीन लर्निंग रिसर्च, 11 (जूल): 2079−2107, 2010 ( www )

याद करने के लिए महत्वपूर्ण बात यह है कि क्रॉस-सत्यापन मॉडल के बजाय मॉडल बनाने की एक विधि के लिए सामान्यीकरण प्रदर्शन का अनुमान लगाने के लिए एक तकनीक है। इसलिए यदि कर्नेल पैरामीटर चुनना मॉडल के निर्माण की प्रक्रिया का हिस्सा है, तो आपको मॉडल चयन प्रक्रिया को भी पार करने की आवश्यकता है, अन्यथा आप एक आशावादी पक्षपाती प्रदर्शन अनुमान के साथ समाप्त हो जाएंगे (जैसा कि आप प्रस्तावित प्रक्रिया के साथ होगा)।

मान लें कि आपके पास एक फ़ंक्शन fit_model है, जो कि डेटासेट X और वांछित प्रतिक्रियाओं Y से मिलकर एक डेटासेट में ले जाता है, और जो उस डेटासेट के लिए फिट किए गए मॉडल को वापस करता है, जिसमें हाइपर-मापदंडों की ट्यूनिंग भी शामिल है (इस मामले में कर्नेल और नियमितीकरण पैरामीटर)। हाइपर-मापदंडों की यह ट्यूनिंग कई तरीकों से की जा सकती है, उदाहरण के लिए एक्स और टी पर क्रॉस-सत्यापन त्रुटि को कम करना।

चरण 1 - फ़ंक्शन फिट_मॉडल का उपयोग करके सभी उपलब्ध डेटा के लिए मॉडल को फिट करें। यह आपको मॉडल देता है जिसे आप ऑपरेशन में उपयोग करेंगे।

चरण 2 - प्रदर्शन मूल्यांकन। सभी उपलब्ध डेटा का उपयोग करके दोहराया क्रॉस-सत्यापन करें। प्रत्येक तह में, डेटा को एक प्रशिक्षण सेट और एक परीक्षण सेट में विभाजित किया जाता है। प्रशिक्षण सेट का उपयोग करके मॉडल को फिट करें (फिट मॉडल के लिए हाइपर-पैरामीटर मान रिकॉर्ड करें) और परीक्षण सेट पर प्रदर्शन का मूल्यांकन करें। प्रदर्शन अनुमान के रूप में सभी परीक्षण सेटों पर माध्य का उपयोग करें (और शायद मानों के प्रसार को भी देखें)।

चरण 3 - हाइपर-पैरामीटर सेटिंग्स की भिन्नता - चरण 3 में एकत्र किए गए हाइपर-पैरामीटर मानों का विश्लेषण करें। हालांकि मुझे यह बताना चाहिए कि हाइपर-मापदंडों के बारे में कुछ खास नहीं है, वे मॉडल के केवल पैरामीटर हैं जिनका अनुमान लगाया गया है (अप्रत्यक्ष रूप से ) डेटा से। कम्प्यूटेशनल / गणितीय सुविधा के लिए मापदंडों के बजाय उन्हें हाइपर-मापदंडों के रूप में माना जाता है, लेकिन ऐसा होना जरूरी नहीं है।

यहाँ क्रॉस-मान्यता का उपयोग करने के साथ समस्या यह है कि प्रशिक्षण और परीक्षण डेटा स्वतंत्र नमूने नहीं हैं (जैसा कि वे डेटा साझा करते हैं) जिसका अर्थ है कि प्रदर्शन के अनुमान के विचलन का अनुमान और हाइपर-मापदंडों के बायस्ड होने की संभावना है (अर्थात इसकी तुलना में छोटा प्रत्येक तह में डेटा के स्वतंत्र रूप से स्वतंत्र नमूनों के लिए होगा)। बार-बार क्रॉस-वेलिडेशन के बजाय, मैं शायद बूटस्ट्रैपिंग का उपयोग करूंगा और परिणामस्वरूप मॉडल को बैग कर दूंगा यदि यह कम्प्यूटेशनल रूप से संभव था।

मुख्य बिंदु यह है कि एक निष्पक्ष प्रदर्शन अनुमान प्राप्त करने के लिए, आप अंतिम मॉडल (fit_model) को उत्पन्न करने के लिए जो भी प्रक्रिया का उपयोग करते हैं, उसे क्रॉस-सत्यापन प्रक्रिया के प्रत्येक तह में स्वतंत्र रूप से पूरी तरह से दोहराया जाना चाहिए।


यह एक बेहतरीन जवाब है। जब आप कहते हैं rather than repeated cross-validation you would go for bootstrapping- वास्तव में क्या अंतर है? दोनों में डेटा को विभाजित करने के कई repetitions शामिल trainऔर testऔर उसके बाद में प्रशिक्षण trainऔर में मूल्यांकन कर testवे, है ना?
जोश

4
बूटस्ट्रैपिंग (प्रतिस्थापन के साथ नमूनाकरण) फिर से नमूने की एक बड़ी संख्या में प्रदर्शन करने का एक अधिक स्वाभाविक तरीका लगता है, क्योंकि यह दोहराया क्रॉस-सत्यापन की तुलना में अधिक यादृच्छिक है। बूटस्ट्रैपिंग के लिए बैगन एंबेल्स का उपयोग एक अच्छा फीचर है, जिसमें आउट-ऑफ-बैग त्रुटि एक प्रदर्शन अनुमान के रूप में है। दोनों के बीच चयन करने के लिए एक बड़ी राशि नहीं है।
डिक्रान मार्सुपियल

धन्यवाद @ डिक्रान - इससे मुझे आश्चर्य हुआ, यह मानते हुए कि कोई बूटस्ट्रैपिंग का उपयोग करता है, आप पुनरावृत्ति के दौरान माध्य और विचरण को देखते हुए एक अच्छा मॉडल कैसे चुनेंगे ? (यानी आप किस मॉडल चयन प्रोटोकॉल का पालन करेंगे?)। यह सवाल बना हुआ है वास्तव में इस सवाल का। उस धागे पर अपना इनपुट प्राप्त करना बहुत मूल्यवान होगा!
जोश

@DikranMarsupial आप अपने चरणों 1-3 के लिए कोड (जैसे, पायथन या आर) पोस्ट कर सकते हैं? मुझे ठोस कोड देखते समय ऐसी प्रक्रियाओं को समझना बहुत आसान लगता है।
टोबिप जूल

1
मुख्य संदेश: "मुख्य बिंदु यह है कि निष्पक्ष प्रदर्शन अनुमान प्राप्त करने के लिए, अंतिम मॉडल (fit_model) को उत्पन्न करने के लिए आप जो भी प्रक्रिया का उपयोग करते हैं, उसे क्रॉस-सत्यापन प्रक्रिया के प्रत्येक तह में स्वतंत्र रूप से पूरी तरह से दोहराया जाना चाहिए ।" इस सटीक संदेश को द एलिमेंट्स ऑफ स्टैटिस्टिकल लर्निंग (खंड 7.10.2 देखें) में भी अवगत कराया गया है: web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel

0

γC

एक प्रक्रिया जो इन हाइपरपैरेटरों को अनुकूलित करती है और इन के साथ एक एसवीएम को प्रशिक्षित करती है, वह भी सिर्फ एक मशीन लर्निंग एल्गोरिदम है । केवल SVM (सपोर्ट वैक्टर) के आंतरिक मापदंडों का अनुकूलन करने के बजाय यह हाइपरपरमेटर्स को भी अनुकूलित करता है।

अब आपको दो समस्याएं हैं [जिसे स्वतंत्र रूप से हल किया जा सकता है]:

यह सुनिश्चित करने के लिए क्रॉस-सत्यापन का दुरुपयोग (सर्वश्रेष्ठ हाइपरपैरमीटर मान के लिए प्रदर्शन प्रदर्शन) पढ़ें कि आप उन्हें मिश्रण नहीं करते हैं।


आपके प्रश्न की ठोस समस्या के लिए एक विशिष्ट (शायद इष्टतम नहीं) समाधान:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

यहां, modelआपका "सर्वश्रेष्ठ मॉडल" और loss_CV"सामान्यीकरण त्रुटि का उचित अनुमान" होगा (हालांकि पक्षपाती ऊपर की ओर, लेकिन आपके पास केक नहीं हो सकता है और इसे भी खा सकते हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.