如果我错了请纠正我,根据单类SVM的理论,nu参数是训练数据集中异常值的上限(UB)和支持向量(SV)数量的下限(LB)。假设我使用的是RBF高斯核,那么根据nu参数的概念,无论我选择什么样的gamma值,模型都应该能够产生结果,使得nu参数是训练数据集中异常值的上限?然而,我在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。选择更大的gamma值时,模型不应该过度拟合数据以获得训练数据集中相同比例的异常值吗?
回答:
实际上我发现了同样的问题。SVM的性能通常也取决于γ和nu的相互作用。如果固定一个参数而尝试调整另一个,学习曲线似乎甚至不是单调的。
我绘制了三张图,分别是训练准确率、测试准确率(在heart_scale数据上进行5折交叉验证)和它们的差异。γ的范围从10^(-4)
到10^(1)
,nu的范围从10^(-3)
到10^(-1)
:
为了更清楚地观察小参数的影响,我对γ和nu轴进行了对数变换,参见下图:
基本上,在给定的120个数据中,欠拟合比过拟合更为明显。
编辑
将epsilon值调整为1e-8
以填补上图中显示的差距:
完全没有明显的过拟合或欠拟合!这似乎有点违反直觉,因为泛化误差对参数的依赖性,可能是因为libsvm中使用的优化算法而不是“真实”的解决方案…