【问题标题】:Normalize data before removing low variance, makes errors在消除低方差之前对数据进行归一化,会产生错误
【发布时间】:2020-07-24 07:39:34
【问题描述】:

我正在使用 scikit-learn 函数 normalizeVarianceThreshold 测试 iris 数据集(可以从 sklearn.datasets 加载函数 load_iris())。

如果我使用 MinMaxScaler 然后运行 ​​VarianceThreshold - 似乎没有任何功能了。

缩放前:

Column:  sepal length (cm)  Mean:  5.843333333333334  var =  0.6811222222222223  var/mean:  0.11656398554858338
Column:  sepal width (cm)  Mean:  3.0573333333333337  var =  0.1887128888888889  var/mean:  0.06172466928332606
Column:  petal length (cm)  Mean:  3.7580000000000005  var =  3.0955026666666665  var/mean:  0.8237101295015078
Column:  petal width (cm)  Mean:  1.1993333333333336  var =  0.5771328888888888  var/mean:  0.48121141374837856

缩放后 (MinMaxScaler)

Column:  sepal length (cm)  Mean:  0.42870370370370364  var =  0.052555727023319614  var/mean:  0.12259219262459005
Column:  sepal width (cm)  Mean:  0.44055555555555553  var =  0.03276265432098764  var/mean:  0.07436668067815606
Column:  petal length (cm)  Mean:  0.46745762711864397  var =  0.08892567269941587  var/mean:  0.19023258481745967
Column:  petal width (cm)  Mean:  0.4580555555555556  var =  0.10019668209876545  var/mean:  0.2187435145879658

我使用VarianceThreshold 作为:

    from sklearn.feature_selection import VarianceThreshold
    sel = VarianceThreshold(threshold=(.8 * (1 - .8)))

如果我们想删除低方差的特征,我们是否应该缩放数据(例如,通过MinMaxScaler)?

【问题讨论】:

    标签: python scikit-learn feature-selection feature-scaling


    【解决方案1】:

    缩放数据通常不会帮助您找到冗余特征。

    通常,VarianceThreshold 用于删除方差为零的特征,即不提供任何信息的常量。代码VarianceThreshold(threshold=(.8 * (1 - .8))) 中的行会丢弃所有方差低于 0.16 的特征。在你的情况下,所有特征的方差都低于这个值(在MinMaxScaler 之后,最高方差是0.1 的花瓣宽度),所以你扔掉所有东西。我相信你的意思是留下贡献超过 80% 差异的特性,但这不是你的代码所做的。如果您在 MinMaxScaler 之前应用该行,那么您的所有功能都会通过。

    为了移除低方差的特征,您首先需要定义该特定特征的合理阈值是多少。但在一般情况下,您不能为方差设置硬编码的任意阈值,因为对于某些特征,该值会太高而对于其他特征来说太低。例如,PCA 通常用作特征选择过程。一个执行 PCA 并且只取 ​​K 个第一个特征向量,其中 K 的选择方式使得相应特征值的“能量”是(比如说)总数的 95%(甚至 80%)。因此,如果您有一个包含 50-100 个特征的数据集,您可以在不丢失太多信息的情况下将特征数量减少十倍。

    当您应用StandardScaler 时,您的所有特征都将进行中心化和规范化,因此它们的均值为零,方差为 1(当然,常数除外)。 MinMaxScaler 默认情况下会将您的功能带入范围 [0..1]。问题不在于使用哪个缩放器,而是为什么要使用缩放器。一般情况下,除非需要,否则您不想丢弃功能。

    对于大多数真实数据集来说,信息保存在方差中的假设并不正确,并且很多时候具有较低方差的特征与低信息特征不对应。由于您的最终目标不是减少特征数量,而是创建更好的分类算法,因此您不应该在中间目标上过分优化。

    【讨论】:

      【解决方案2】:

      基本上,低方差特征意味着缺乏信息的特征。也就是说,如果一个特征的方差接近于零,则接近于取一个常数值。但是,每个特征可能代表不同的数量,因此它的方差是不同的。

      例如,将范围从 0 到 100 的 age 和范围从 0 到 5 的 number_of_childs 视为协变量。由于这两个变量取不同的值,它们会有不同的方差。现在,通过缩放功能将它们设置为相同的单位。这样,我们就可以在相同的尺度上比较他们的信息。

      请注意,对于 iris 数据集,所有特征都设置为相同的比例(厘米),即

      from sklearn.datasets import load_iris
      
      data = load_iris()
      print(data.features_names) 
      >>> ['sepal length (cm)',
           'sepal width (cm)',
           'petal length (cm)',
           'petal width (cm)']
      

      在这种情况下,最好的第一步是将数据居中。通过这样做,可以消除噪音

      import pandas as pd 
      
      X = pd.DataFrame(data['data'], columns=data.feature_names)
      X = X - X.mean()
      

      【讨论】:

      • 通过使数据居中,您可以消除偏差(也就是平均值或常数分量),而不是“噪声”。通常会进行数据规范化,因为当数据在 [-1..1] 左右的范围内时,许多算法(例如 SVM)工作得更好。对于某些人来说,根本不需要决策树规范化。
      【解决方案3】:

      MinMaxScaler 使用以下公式:

      X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
      X_scaled = X_std * (max - min) + min
      

      如果您检查方差阈值docs并查看方差公式,则可以等效地表示一组n个等可能值的方差,而无需直接参考均值,以所有点的平方偏差表示彼此:

      让我们比较一个包含两列和三个变量的小例子:

      a  b
      1  0
      0  1
      0  2
      

      没有缩放我们有以下差异:

      a: (0.5(1-0)^2+0.5(1-0)^2+ 0.5(0-1)^2 +0.5(0-0)^2 + 0.5(0-1)^2 + 0.5(0-1)^2 )/3 = (0.5+0.5+0.5+0.5)/3= 2/3 = 0.75
      b: 6/3 = 2
      

      MinMaxScaler 之后我们会:

      a  b
      1  0
      0  0.5
      0  1
      

      所以方差:

      a: 2/3
      b: 2/3 
      

      因此,阈值为 0.8 时,两者都会在标准化后被踢出。

      所以是的,当您在 variancethreshold 之前对数据进行标准化时,您总是会剔除更多的列,因为 minmaxscaler 的基本思想是标准化您的数据,这意味着您的数据变化会更小。

      【讨论】:

      • 这似乎很反直觉。要使用VarianceThreshold,我们必须先对数据进行规范化。 StandardScaler() 会是更好的选择吗?
      • StandardScaler 将所有方差缩放为 1。这将使方差阈值无用。缩放时必须保持方差。
      猜你喜欢
      • 2022-06-13
      • 2021-12-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多