假设我有以下特征向量:
训练向量:
类别1:[ 3, 5, 4, 2, 0, 3, 2], [ 33, 50, 44, 22, 0, 33, 20]
类别2:[ 1, 2, 3, 1, 0, 0, 4], [ 11, 22, 33, 11, 0, 0, 44]
测试向量:
类别1:[ 330, 550, 440, 220, 0, 330, 200]
类别2:[ 110, 220, 333, 111, 0, 0, 444]
我使用SVM,它从训练向量中学习,然后对测试样本进行分类。
如您所见,特征向量的维度差异很大:训练集的特征值非常低,而测试集的向量值非常高。
我的问题是,SVM从这样的特征向量中学习是否会感到困惑?
当然,即使我对向量进行了缩放,差异依然存在:
例如,对类别1的特征向量应用standardScaler()之后:
训练:
[ 0.19 1.53 0.86 -0.48 -1.82 0.19 -0.48]
[ 20.39 31.85 27.80 12.99 -1.82 20.39 11.64]
测试:[ 220.45 368.63 294.54 146.35 -1.82 220.45 132.88]
这是一个现实世界的问题,我提出这个问题是因为我已经开发了一种针对我特定情况预缩放这些特征向量的方法。
所以在我使用我的预缩放方法之后,类别1的特征向量将变为:
训练:
[ 3. 5. 4. 2. 0. 3. 2.]
[ 2.75 4.16666667 3.66666667 1.83333333 0. 2.75 1.66666667]
测试:[ 2.84482759 4.74137931 3.79310345 1.89655172 0. 2.84482759 1.72413793]
这使得它们在本质上非常相似。
当standardScaler()应用于预缩放的向量时,效果看起来更好:
训练:
[ 0.6 1. 0.8 0.4 0. 0.6 0.4]
[ 0.55 0.83333333 0.73333333 0.36666667 0. 0.55 0.33333333]
测试:[ 0.56896552 0.94827586 0.75862069 0.37931034 0. 0.56896552 0.34482759]
最终的问题是我的预缩放方法是否会对SVM有任何帮助?这更是一个理论问题,任何见解都将受到欢迎。
回答:
是的,这会影响SVM的性能。看起来您的测试向量只是训练向量的缩放版本。SVM无法知道在您的情况下缩放是无关紧要的(除非您提供了大量不同缩放的训练向量)
对于缩放不重要的特征向量,常见的做法是将所有测试和训练向量缩放到一个共同的长度。