我试图训练&使用epsilon SVR交叉验证8616个样本的一组数据。 在这些数据集中,我将4368用于测试,4248用于CV。 内核类型= RBF内核。 Libsvm提供如下所示的结果。
optimization finished, #iter = 502363
nu = 0.689607
obj = -6383530527604706.000000, rho = 2884789.960212
nSV = 3023, nBSV = 3004
这是通过设置
得到的结果-s 3 -t 2 -c 2^28 -g 2^-13 -p 2^12
(a)“nu”是什么意思?有时我得到nu = 0.99xx的不同参数。
(b)似乎“obj”出乎意料地大。这听起来不错吗? Libsvm常见问题解答称这是“双SVM问题的最佳客观价值”。这是否意味着这是f(alpha)的最小值?
(c)“rho”也很大。这是偏见词,b。数据集标签(y)由82672到286026之间的值组成。所以我想这是合理的,我是对的吗?
对于训练集,
Mean squared error = 1.26991e+008 (regression)
Squared correlation coefficient = 0.881112 (regression)
对于交叉验证集,
Mean squared error = 1.38909e+008 (regression)
Squared correlation coefficient = 0.883144 (regression)
使用选定的参数,我产生了以下结果
kernel_type=2 (best c:2^28=2.68435e+008, g:2^-13=0.00012207, e:2^12=4096)
NRMS: 0.345139, best_gap:0.00199433
Mean Absolute Percent Error (MAPE): 5.39%
Mean Absolute Error (MAE): 8956.12 MWh
Daily Peak MAPE: 5.30%
CV集MAPE较低(5.39%)。使用Bias-Variance测试,列车集MAPE和CV集MAPE之间的差异仅为0.00199433,这意味着param似乎设置正确。但我想知道极大的“obj”,“rho”值是否正确....
我是SVR的新手,如果我的解释或验证方法不正确/不充分,请纠正我。
计算MAPE的方法
train_model = svmtrain(train_label, train_data, cmd);
[result_label, train_accuracy, train_dec_values] = svmpredict(train_label, train_data, train_model);
train_err = train_label-result_label;
train_errpct = abs(train_err)./train_label*100;
train_MAPE = mean(train_errpct(~isinf(train_errpct)));
答案 0 :(得分:0)
目标和rho值很高,因为(很可能)数据没有缩放。强烈建议使用缩放以避免溢出;溢出风险还取决于内核的类型。顺便说一下,在扩展训练数据时,不要忘记缩放测试数据,这最容易通过首先缩放所有数据,然后将它们分成训练和测试集来实现。