支持向量机如何处理容易混淆的特征向量?
How does Support Vector Machine deal with confusing feature vectors?
假设我有以下特征向量:
训练向量:
Class 1:
[ 3, 5, 4, 2, 0, 3, 2],
[ 33, 50, 44, 22, 0, 33, 20]
Class 2:
[ 1, 2, 3, 1, 0, 0, 4],
[ 11, 22, 33, 11, 0, 0, 44]
测试向量:
Class 1:
[ 330, 550, 440, 220, 0, 330, 200]
Class 2:
[ 110, 220, 333, 111, 0, 0, 444]
我正在使用 SVM,它从训练向量中学习,然后对测试样本进行分类。
如您所见,特征向量具有非常不同的维度:训练集特征是非常低值的数字,而测试集向量是非常高值的数字。
我的问题是 SVM 从这样的特征向量中学习是否令人困惑?
当然,当我进行矢量缩放时,差异仍然存在:
例如,在 Class 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]
基本上,这是一个现实世界的问题,我问这个问题是因为我已经开发出一种方法来针对我的特定情况预先缩放这些特征向量。
所以在我使用预缩放方法后,Class 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 无法知道缩放与您的情况无关(除非您向它展示大量不同缩放的训练向量)
对于缩放无关的特征向量,一种常见的做法是将所有测试和训练向量缩放到一个共同的长度。
假设我有以下特征向量:
训练向量:
Class 1: [ 3, 5, 4, 2, 0, 3, 2], [ 33, 50, 44, 22, 0, 33, 20]
Class 2: [ 1, 2, 3, 1, 0, 0, 4], [ 11, 22, 33, 11, 0, 0, 44]
测试向量:
Class 1: [ 330, 550, 440, 220, 0, 330, 200]
Class 2: [ 110, 220, 333, 111, 0, 0, 444]
我正在使用 SVM,它从训练向量中学习,然后对测试样本进行分类。
如您所见,特征向量具有非常不同的维度:训练集特征是非常低值的数字,而测试集向量是非常高值的数字。
我的问题是 SVM 从这样的特征向量中学习是否令人困惑?
当然,当我进行矢量缩放时,差异仍然存在:
例如,在 Class 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]
基本上,这是一个现实世界的问题,我问这个问题是因为我已经开发出一种方法来针对我的特定情况预先缩放这些特征向量。
所以在我使用预缩放方法后,Class 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 无法知道缩放与您的情况无关(除非您向它展示大量不同缩放的训练向量)
对于缩放无关的特征向量,一种常见的做法是将所有测试和训练向量缩放到一个共同的长度。