15

我正在使用 libSVM。假设我的特征值采用以下格式:

                         instance1 : f11, f12, f13, f14
                         instance2 : f21, f22, f23, f24
                         instance3 : f31, f32, f33, f34
                         instance4 : f41, f42, f43, f44
                         ..............................
                         instanceN : fN1, fN2, fN3, fN4

我认为有两种缩放可以应用。

  1. 缩放每个实例向量,使每个向量的均值和单位方差为零。

        ( (f11, f12, f13, f14) - mean((f11, f12, f13, f14) ). /std((f11, f12, f13, f14) )
    
  2. 将上述矩阵的每一列缩放到一个范围。例如 [-1, 1]

根据我对 RBF 内核 (libSVM) 的实验,我发现第二次缩放 (2) 将结果提高了约 10%。我不明白为什么(2)给了我一个改进的结果。

谁能解释我应用缩放的原因是什么以及为什么第二个选项会给我带来更好的结果?

4

2 回答 2

20

标准做法是使每个维度(或属性,或列(在您的示例中))的均值和单位方差为零。

这使 SVM 的每个维度都具有相同的量级。来自http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

缩放的主要优点是避免较大数值范围内的属性支配较小数值范围内的属性。另一个优点是避免了计算过程中的数值困难。因为核值通常取决于特征向量的内积,例如线性核和多项式核,较大的属性值可能会导致数值问题。我们建议将每个属性线性缩放到 [-1,+1] 或 [0,1] 的范围内。

于 2013-03-15T20:36:20.333 回答
4

我相信这很大程度上取决于您的原始数据。

如果您的原始数据在某些列中有一些极值,那么我认为您在线性缩放时会丢失一些定义,例如在 [-1,1] 范围内。

假设您有一列,其中 90% 的值介于 100-500 之间,其余 10% 的值低至 -2000 和高至 +2500。

如果您线性缩放此数据,那么您将拥有:

-2000 -> -1 ## <- The min in your scaled data
+2500 -> +1 ## <- The max in your scaled data

 100 -> -0.06666666666666665 
 234 -> -0.007111111111111068
 500 ->  0.11111111111111116

您可能会争辩说,与原始数据相比,缩放数据中最初 100 和 500 之间的可辨别性更小。

最后,我相信这很大程度上取决于您的数据的具体情况,并且我相信 10% 的性能提升是非常巧合的,您肯定不会在您尝试两种缩放方法的每个数据集上看到如此巨大的差异。

同时,在另一个答案中列出的链接中的论文中,您可以清楚地看到作者建议对数据进行线性缩放。

我希望有人觉得这很有用!

于 2016-09-07T18:33:36.950 回答