Как выполнить мультиклассовую классификацию с использованием машин опорных векторов (SVM) - PullRequest
48 голосов
/ 24 декабря 2009

В каждой книге и примере всегда они показывают только двоичную классификацию (два класса), и новый вектор может принадлежать любому одному классу.

Здесь проблема в том, что у меня есть 4 класса (с1, с2, с3, с4). У меня есть данные тренировок для 4 классов.

Для нового вектора вывод должен быть как

C1 80% (победитель)

c2 10%

с3 6%

с4 4%

Как это сделать? Я планирую использовать libsvm (потому что он самый популярный). Я не знаю много об этом. Если кто-то из вас, ребята, использовал его ранее, скажите мне конкретные команды, которые я должен использовать.

Ответы [ 7 ]

37 голосов
/ 23 февраля 2011

LibSVM использует подход один-против-одного для многопрофильных задач обучения. Из FAQ :

В: Какой метод использует libsvm для мультиклассового SVM? Почему вы не используете метод «1 против остальных»?

Это один против одного. Мы выбрали его после проведения следующего сравнения: C.-W. Сюй и С.-Ж. Лин. Сравнение методов для многоклассовых машин опорных векторов , Транзакции IEEE в нейронных сетях, 13 (2002), 415-425.

«1 против остальных» - хороший метод, производительность которого сравнима с «1 против 1». Мы делаем последнее просто потому, что время его обучения короче.

18 голосов
/ 24 декабря 2009

Обычно используемые методы - Один против Отдыха и Один против Один. В первом методе вы получите n классификаторов, и полученный класс получит самый высокий балл. Во втором методе результирующий класс получается большинством голосов всех классификаторов.

AFAIR, libsvm поддерживает обе стратегии мультиклассовой классификации.

4 голосов
/ 24 декабря 2009

Вы всегда можете свести задачу классификации нескольких классов к бинарной, выбрав случайные разбиения набора классов рекурсивно. Это не обязательно является менее эффективным или действенным, чем изучение всего за один раз, поскольку проблемы дополнительного обучения требуют меньше примеров, так как проблема разделения меньше. (Это может потребовать самое большее постоянного времени заказа, например, вдвое дольше). Это также может привести к более точному обучению.

Я не обязательно рекомендую это, но это один из ответов на ваш вопрос, и это общая методика, которая может применяться к любому двоичному алгоритму обучения.

1 голос
/ 03 декабря 2011

Используйте библиотеку SVM Multiclass. Найдите его на странице SVM от Thorsten Joachims

0 голосов
/ 04 января 2017
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)
0 голосов
/ 25 июля 2016

Ничего особенного по сравнению с бинарным предсказанием. см. следующий пример для трехклассового прогнозирования на основе SVM.

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 голосов
/ 01 октября 2015

У него нет специального переключателя (команды) для многоклассового прогнозирования. он автоматически обрабатывает мультиклассовое прогнозирование, если ваш обучающий набор данных содержит более двух классов.

...