在LibSVM中反转缩放值

时间:2013-06-21 20:50:09

标签: scale libsvm

我正在使用支持向量回归在LibSVM中进行预测。我全力以赴。然而,有一个问题在我脑海中浮现。

对于LibSVM,我首先在同一范围内扩展我的训练和测试集,然后选择最佳参数。在我运行svm-train和svm-predict之后,我以缩放格式获得测试集的预测值。我正在使用Excel并反转缩放并计算平均绝对百分比误差(MAPE)。

我非常确定LibSVM中的缩放就像从最小值中减去值然后除以特定特征的范围一样。但是,我想看看我手工缩放的值和LibSVM缩放的值是否相同。在将数据集分成两组之前,我在特征中找到最小值和最大值,然后按照我上面说的方式进行缩放。但是,LibSVM提供的训练和测试集的缩放值与我手动计算的缩放值并不完全相同。他们只是大致接近。有谁知道为什么他们不一样?

另一个问题是:如何在LibSVM中计算MAPE?

1 个答案:

答案 0 :(得分:3)

如果您检查文件 svm-scale.c ,您会发现扩展数据的公式为:

value = y_lower + (y_upper-y_lower) * (value - y_min)/(y_max-y_min);

y_lower y_upper y缩放限制

的位置

因为你可以看到缩放值没有计算出来,因为你假设“从最小值中减去值,然后除以特定功能的范围”。如果要恢复实际值,只需撤消公式。

示例:

如果您将libSVM站点中可用的许多数据集作为示例(例如:covtype dataset),并打开它,您将看到如下文件:

1 1:2596 2:51 3:3 4:258 6:510 7:221 8:232 9:148 10:6279 11:1 43:1
1 1:2590 2:56 3:2 4:212 5:-6 6:390 7:220 8:235 9:151 10:6225 11:1 43:1
2 1:2804 2:139 3:9 4:268 5:65 6:3180 7:234 8:238 9:135 10:6121 11:1 26:1
2 1:2785 2:155 3:18 4:242 5:118 6:3090 7:238 8:238 9:122 10:6211 11:1 44:1
1 1:2595 2:45 3:2 4:153 5:-1 6:391 7:220 8:234 9:150 10:6172 11:1 43:1
...

现在让我们使用它来缩放它:

./svm-scale -s covtype.libsvm.binary.range  covtype.libsvm.binary > covtype.libsvm.binary.scale

这将生成两个文件,.range文件将包含与缩放过程相关的所有信息(每列的最大值和最小值),以及作为输出的.scale文件,它将显示像:

1 1:-0.262631 2:-0.716667 3:-0.909091 4:-0.630637 5:-0.552972 6:-0.856681 7:0.740157 8:0.826772 9:0.165354 10:0.750732 11:1 12:-1 13:-1 14:-1 15:-1 16:-1 17:-1 18:-1 19:-1 20:-1 21:-1 22:-1 23:-1 24:-1 25:-1 26:-1 27:-1 28:-1 29:-1 30:-1 31:-1 32:-1 33:-1 34:-1 35:-1 36:-1 37:-1 38:-1 39:-1 40:-1 41:-1 42:-1 43:1 44:-1 45:-1 46:-1 47:-1 48:-1 49:-1 50:-1 51:-1 52:-1 53:-1 54:-1 
1 1:-0.268634 2:-0.688889 3:-0.939394 4:-0.696492 5:-0.568475 6:-0.890403 7:0.732283 8:0.850394 9:0.188976 10:0.735675 11:1 12:-1 13:-1 14:-1 15:-1 16:-1 17:-1 18:-1 19:-1 20:-1 21:-1 22:-1 23:-1 24:-1 25:-1 26:-1 27:-1 28:-1 29:-1 30:-1 31:-1 32:-1 33:-1 34:-1 35:-1 36:-1 37:-1 38:-1 39:-1 40:-1 41:-1 42:-1 43:1 44:-1 45:-1 46:-1 47:-1 48:-1 49:-1 50:-1 51:-1 52:-1 53:-1 54:-1 
2 1:-0.0545273 2:-0.227778 3:-0.727273 4:-0.616321 5:-0.385013 6:-0.106365 7:0.84252 8:0.874016 9:0.0629921 10:0.706678 11:1 12:-1 13:-1 14:-1 15:-1 16:-1 17:-1 18:-1 19:-1 20:-1 21:-1 22:-1 23:-1 24:-1 25:-1 26:1 27:-1 28:-1 29:-1 30:-1 31:-1 32:-1 33:-1 34:-1 35:-1 36:-1 37:-1 38:-1 39:-1 40:-1 41:-1 42:-1 43:-1 44:-1 45:-1 46:-1 47:-1 48:-1 49:-1 50:-1 51:-1 52:-1 53:-1 54:-1 
2 1:-0.0735368 2:-0.138889 3:-0.454545 4:-0.653543 5:-0.248062 6:-0.131657 7:0.874016 8:0.874016 9:-0.0393701 10:0.731772 11:1 12:-1 13:-1 14:-1 15:-1 16:-1 17:-1 18:-1 19:-1 20:-1 21:-1 22:-1 23:-1 24:-1 25:-1 26:-1 27:-1 28:-1 29:-1 30:-1 31:-1 32:-1 33:-1 34:-1 35:-1 36:-1 37:-1 38:-1 39:-1 40:-1 41:-1 42:-1 43:-1 44:1 45:-1 46:-1 47:-1 48:-1 49:-1 50:-1 51:-1 52:-1 53:-1 54:-1 
1 1:-0.263632 2:-0.75 3:-0.939394 4:-0.780959 5:-0.555556 6:-0.890122 7:0.732283 8:0.84252 9:0.181102 10:0.720898 11:1 12:-1 13:-1 14:-1 15:-1 16:-1 17:-1 18:-1 19:-1 20:-1 21:-1 22:-1 23:-1 24:-1 25:-1 26:-1 27:-1 28:-1 29:-1 30:-1 31:-1 32:-1 33:-1 34:-1 35:-1 36:-1 37:-1 38:-1 39:-1 40:-1 41:-1 42:-1 43:1 44:-1 45:-1 46:-1 47:-1 48:-1 49:-1 50:-1 51:-1 52:-1 53:-1 54:-1 
...

.range文件如下所示:

x
-1 1
1 1859 3858
2 0 360
3 0 66
4 0 1397
...

因此,考虑到y_lower = -1y_upper = 1,您可以验证转化的第一个元素2596

value = -1 + (1 - (-1)) * (2596 - 1859) / (3858 - 1859) = -0.26263131565782893

这是预期值:)

提示

通常,您使用svm-scale缩放训练集,获取模型(使用k折交叉验证),最后使用获得的值(y_maxy_min执行测试缩放数据从培训。您可以在文件tools/easy.py中看到该过程。