मधुमेह के एसवीएम वर्गीकरण में सुधार


10

मैं मधुमेह का अनुमान लगाने के लिए एसवीएम का उपयोग कर रहा हूं। मैं इस उद्देश्य के लिए BRFSS डेटा सेट का उपयोग कर रहा हूं । डेटा सेट में का आयाम है और तिरछा है। लक्ष्य चर में s का प्रतिशत जबकि शेष गठन है ।11 % 89 %432,607×136Y1 1%N89%

मैं डेटा सेट से केवल स्वतंत्र चर 15का उपयोग कर रहा हूं 136। डेटा सेट को कम करने के कारणों में से एक में अधिक प्रशिक्षण के नमूने होने थे जब पंक्तियों NAको छोड़ दिया गया था।

इन 15चर का चयन सांख्यिकीय विधियों जैसे कि यादृच्छिक पेड़, लॉजिस्टिक प्रतिगमन और यह पता लगाने के बाद किया गया था कि परिणामी मॉडल से कौन से चर महत्वपूर्ण हैं। उदाहरण के लिए, लॉजिस्टिक रिग्रेशन चलाने के बाद हम p-valueसबसे महत्वपूर्ण चर ऑर्डर करते थे।

क्या परिवर्तनशील चयन करने की मेरी विधि सही है? किसी भी सुझाव का बहुत स्वागत है।

निम्नलिखित मेरा Rकार्यान्वयन है।

library(e1071) # Support Vector Machines

#--------------------------------------------------------------------
# read brfss file (huge 135 MB file)
#--------------------------------------------------------------------
y <- read.csv("http://www.hofroe.net/stat579/brfss%2009/brfss-2009-clean.csv")
indicator <- c("DIABETE2", "GENHLTH", "PERSDOC2", "SEX", "FLUSHOT3", "PNEUVAC3", 
    "X_RFHYPE5", "X_RFCHOL", "RACE2", "X_SMOKER3", "X_AGE_G", "X_BMI4CAT", 
    "X_INCOMG", "X_RFDRHV3", "X_RFDRHV3", "X_STATE");
target <- "DIABETE2";
diabetes <- y[, indicator];

#--------------------------------------------------------------------
# recode DIABETE2
#--------------------------------------------------------------------
x <- diabetes$DIABETE2;
x[x > 1]  <- 'N';
x[x != 'N']  <- 'Y';
diabetes$DIABETE2 <- x; 
rm(x);

#--------------------------------------------------------------------
# remove NA
#--------------------------------------------------------------------
x <- na.omit(diabetes);
diabetes <- x;
rm(x);

#--------------------------------------------------------------------
# reproducible research 
#--------------------------------------------------------------------
set.seed(1612);
nsamples <- 1000; 
sample.diabetes <- diabetes[sample(nrow(diabetes), nsamples), ]; 

#--------------------------------------------------------------------
# split the dataset into training and test
#--------------------------------------------------------------------
ratio <- 0.7;
train.samples <- ratio*nsamples;
train.rows <- c(sample(nrow(sample.diabetes), trunc(train.samples)));

train.set  <- sample.diabetes[train.rows, ];
test.set   <- sample.diabetes[-train.rows, ];

train.result <- train.set[ , which(names(train.set) == target)];
test.result  <- test.set[ , which(names(test.set) == target)];

#--------------------------------------------------------------------
# SVM 
#--------------------------------------------------------------------
formula <- as.formula(factor(DIABETE2) ~ . );
svm.tune <- tune.svm(formula, data = train.set, 
    gamma = 10^(-3:0), cost = 10^(-1:1));
svm.model <- svm(formula, data = train.set, 
    kernel = "linear", 
    gamma = svm.tune$best.parameters$gamma, 
    cost  = svm.tune$best.parameters$cost);

#--------------------------------------------------------------------
# Confusion matrix
#--------------------------------------------------------------------
train.pred <- predict(svm.model, train.set);
test.pred  <- predict(svm.model, test.set);
svm.table <- table(pred = test.pred, true = test.result);
print(svm.table);

मैं (प्रशिक्षण = 700 और परीक्षण = 300 ) नमूनों के साथ भागा क्योंकि यह मेरे लैपटॉप में तेज है। परीक्षण डेटा ( 300 नमूने) के लिए भ्रम का मैट्रिक्स मुझे काफी बुरा लगता है।1000700300300

    true
pred   N   Y
   N 262  38
   Y   0   0

मुझे Yकक्षा के लिए अपनी भविष्यवाणी में सुधार करने की आवश्यकता है । वास्तव में, मुझे जितना संभव हो उतना ही सटीक होना चाहिए, Yभले ही मैं खराब प्रदर्शन करूं N। वर्गीकरण की सटीकता में सुधार के लिए किसी भी सुझाव की बहुत सराहना की जाएगी।


मुझे लगता है कि आपका एसवीएम बिल्कुल काम नहीं करता है, लेकिन पता नहीं क्यों! यह भी अपने डेटा को सामान्य करने के लिए बेहतर हो सकता है ...
15:45 पर user4581

Y 90%

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

आप kernlabइसके बजाय भी कोशिश कर सकते हैं e1071- यह स्वचालित रूप से सामान्यीकरण करता है और पहले मॉडल को बूटस्ट्रैप करने में आसान बनाने वाले कुछ आंकड़े हैं।

जवाबों:


9

मेरे 4 सुझाव हैं:

  1. आप अपने मॉडल में शामिल करने के लिए चर कैसे चुन रहे हैं? हो सकता है कि आप बड़े डेटासेट से कुछ प्रमुख संकेतक याद कर रहे हों।
  2. आपके द्वारा उपयोग किए जा रहे लगभग सभी संकेतक (जैसे कि सेक्स, धूम्रपान, आदि) को कारकों के रूप में माना जाना चाहिए। इन चरों को संख्यात्मक मान लेना गलत है, और संभवतः आपके मॉडल में त्रुटि के लिए योगदान दे रहा है।
  3. आप एक SVM का उपयोग क्यों कर रहे हैं? क्या आपने किसी भी सरल तरीकों की कोशिश की, जैसे कि रैखिक विभेदक विश्लेषण या यहां तक ​​कि रैखिक प्रतिगमन? हो सकता है कि बड़े डेटासेट पर एक सरल दृष्टिकोण बेहतर परिणाम देगा।
  4. कैरट पैकेज का प्रयास करें । यह आपको मॉडल की सटीकता को पार करने में मदद करेगा, यह समानांतर है जो आपको तेजी से काम करने देगा, और विभिन्न प्रकार के मॉडल का पता लगाना आसान बनाता है।

यहां कैरेट के लिए कुछ उदाहरण कोड दिए गए हैं:

library(caret)

#Parallize
library(doSMP)
w <- startWorkers()
registerDoSMP(w)

#Build model
X <- train.set[,-1]
Y <- factor(train.set[,1],levels=c('N','Y'))
model <- train(X,Y,method='lda')

#Evaluate model on test set
print(model)
predY <- predict(model,test.set[,-1])
confusionMatrix(predY,test.set[,1])
stopWorkers(w)

यह एलडीए मॉडल आपके एसवीएम को धड़कता है, और मैंने आपके कारकों को भी ठीक नहीं किया है। मुझे यकीन है कि यदि आप कारकों के रूप में सेक्स, धूम्रपान करने वाले आदि को फिर से याद करते हैं, तो आपको बेहतर परिणाम मिलेंगे।


मुझे निम्न त्रुटि मिलती है task 1 failed - "could not find function "predictionFunction""। मुझे पता है कि यह एक मंच नहीं है, लेकिन अगर आपके पास कोई टिप्पणी है तो कृपया मुझे बताएं।
आनंद

1
@ आनंद: व्यवस्थापक के रूप में एक नया R सत्र खोलें (या mac / linux पर sudo R चलाएं)। भागो update.packages.जब कि समाप्त हो गया है, करीब आर और एक सामान्य (गैर व्यवस्थापक) सत्र फिर से खोलें। "SVM" और "भ्रम मैट्रिक्स" अनुभागों को छोड़कर अपना कोड चलाएँ। फिर मेरा कोड चलाएं। यदि आपको अभी भी कोई त्रुटि मिलती है, तो कृपया सटीक त्रुटि के साथ, त्रुटि की वापसी करने वाली रेखा पोस्ट करें।
Zach

1
@ आनंद: इसके अलावा, सुनिश्चित करें कि आप आर (2.14) का नवीनतम संस्करण चला रहे हैं, और कैरेट के नवीनतम संस्करण का उपयोग कर रहे हैं। आप install.packages('caret')फिर से चलाकर कैरेट को अपडेट कर सकते हैं ।
Zach

@ आनंद: महान! आप trainफ़ंक्शन के लिए अलग-अलग तरीकों से ड्रॉप कर सकते हैं , जैसे nb(भोले बाए), glm(लॉजिस्टिक रिग्रेशन), svmLinearऔर svmRadial। स्वम के फिट होने में लंबा समय लगेगा।
Zach

3

यदि आप एक रैखिक कर्नेल का उपयोग कर रहे हैं, तो यह संभव है कि सुविधा चयन एक बुरा विचार है, और यह कि नियमितीकरण सुविधा चयन की तुलना में अधिक प्रभावी ढंग से ओवर-फिटिंग को रोक सकता है। ध्यान दें कि प्रदर्शन सीमा है कि एसवीएम लगभग लागू सुविधा स्थान के आयाम से स्वतंत्र है, जो एसवीएम के विक्रय बिंदुओं में से एक था।


2

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

यह पेपर: http: //www.it.iitb.ac.in/~kamlesh/Page/Reports/highlySkewed.pdf

Weka में कार्यान्वित इन तकनीकों की कुछ चर्चा और उदाहरण हैं, लेकिन आर में खुद को इनका अर्थ देना भी संभव है।


उपयोगी टिप्पणियों के लिए धन्यवाद। मुझे अपने सुझाव देने की कोशिश करें।
आनंद

1

पहले से ही उल्लेख किया गया है के अलावा, आप एक रैखिक कर्नेल का उपयोग करने के लिए अपने सबसे अच्छे मॉडल को ठीक कर रहे हैं। आपको सबसे अच्छा मॉडल का उपयोग करने की भविष्यवाणी करनी चाहिए, जिसमें उसी कर्नेल का उपयोग किया गया था जो आपके ट्यूनिंग चरण में उपयोग किया गया / पाया गया था (जो मुझे लगता है कि आरबीएफ है क्योंकि आपके ट्यूनिंग गामा हैं)।

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