2009-12-24 13 views
35

का उपयोग करके बहु श्रेणी वर्गीकरण कैसे करें प्रत्येक पुस्तक और उदाहरण में हमेशा वे केवल बाइनरी वर्गीकरण (दो कक्षाएं) दिखाते हैं और नए वेक्टर किसी एक वर्ग से संबंधित हो सकते हैं।समर्थन वेक्टर मशीनों (एसवीएम)

यहां समस्या यह है कि मेरे पास 4 कक्षाएं हैं (सी 1, सी 2, सी 3, सी 4)। मैंने 4 कक्षाओं के लिए डेटा प्रशिक्षण दिया है।

नए वेक्टर के लिए उत्पादन की तरह

सी 1 80% (विजेता)

c2 10%

सी 3 6%

सी 4 4% होना चाहिए

टी कैसे करें उनके? मैं libsvm का उपयोग करने की योजना बना रहा हूं (क्योंकि यह सबसे लोकप्रिय है)। मुझे इसके बारे में बहुत कुछ पता नहीं है। यदि आप में से कोई भी पहले इसे इस्तेमाल करता है तो कृपया मुझे उन विशिष्ट आदेशों को बताएं जिन्हें मैं उपयोग करना चाहता हूं।

उत्तर

3

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

मैं जरूरी नहीं कि यह सिफारिश कर रहा हूं, लेकिन यह आपके प्रश्न का एक जवाब है, और यह एक सामान्य तकनीक है जिसे किसी भी बाइनरी लर्निंग एल्गोरिदम पर लागू किया जा सकता है।

11

आम तौर पर प्रयुक्त विधियां वन बनाम आराम और एक बनाम वन हैं। पहले मामले में आपको एन क्लासिफायर मिलते हैं और परिणामी वर्ग के साथ उच्चतम स्कोर होता है, दूसरी कक्षा में परिणामी वर्ग सभी क्लासिफायरों के बहुमत से प्राप्त होता है।

AFAIR, libsvm multiclass दोनों रणनीतियों का समर्थन करता है।

+3

मैंने सोचा था कि libsvm केवल एक बनाम एक का समर्थन करता है। लेकिन यह वास्तव में अच्छी तरह से काम करता है, हालांकि। –

30

लिबएसवीएम बहु-वर्ग सीखने की समस्याओं के लिए एक-विरुद्ध-एक दृष्टिकोण का उपयोग करता है। FAQ से:

प्रश्न: बहु-वर्ग एसवीएम के लिए libsvm किस विधि का उपयोग करता है? आप "1-विरुद्ध-बाकी" विधि का उपयोग क्यों नहीं करते?

यह एक-एक-एक है। हमने निम्नलिखित तुलना करने के बाद इसे चुना: सी.- डब्ल्यू। एचएसयू और सी.- जे। लिन। A comparison of methods for multi-class support vector machines, आईईईई लेनदेन पर तंत्रिका नेटवर्क, 13 (2002), 415-425।

"1-विरुद्ध-बाकी" एक अच्छी विधि है जिसका प्रदर्शन "1-विरुद्ध -1" के बराबर है। हम बाद में ऐसा करते हैं क्योंकि इसका प्रशिक्षण समय छोटा होता है।

0

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

0

द्विआधारी भविष्यवाणी की तुलना में कुछ विशेष नहीं है।एसवीएम के आधार पर 3-वर्ग पूर्वानुमान के लिए निम्न उदाहरण देखें।

install.packages("e1071") 
library("e1071") 
data(iris) 
attach(iris) 
## classification mode 
# default with factor response: 
model <- svm(Species ~ ., data = iris) 
# alternatively the traditional interface: 
x <- subset(iris, select = -Species) 
y <- Species 
model <- svm(x, y) 
print(model) 
summary(model) 
# test with train data 
pred <- predict(model, x) 
# (same as:) 
pred <- fitted(model) 
# Check accuracy: 
table(pred, y) 
# compute decision values and probabilities: 
pred <- predict(model, x, decision.values = TRUE) 
attr(pred, "decision.values")[1:4,] 
# visualize (classes by color, SV by crosses): 
plot(cmdscale(dist(iris[,-5])), 
    col = as.integer(iris[,5]), 
    pch = c("o","+")[1:150 %in% model$index + 1]) 
0
data=load('E:\dataset\scene_categories\all_dataset.mat'); 
    meas = data.all_dataset; 
    species = data.dataset_label; 
    [g gn] = grp2idx(species);      %# nominal class to numeric 

%# split training/testing sets 
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/10); 
%# 1-vs-1 pairwise models 
num_labels = length(gn); 
clear gn; 
num_classifiers = num_labels*(num_labels-1)/2; 
pairwise = zeros(num_classifiers ,2); 
row_end = 0; 
for i=1:num_labels - 1 
    row_start = row_end + 1; 
    row_end = row_start + num_labels - i -1; 
    pairwise(row_start : row_end, 1) = i; 
    count = 0; 
    for j = i+1 : num_labels   
     pairwise(row_start + count , 2) = j; 
     count = count + 1; 
    end  
end 
clear row_start row_end count i j num_labels num_classifiers; 
svmModel = cell(size(pairwise,1),1);   %# store binary-classifers 
predTest = zeros(sum(testIdx),numel(svmModel)); %# store binary predictions 

%# classify using one-against-one approach, SVM with 3rd degree poly kernel 
for k=1:numel(svmModel) 
    %# get only training instances belonging to this pair 
    idx = trainIdx & any(bsxfun(@eq, g, pairwise(k,:)) , 2); 

    %# train 
    svmModel{k} = svmtrain(meas(idx,:), g(idx), ... 
       'Autoscale',true, 'Showplot',false, 'Method','QP', ... 
       'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1); 

    %# test 
    predTest(:,k) = svmclassify(svmModel{k}, meas(testIdx,:)); 
end 
pred = mode(predTest,2); %# voting: clasify as the class receiving most votes 

%# performance 
cmat = confusionmat(g(testIdx),pred); 
acc = 100*sum(diag(cmat))./sum(cmat(:)); 
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc); 
fprintf('Confusion Matrix:\n'), disp(cmat) 
+5

क्या आप इसे समझने में मदद करने के लिए कोई विवरण जोड़ सकते हैं? यदि आपके पास कोड अकेला है तो आपके उत्तर का कम मूल्य कम है:/ – goto

+0

all_dataset.mat में 15 कक्षाएं हैं, मैं बहु-वर्गीकरण एसवीएम का उपयोग ऑन्स बनाम एक बाइनरी एसवीएम वर्गीकृत के आधार पर करता हूं। – lin0Xu