我尝试使用 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 FAQ 说这是“对偶 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,这意味着参数似乎设置正确。但我想知道极大的“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)));