SVM 训练性能

Posted

技术标签:

【中文标题】SVM 训练性能【英文标题】:SVM training performance 【发布时间】:2012-11-03 23:01:57 【问题描述】:

我正在使用 SVMLib 在 MNIST 数据集上训练一个简单的 SVM。它包含 60.000 个训练数据。但是,我有几个性能问题:训练似乎没完没了(几个小时后,我不得不手动关闭它,因为它没有响应)。我的代码很简单,我只是在数据集上调用ovrtrain,没有任何内核和任何特殊常量:

function features = readFeatures(fileName)
   [fid, msg] = fopen(fileName, 'r', 'ieee-be');
   header = fread(fid, 4, "int32" , 0, "ieee-be");

   if header(1) ~= 2051
      fprintf("Wrong magic number!");
   end

   M = header(2);
   rows = header(3);
   columns = header(4);

   features = fread(fid, [M, rows*columns], "uint8", 0, "ieee-be");
   fclose(fid);
   return;
endfunction

function labels = readLabels(fileName)
   [fid, msg] = fopen(fileName, 'r', 'ieee-be');
   header = fread(fid, 2, "int32" , 0, "ieee-be");

   if header(1) ~= 2049
      fprintf("Wrong magic number!");
   end

   M = header(2);

   labels = fread(fid, [M, 1], "uint8", 0, "ieee-be");
   fclose(fid);
   return;
endfunction

labels = readLabels("train-labels.idx1-ubyte");
features = readFeatures("train-images.idx3-ubyte");
model = ovrtrain(labels, features, "-t 0");  % doesn't respond...

我的问题:这正常吗?我在虚拟机 Ubuntu 上运行它。我应该等待更长时间吗?

【问题讨论】:

尝试在较小的子集上进行训练? 我尝试在随机的 10 个训练示例上进行训练(只要试试它是否有效)。大约需要 10 秒才能完成。我不想训练例如随机 100 或 1000 个示例,因为我认为最终模型会存在偏差...... 当然,但是如果有 1000 个实例,您可能会更好地了解需要多少时间。你的数据的维度是多少?你试过其他参数吗? 如果有 1000 个样本,训练将在……呃……分钟内结束。但是我没有得到很好的准确率,只有 65-70%... 你有多少个变量?使用一些变量选择或降维技术可能会很好。 【参考方案1】:

考虑到您的数据特征,这可能是一个收敛问题。

检查默认选择的内核并更改它。另外,检查包裹的停止标准。此外,如果您正在寻找更快的实现,请查看 MSVMpack,它是 SVM 的并行实现。

最后,您需要选择特征。您最终可以获得几乎一半的功能子集。此外,您只需要一部分数据进行训练,例如60~70 % 就足够了。

【讨论】:

【参考方案2】:

首先,60k 是用于训练的大量数据。除非您拥有超级计算,否则使用线性内核训练这么多数据将花费大量时间。此外,您还选择了 1 次线性核函数。最好使用高斯或更高次多项式核函数(使用相同数据集的 4 次函数显示出良好的转换精度)。尝试为 -c cost -m memory cachesize -e epsilon 终止标准容差添加 LIBSVM 选项(默认为 0.001)。首先用 4 度的高斯/多项式运行 1000 个样本并比较准确度。

【讨论】:

【参考方案3】:

我不知道你是否接受了你的答案,但让我告诉你我对你的情况的预测。对于像 LibSVM 这样的动力训练器来说,60.000 个示例并不多。目前,我正在研究一个包含 6000 个示例的训练集,训练需要 3 到 5 秒。但是,参数选择很重要,这可能需要很长时间。如果数据集中的唯一特征数量过多,那么对于任何示例,不存在的特征都会有很多零特征值。如果该工具在您的训练集上实施数据缩放,那么很可能这些零特征值将被缩放到某个非零值,从而为每个示例留下天文数字的唯一和非零值特征。这对于 SVM 工具来说是非常非常复杂的,要进入并提取有效的参数值。

长话短说,如果您对 SVM 工具进行了足够的研究并理解我的意思,您可以在执行训练命令之前为其分配参数值,或者找到减少独特特征数量的方法。如果您还没有,请继续下载最新版本的 LibSVM,阅读自述文件以及工具网站上的常见问题解答。

如果不是这些情况,那么抱歉耽误您的时间:) 祝你好运。

【讨论】:

以上是关于SVM 训练性能的主要内容,如果未能解决你的问题,请参考以下文章

实时 SVM 性能差

提高 SVM 的准确度性能

pluskid'SVM系列笔记(可当做目录对照看)

如何评估不同模型在一个数据集上的性能?

随机森林与支持向量机。哪个更快?

与随机森林相比,SVM 性能较差