libsvm中的多类分类

11

我正在使用libsvm工作,并需要用 one versus all 实现多类别分类。

我应该怎样做?
这个libsvm的2011版本是否支持此功能?


我认为我的问题并不是很清楚。如果libsvm不会自动使用one versus all策略,我将为每个类别使用一个svm,否则我该如何在svmtrain函数中定义这些参数。 我已经阅读了libsvm的README文件。


请解释一下你尝试了什么?如果你还没有尝试过,请阅读README。顺便提醒一句:用svmlib还是libsvm? - Oli
1
相关问题:https://dev59.com/kW445IYBdhLWcg3wOnrW - Amro
形成了k(k-1)/2个分类器。我不认为会形成k(k/1)=2个分类器。只是提供信息。除此之外,Amro的答案是完美的... - lakshmen
1个回答

36
根据官方libsvm documentation(第7节):
LIBSVM实现了多类分类的“一对一”方法。如果k是类的数量,则构建k(k-1)/2个分类器,并且每个分类器训练两个类的数据。
在分类中,我们使用投票策略:将每个二元分类视为一次投票,可以为所有数据点x投票,最终将一个点指定为拥有最多票数的类。
在“一对所有”方法中,我们建立与类别数相同的二元分类器,每个分类器都训练以将一个类与其他类分开。要预测新实例,我们选择决策函数值最大的分类器。
正如我之前提到的,这个想法是训练 k 个 SVM 模型,每个模型将一个类与其他类分开。一旦我们有了这些二元分类器,我们使用概率输出(-b 1选项)通过选择具有最高概率的类来预测新的实例。
考虑以下示例:
%# Fisher Iris dataset
load fisheriris
[~,~,labels] = unique(species);   %# labels: 1/2/3
data = zscore(meas);              %# scale features
numInst = size(data,1);
numLabels = max(labels);

%# split training/testing
idx = randperm(numInst);
numTrain = 100; numTest = numInst - numTrain;
trainData = data(idx(1:numTrain),:);  testData = data(idx(numTrain+1:end),:);
trainLabel = labels(idx(1:numTrain)); testLabel = labels(idx(numTrain+1:end));

这是我为多类支持向量机实现的一对多方法:

%# train one-against-all models
model = cell(numLabels,1);
for k=1:numLabels
    model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');
end

%# get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
    [~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
    prob(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
end

%# predict the class with the highest probability
[~,pred] = max(prob,[],2);
acc = sum(pred == testLabel) ./ numel(testLabel)    %# accuracy
C = confusionmat(testLabel, pred)                   %# confusion matrix

2
你能给我提供一个使用libsvm进行one against all分类的例子吗? - images
非常感谢,我用 [dummy,dummy,labels] = unique(species); 替换了它,它正常工作了。 - Zahra E
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Amro
1
@Amin:听起来像是构建问题,请参考此帖子中的说明编译适用于MATLAB的libsvm: https://dev59.com/6W_Xa4cB1Zd3GeqP7Pkd#15559516。如果您仍然遇到问题,可以考虑使用*Dependency Walker*进行故障排除:https://www.mathworks.com/matlabcentral/answers/92362-how-do-i-determine-which-libraries-my-mex-file-or-stand-alone-application-requires - Amro
1
@Amin:不要期望在评论中得到完整的答案,但你不能盲目地应用机器学习算法并期望获得良好的结果。你应该了解SVM及其参数(核函数、C、gamma等),以及如何使用交叉验证进行网格搜索以找到好的值。你还应该研究数据预处理(至少规范化特征)...祝你好运。 - Amro
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接