मैं प्रशिक्षण डेटा से एक एसवीएम बनाने की कोशिश कर रहा हूं जहां एक समूह को दूसरे से अधिक का प्रतिनिधित्व किया जाता है। हालांकि, समूहों को समान रूप से अंतिम परीक्षण डेटा में प्रतिनिधित्व किया जाएगा। इसलिए, मैं प्रशिक्षण डेटा में दो समूहों के प्रभाव को संतुलित करने के लिए R पैकेज इंटरफ़ेस के class.weights
पैरामीटर का उपयोग करना चाहूंगा ।e1071
libsvm
चूंकि मैं अनिश्चित था कि इन भारों को कैसे निर्दिष्ट किया जाना चाहिए, इसलिए मैंने थोड़ा परीक्षण किया:
- कुछ अशक्त डेटा उत्पन्न करें (यादृच्छिक विशेषताएं; 2: समूह लेबल के बीच का अनुपात)
class.weights
पैरामीटर सेट के साथ एक svm फ़िट करें ।- नए नल डेटासेट का एक गुच्छा भविष्यवाणी करें और वर्ग अनुपात देखें।
- विभिन्न अशक्त प्रशिक्षण सेटों के लिए पूरी प्रक्रिया को कई बार दोहराएं।
यहाँ 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
पैरामीटर का उपयोग करने का सही तरीका बता सकता है ?
क्या यह संभवतः बग हो सकता है? (मुझे नहीं लगता, क्योंकि मैं इस सॉफ्टवेयर और अंतर्निहित लिब्स्विम को काफी परिपक्व समझता हूं)