带有交叉验证的 SVM 分类

Posted

技术标签:

【中文标题】带有交叉验证的 SVM 分类【英文标题】:SVM Classification with Cross Validation 【发布时间】:2012-09-30 16:51:11 【问题描述】:

我是使用 Matlab 的新手,我正在尝试按照 the Bioinformatics Toolbox documentation (SVM Classification with Cross Validation) 中的示例来处理分类问题。

但是,我无法理解第 9 步,它说:

设置一个函数,该函数接受输入 z=[rbf_sigma,boxconstraint],并返回 exp(z) 的交叉验证值。

采用 exp(z) 的原因有两个: rbf_sigma 和 boxconstraint 必须为正数。

您应该查看大约呈指数分布的点。 此函数句柄计算参数的交叉验证

exp([rbf_sigma,boxconstraint]):
minfn = @(z)crossval('mcr',cdata,grp,'Predfun', ...
    @(xtrain,ytrain,xtest)crossfun(xtrain,ytrain,...
    xtest,exp(z(1)),exp(z(2))),'partition',c);

我应该在这里实现什么功能?是exp 还是minfn?如果您能给我本节的代码,我将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

我想知道exp([rbf_sigma,boxconstraint])是什么意思

    rbf_sigma:支持向量机使用高斯内核,rbf_sigma 设置内核的标准偏差(~size)。为了理解内核是如何工作的,SVM 将内核放在每个样本周围(这样每个样本周围都有一个高斯分布)。然后为每个类别/类型的样本添加(相加)内核。在每一点上,总和较高的类型将是“赢家”。例如,如果类型 A 在点 X 处这些内核的总和较高,那么如果您在点 X 有一个新的数据要分类,它将被分类为类型 A。(还有其他配置参数可能会改变实际阈值,其中选择了一个类别而不是另一个类别)

图。从你给我们的网页分析这个数字。您可以通过将红色样本“sumA”和绿色样本“sumB”上的高斯核相加来了解如何;在图的中心部分,sumA>sumB 是合乎逻辑的。图像外部的 sumB>sumA 也是合乎逻辑的。

    boxconstraint:它是对未分类数据的成本/惩罚。在分类器的训练阶段,您使用训练数据来调整 SVM 参数,训练算法使用误差函数来决定如何以迭代方式优化 SVM 参数。错误分类样本的成本与它与正确分类的边界的距离成正比。在我附上边界的图中,是内蓝色圆周。

考虑到 BGreene 的指示以及我对本教程的理解:

    在教程中,他们建议尝试以指数方式分开的 rbf_sigma 和 boxconstraint 的值。这意味着您应该比较像 0.2, 2, 20, ... 之类的值(注意这是 2*10^(i-2), i=1,2,3,...),并且不像 0.2, 0.3, 0.4, 0.5 (线性分开)。他们建议首先尝试广泛的值。您可以在以后从之前获得的第一个最优值中进一步优化。 命令“[searchmin fval] = fminsearch(minfn,randn(2,1),opts)”将为您提供 rbf_sigma 和 boxconstraint 的最佳值。可能您必须使用 exp(z) 因为它会影响 fminsearch 在搜索最佳值期间如何增加 z(1) 和 z(2) 的值。我想当您将 exp(z(1)) 放入 @minfn 的定义中时,fminsearch 将采取“指数级”的大步骤。 在机器学习中,请始终尝试理解数据中存在三个子集:训练数据、交叉验证数据和测试数据。训练集用于针对 rbf_sigma 和 boxconstraint 的 EACH 值优化 SVM 分类器的参数。然后使用交叉验证集来选择参数rbf_sigma和boxconstraint的最优值。最后使用测试数据来了解您的分类器的性能(分类器的效率取决于测试集)。 因此,如果您从 10000 个样本开始,您可以将数据划分为训练(50%)、交叉验证(25%)、测试(25%)。这样您将随机抽取 5000 个样本作为训练集,然后从剩余的 5000 个样本中抽取 2500 个样本作为交叉验证集,其余样本(即 2500 个)将被分离出来作为测试集。

我希望我能澄清你的疑问。顺便说一句,如果您对分类器和机器学习算法的参数优化感兴趣,我强烈建议您学习这个免费课程 -> www.ml-class.org(真的很棒)。

【讨论】:

【参考方案2】:

您需要实现一个名为crossfun 的函数(参见示例)。 函数句柄minfn 被传递给fminsearch 以最小化。 exp([rbf_sigma,boxconstraint]) 是被优化以最小化分类错误的数量。

在这个函数句柄中嵌套了许多函数: - crossval 正在使用分区 c 基于交叉验证产生分类错误 - crossfun - 使用 SVM 对数据进行分类 - fminsearch - 优化 SVM 超参数以最小化分类错误

希望对你有帮助

【讨论】:

我想知道 exp([rbf_sigma,boxconstraint]): ? 表示取向量的指数,如果rbf_sigma=2,boxconstraint=1,z = [2 1]; exp(z) = [7.3891 2.7183]

以上是关于带有交叉验证的 SVM 分类的主要内容,如果未能解决你的问题,请参考以下文章

为啥 scikit-learn SVM 分类器交叉验证这么慢?

使用 R 的 CMA Bioconductor 包时,解决 SVM 分类交叉验证中的“模型空”错误

如何通过 LIBSVM 使用 platt 缩放和交叉验证?

模型比较的交叉验证

为啥我们需要在 multiSVM 方法中进行交叉验证来进行图像分类?

为啥我的交叉验证错误分类错误率与测试数据集成功率相矛盾