用于规范化sklearn SVM输入的正确功能

时间:2015-06-18 14:51:44

标签: python machine-learning statistics scikit-learn svm

我发现了几个与此相关的问题,但没有人解决我的疑虑。 特别是,this问题的两个答案让我更加困惑。

我正在基于一组特征训练线性SVM - 由图像产生的卷积神经网络特征。例如,我有一个3500x4096 context.Entry(emp).GetDatabaseValues(); var id = emp.Id; 矩阵,其中包含列上行和特征的示例,像往常一样。

我想知道在喂SVM之前如何正确地标准化/规范化这个矩阵。我看到两种方式(使用sklearn):

  1. 标准化功能。它导致具有0均值和单一标准的特征

    X
  2. 规范化功能。它导致具有单一规范的特征。

    X = sklearn.preprocessing.scale(X)
    
  3. 我的结果在标准化(准确度为76%)方面明显优于标准化(68%准确度)。

    它是完全依赖数据集的选择吗?或者如何在这两种技术之间做出选择?

1 个答案:

答案 0 :(得分:39)

您应该根据数据的含义选择缩放方案。 There are different ways of scaling,以及您使用哪一个取决于数据。每个方案都将不同特征的值带入可比较的范围,但每个方案都会保留不同类型的信息(并扭曲其他特征)。尽管有一些合理的解释为什么有些缩放方案更适合特定情况,只是尝试这些不同的方法(就像你使用标准缩放和规范化一样)并使用效果更好的方法(只要您交叉验证或确保您的绩效衡量标准一般且准确)。

StandardScaler
这是sklearn.preprocessing.scale(X)使用的内容。它假设您的要素是正态分布的(每个要素具有不同的均值和标准差),并对它们进行缩放,使得每个要素的高斯分布现在都以0为中心,且它的标准差为1。 / p>

它通过计算每个要素的平均值和stdev来实现,然后将要素的每个实际值转换为z-score:距离平均值有多少stdev是这个值? Z =(值均值)/ STDEV

这通常很有效,但如果您的情况完全错误,那么这可能不适合您。实际上,在很多情况下,正态性假设不是保持,但分布有点接近,这个方案仍然很好。但是,如果数据完全远离常态,例如高度偏斜的胖尾分布(如幂律),则该方案不会产生良好的结果。

Normalizer
这是sklearn.preprocessing.normalize(X, axis=0)使用的内容。它将给定数据点的所有特征值视为向量,并通过将其除以其大小来对该向量进行归一化。例如,假设您有3个功能。特定点的值为[x1, x2, x3]。如果您使用默认的'l2'规范化,则将每个值除以sqrt(x1^2 + x2^2 + x3^2)。如果您正在使用'l1'规范化,则将每个归为x1+x2+x3。这确保了每个特征的值在相似的范围内,因为每个特征向量是单位向量。如果某个点的特征值很大,则幅度也会很大,并且除以大数。如果它们很小,则将它们除以一小部分。

原因是您可以将数据视为n维空间中的点,其中n是要素的数量。每个特征都是一个轴。归一化将每个点拉回原点,使其距离原点仅1个单位。基本上你将空间折叠成单元超立方体。每个点(从原点到数据点)的矢量之间的角度保持不变。

这与文本数据一起使用很多,因为它在很大程度上是直观的:如果每个特征都是不同单词的计数,'l1'归一化基本上将这些计数转换为频率(你&#39;重新除以单词总数)。这是有道理的。如果您正在使用'l2'归一化,则当您对两者进行归一化时,两个向量之间的角度(称为余弦距离或相似度)将保持不变,并且此距离更接近含义< / em>距离,因为它对应于单词之间的频率比率,并且不受每个向量所代表的文本长度的影响。

如果保留点之间的余弦距离关系类型对您的数据更有意义,或者如果规范化对应于自然缩放(如取频率而不是计数),那么这个更合适。 /强>

MinMaxScaler
你可以像sklearn.preprocessing.MinMaxScaler().fit_transform(X)一样使用这个。对于每个功能,这将查看最小值和最大值。这是此功能的范围。然后,它会将此缩小或拉伸到每个要素的相同范围(默认值为0到1)。

通过将每个值转换为(value-feature_min)/(feature_max - feature_min)来实现此目的。它基本上是我所处的范围的百分比?请记住,范围仅由特征的最小值和最大值确定。对于所有这些关注,所有值可能会在10,11左右左右悬挂,并且有一个异常值为900.无所谓,您的范围是10到900.您可以看到某些情况是可取的,而在其他情况下这将是有问题的,具体取决于具体的问题和数据。

在StandardScaler可能无法正常工作的某些情况下,此方案的效果会更好。例如,如果功能的标准偏差非常小,StandardScaler对不同功能的标准差之间的微小变化非常敏感,但 MinMaxScaler非常强大。此外,对于具有高度偏斜分布的特征,,或者每个特征都有很多零的稀疏情况,使分布偏离高斯分布,MinMaxScaler是更好的选择。