LibSVM 一类分类 nu 参数不是异常值的一小部分吗?

Posted

技术标签:

【中文标题】LibSVM 一类分类 nu 参数不是异常值的一小部分吗?【英文标题】:LibSVM one class classification nu parameter is not a fraction of outliers? 【发布时间】:2014-03-16 17:23:04 【问题描述】:

如果我错了,请纠正我,但一类 SVM 理论指出,nu 参数是训练数据集中异常值的上限 (UB) 和 SV 数量的下限 (LB)。假设我使用的是 RBF 高斯核,那么通过 nu 参数的思想,无论我选择什么 gamma 值,模型都应该能够产生结果,使得参数 nu 是训练中异常值的 UB数据集?但是,这不是我通过在 Matlab 中使用 LibSVM 尝试一些简单示例所观察到的:

[heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');
ind_good = (heart_scale_label==1);
heart_scale_label = heart_scale_label(ind_good);
heart_scale_inst = heart_scale_inst(ind_good);
train_data = heart_scale_inst;
train_label = heart_scale_label;
gamma= 0.01;
nu=0.01;
model = svmtrain(train_label, train_data, ['-s 2 -t 2 -n ' num2str(nu) ' -g ' num2str(gamma) ' -h 0']);
[predict_label_Tr, accuracy_Tr, dec_values_Tr] = svmpredict(train_label, train_data, model);
accuracy_Tr

使用 gamma = 0.01 我得到训练数据的准确度为 97.50 使用 gamma = 100 我得到训练数据的准确度为 42.50 Shouldn't the model overfit to the data to get the same fraction of outliers in the training dataset, when larger gamma is selected?

【问题讨论】:

【参考方案1】:

其实我也发现了同样的问题。 SVM 的性能通常还取决于 γ 和 nu 的交互作用。如果在尝试调整另一个参数的同时修复一个参数,学习曲线似乎甚至不单调。

我在训练准确度、测试准确度(heart_scale 数据上的 5 倍)及其差异上绘制了三张图像。 γ 范围从10^(-4)10^(1),nu 范围从10^(-3)10^(-1)

为了更清楚地观察小参数,我在γ和nu轴上实现了对数,见下图:

对于给定的 120 个数据,基本上欠拟合比过拟合明显得多。

编辑

将 epsilon 值调整为1e-8 以填补上图所示的空白:

根本没有明显的过拟合或欠拟合!泛化误差对参数的依赖似乎有点违反直觉,可能是由于 libsvm 中使用的优化算法而不是“真正的”解决方案......

【讨论】:

您知道为什么 SVM 会以这种方式执行吗?我注意到,当结果与 nu 参数不一致时,模型的决策值通常很小,大约为 10^-5 左右。我有一个想法,如果与决策值相比,这可能是由于优化算法的一个很大的停止标准而发生的。您是否试图弄清楚为什么 SVM 会出现这样的行为? 谢谢 MVil。你提出了一个很好的观点。使用“-e”选项,我的结果显示当两个参数都很小时没有欠拟合或过拟合。我猜这是由于 libsvm 应用的 SMO 算法。请注意,libsvm 优化非常快,因此预计会应用一些近似值。如果您使用其他东西来实现 svm(例如 scikit learn),您可以尝试比较两者的结果 感谢您抽出宝贵时间 lennon310,我认为可以将此问题标记为已回答。不幸的是,由于一些实际的实施问题,理论结果有时仍然停留在理论上。我认为这是其中一种情况。再次感谢您的帮助。 不客气。并感谢您接受我的回答。也期待更多关于 svm 的有趣发现(尽管很可能是由于软件问题)。 只是为了再次确认,我们一直在讨论可能的计算错误,我已经从 LibSVM 软件的作者那里得到了答案。他们将此问题包含在他们的常见问题解答部分中。 csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f425

以上是关于LibSVM 一类分类 nu 参数不是异常值的一小部分吗?的主要内容,如果未能解决你的问题,请参考以下文章

libsvm处理多分类的问题

一类 SVM 检测异常值

使用 LibSVM 训练一类 SVM

使用 libsvm 进行一类分类

scikit中的OCSVM:异常值的距离始终为负

Linux下libsvm的安装及简单练习