如何使用(或不使用)LibSVM执行支持向量回归



我正在写一篇论文,要求应用支持向量回归(SVR),最好是使用高斯核。经过一点搜索,我发现LibSVM可以帮助完成这项任务。

然而,我面临着相当多的困难:我不完全确定如何使用这个或任何其他类似的库来做到这一点,如何凭经验决定SVR参数(内核带宽、成本和ε(松弛变量)),以及如何绘制训练和测试误差。

欢迎所有建议。

最佳参数将取决于您的数据。你最好的(也许也是唯一的)选择是连续尝试多个参数集,看看哪一个参数集的性能最好,无论你选择哪个指标。

至于绘制训练和测试错误,评估分类器的一个好方法是使用F-测度作为性能指标。这允许您考虑假阳性和假阴性错误,并根据您的特定领域对其进行适当的加权。如果你对训练和测试错误的描绘有其他意思,请澄清。

编辑:回应您的意见

LibSVM也不知道如何优化自己的参数——这就是为什么你需要为它提供参数作为svm_train函数的参数。你需要通过实验来优化你自己的参数,要做到这一点,你需要对性能进行一些单一的定量测量。我不知道你所说的30值问题是什么意思,但你应该能够通过创造性地重新定义真阳性、假阳性、真阴性和假阴性来使用F-测度。

您有两种选择:一种是更全面的,另一种是计算成本更低的。您可以使用三层嵌套循环来测试gamma、C和epsilon的各种可能组合,选择在测试数据上产生最高性能的参数(我建议使用交叉验证以避免过度拟合特定的测试数据),也可以依次优化每个参数-首先,给定一些平淡的默认C和epsilion,迭代许多gamma值,直到找到最佳值;则对C和ε进行同样的操作。

如果您想增强第二种方法,请使其在优化每个参数时,使用所有其他参数的最佳值,而不是某些默认值,并多次优化每个参数(以便它们可以在其他参数中连续使用更好的值运行)。

为了使任何一种方法更精确(尽管总是以潜在的过拟合为代价,请记住),请使用伸缩搜索——比如说,你第一次从1搜索到101,步长为10,所以你搜索1、11、21…101。在获得最佳值(例如51)后的下一次运行中,搜索46、47、48、49、50、51、52、53、54、55、56,以便重用相同的信息,但变得更加精确。

为了降低任何一种方法对随机波动的敏感性(比如说,在你为交叉验证生成的随机折叠中),用默认参数运行多个交叉验证测试(我想说,C的好默认值可能是1.0,ε的值可能是1E-9,我不确定gamma),并获得你使用的性能测量的平均值和标准偏差。然后,您可以判断给定的性能度量在统计上是否明显优于第二好,或者是否仅使用默认参数。

最新更新