[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 当选择较大的伽玛时,模型是否应该过度匹配数据以获得训练数据集中相同的异常值?
答案 0 :(得分:2)
其实我发现了同样的问题。 SVM的性能通常还取决于γ和nu的相互作用。如果在尝试调整另一个参数时修复一个参数,则学习曲线似乎甚至不是单调的。
我在训练准确度,测试准确度(heart_scale数据的5倍)及其差异上绘制了三张图像。 γ范围从10^(-4)
到10^(1)
,nu范围从10^(-3)
到10^(-1)
:
为了更清楚地观察小参数,我在γ和nu轴上实现了对数,见下图:
基本上,对于给定的120个数据,欠配合比过度拟合要明显得多。
修改强>
将epsilon值调整为1e-8
以填补上图中显示的差距:
根本没有明显的过度拟合或不合适!由于libsvm中使用的优化算法而不是“真正的”解决方案,似乎有点反直觉,因为泛化误差对参数的依赖性......