Dans chaque livre et chaque exemple, ils ne montrent toujours qu'une classification binaire (deux classes) et le nouveau vecteur peut appartenir à une classe.
Ici le problème est que j'ai 4 classes (c1, c2, c3, c4). J'ai des données d'entraînement pour 4 cours.
Pour le nouveau vecteur, la sortie devrait être comme
C1 80% (le gagnant)
c2 10%
c3 6%
c4 4%
Comment faire ça? Je prévois d'utiliser libsvm (car c'est le plus populaire). Je ne sais pas grand chose à ce sujet. Si certains d'entre vous l'ont déjà utilisé, dites-moi les commandes spécifiques que je suis censé utiliser.
LibSVM utilise l’approche one-against-one pour les problèmes d’apprentissage multi-classes. De la FAQ :
Q: Quelle méthode libsvm utilise-t-elle pour les SVM multi-classes? Pourquoi n'utilisez-vous pas la méthode "1 contre le reste"?
C'est un contre un. Nous l'avons choisi après la comparaison suivante: C.-W. Hsu et C.-J. Lin. Comparaison des méthodes pour les machines à vecteurs de support multi-classes , IEEE Transactions on Neural Networks, 13 (2002), 415-425.
"1 contre le reste" est une bonne méthode dont les performances sont comparables à "1 contre 1". Nous faisons ce dernier simplement parce que son temps d’entraînement est plus court.
Les méthodes couramment utilisées sont One vs. Rest et One vs. One . Dans la première méthode, vous obtenez n classificateurs et la classe résultante aura le score le plus élevé . Dans la seconde méthode, la classe résultante est obtenue par vote majoritaire. de tous les classificateurs.
AFAIR, libsvm supporte les deux stratégies de classification multiclass.
Vous pouvez toujours réduire un problème de classification multi-classes à un problème binaire en choisissant des partitions aléatoires de l'ensemble des classes, de manière récursive. Cela n’est pas nécessairement moins efficace ou efficient que l’apprentissage simultané, car les problèmes de sous-apprentissage exigent moins d’exemples car le problème de partitionnement est plus petit. (Cela peut nécessiter au plus un temps de commande constant de plus, par exemple deux fois plus longtemps). Cela peut également conduire à un apprentissage plus précis.
Je ne le recommande pas nécessairement, mais c’est une réponse à votre question. C’est une technique générale qui peut être appliquée à n’importe quel algorithme d’apprentissage binaire.
Utilisez la bibliothèque SVM Multiclass. Trouvez-le sur la page SVM de Thorsten Joachims
Il n'a pas de commutateur spécifique (commande) pour la prédiction multi-classe. il gère automatiquement la prédiction multi-classes si votre jeu de données d'apprentissage contient plus de deux classes.
Rien de spécial par rapport à la prédiction binaire. voir l'exemple suivant pour la prédiction à 3 classes basée sur 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])
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)