प्रशिक्षण डेटा में असमान समूह आकार के साथ एसवीएम


12

मैं प्रशिक्षण डेटा से एक एसवीएम बनाने की कोशिश कर रहा हूं जहां एक समूह को दूसरे से अधिक का प्रतिनिधित्व किया जाता है। हालांकि, समूहों को समान रूप से अंतिम परीक्षण डेटा में प्रतिनिधित्व किया जाएगा। इसलिए, मैं प्रशिक्षण डेटा में दो समूहों के प्रभाव को संतुलित करने के लिए R पैकेज इंटरफ़ेस के class.weightsपैरामीटर का उपयोग करना चाहूंगा ।e1071libsvm

चूंकि मैं अनिश्चित था कि इन भारों को कैसे निर्दिष्ट किया जाना चाहिए, इसलिए मैंने थोड़ा परीक्षण किया:

  1. कुछ अशक्त डेटा उत्पन्न करें (यादृच्छिक विशेषताएं; 2: समूह लेबल के बीच का अनुपात)
  2. class.weightsपैरामीटर सेट के साथ एक svm फ़िट करें ।
  3. नए नल डेटासेट का एक गुच्छा भविष्यवाणी करें और वर्ग अनुपात देखें।
  4. विभिन्न अशक्त प्रशिक्षण सेटों के लिए पूरी प्रक्रिया को कई बार दोहराएं।

यहाँ R कोड का उपयोग कर रहा हूँ:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

इस पूरी चीज़ से मुझे एक आउटपुट की उम्मीद थी ~ 0.5, हालाँकि, यह वह नहीं है जो मुझे मिला:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

class.weightsपैरामीटर काम कर रहा है, एक तरह से कम मैं वजन के रूप में, a, कम यह इस अनुकरण में प्रतिनिधित्व किया है (और अगर मैं छोड़ देते हैं class.weightsयह 1 के करीब रिटर्न) ... लेकिन मुझे समझ नहीं आता क्यों बस 1 के वजन का उपयोग कर: 2 ( प्रशिक्षण डेटा के लिए जो 2: 1 है) मुझे 50% से नीचे नहीं जाता है।

अगर मैं SVM को गलत समझ रहा हूं, तो क्या कोई इस बात को समझा सकता है? (या कुछ रेफरी भेजें?)

अगर मैं इसे गलत कर रहा हूं, तो क्या कोई मुझे class.weightsपैरामीटर का उपयोग करने का सही तरीका बता सकता है ?

क्या यह संभवतः बग हो सकता है? (मुझे नहीं लगता, क्योंकि मैं इस सॉफ्टवेयर और अंतर्निहित लिब्स्विम को काफी परिपक्व समझता हूं)


मुझे लिब्स्विम के साथ अनुभव नहीं है, लेकिन लिब्लिनियर के साथ, वर्ग भार महत्वपूर्ण हैं। यदि आपकी कक्षाएं भारी असंतुलित हैं, तो इसे सही ढंग से सेट करने के साथ, आपको उप-इष्टतम परिणाम मिलते हैं। मेरा सुझाव है: असंतुलित कक्षाओं के साथ एक वास्तविक डेटासेट प्राप्त करें और class.weights (LiblineaR wi) में विभिन्न मूल्यों की कोशिश करें। लिबिनाइआर एक लाइनियल कर्नेल के लिए तेजी से परिमाण का आदेश है और इसमें दंडात्मक तरीके भी हैं। मेरे अनुभव में, आप पहली बार एक सभ्य वर्ग का वजन पाते हैं और फिर सी
मारबेल

जवाबों:


7

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

इससे भी महत्वपूर्ण बात यह है कि C का इष्टतम मान डेटा-निर्भर है, आप उन्हें केवल कुछ पूर्व-निर्धारित मानों के लिए सेट नहीं कर सकते हैं, बल्कि उन्हें छोड़-एक-आउट त्रुटि को कम करके या कुछ सामान्यीकरण बाध्य करके अनुकूलित कर सकते हैं। यदि आपके पास असंतुलित कक्षाएं हैं, तो आप प्रत्येक वर्ग के लिए मूल्यों के अनुपात को ठीक कर सकते हैं, और सभी पैटर्न पर औसत जुर्माना का अनुकूलन कर सकते हैं।


यह समझ में आता है। जब मैं सुविधाओं की संख्या कम करता हूं और इस सिमुलेशन में टिप्पणियों की संख्या बढ़ाता हूं, तो आउटपुट मान 0.5 के करीब ले जाता है। हालांकि, यह कभी भी वहाँ नहीं जाता है - यहां तक ​​कि 900 पंक्तियों और केवल 1 कॉलम के साथ।
जॉन कोल्बी

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

खुशी है कि आप सुझाव उपयोगी था। इष्टतम अनुपात सेट करने पर एक पेपर होता है जो उपयोगी भी हो सकता है theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf हालांकि, इष्टतम सैद्धांतिक सुधार हमेशा व्यवहार में इष्टतम नहीं होता है, इसलिए सर्वोत्तम परिणाम हो सकते हैं वास्तव में एक विशेष अनुपात को मजबूर किए बिना दो अलग-अलग सी मापदंडों को ट्यूनिंग द्वारा प्राप्त किया जा सकता है, लेकिन अवकाश-एक-आउट मॉडल चयन मानदंड का मूल्यांकन करते समय वर्ग के अनुसार पैटर्न को वेट करना।
डिक्रान मार्सुपियल

2
मैं यह भी जोड़ूंगा, इन दिनों मैं SVM के बजाय कर्नेल रिज प्रतिगमन का उपयोग करता हूं क्योंकि आपके पास नुकसान फ़ंक्शन के व्युत्पन्न में असंतोष के कारण इस तरह की काउंटर-सहज ज्ञान युक्त समस्याएं नहीं हैं। अक्सर अगर आप एक L2 SVM को ठीक से ट्यून करते हैं, तो आप C का बहुत छोटा मान समाप्त करते हैं और सभी डेटा SVs होते हैं, जिस बिंदु पर आपके पास वैसे भी KRR मॉडल होता है। जितना अधिक मैंने उनका उपयोग किया, उतना कम उपयोगी मैंने एसवीएम को अभ्यास में पाया है, हालांकि वे जो सैद्धांतिक अंतर्दृष्टि लाए हैं वह महत्वपूर्ण है।
डिक्रान मार्सुपियल

0

प्रशिक्षण में svm एक विभेदक सीमा बनाने के लिए समर्थन वैक्टर पाते हैं और जब ऐसा करने के लिए सभी वर्गों के डेटा के लिए पर्याप्त समर्थन वैक्टर हैं, तो यह कोई समस्या नहीं होगी। परीक्षण सेट के परिणाम सटीकता में आपको वास्तविक दुनिया में सभी वर्गों के लिए डेटा की समानता राशि का ध्यान रखना चाहिए और वास्तविक परिणाम प्राप्त करने के लिए आप डेटा को हेरफेर करते हैं और साथ ही साथ इसे वास्तविक स्थिति में ठीक से माना जाता है।


यह उत्तर फिलहाल स्पष्ट नहीं है - मैंने इसे कॉपी-एडिट देने पर विचार किया, लेकिन कई जगह हैं जहां मैं अनिश्चित था कि आप क्या चाहते हैं। अर्थ बताने के लिए विराम चिह्न और व्याकरण महत्वपूर्ण हैं।
सिल्वरफिश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.