Python 在删除低方差之前对数据进行规范化,否则会产生错误

Python 在删除低方差之前对数据进行规范化,否则会产生错误,python,scikit-learn,feature-selection,feature-scaling,Python,Scikit Learn,Feature Selection,Feature Scaling,我正在测试一个iris数据集,它可以使用sklearn中的load_iris函数加载。带有scikit学习函数的数据集可以正常化和方差阈值 看起来,如果我使用MinMaxScaler,然后运行VarianceThreshold,那么就没有功能了 缩放前: Column: sepal length (cm) Mean: 5.843333333333334 var = 0.6811222222222223 var/mean: 0.11656398554858338 Column: s

我正在测试一个iris数据集,它可以使用sklearn中的load_iris函数加载。带有scikit学习函数的数据集可以正常化和方差阈值

看起来,如果我使用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

我使用VarianceThreshold作为:

我们是否应该缩放数据,例如,如果我们想删除方差较低的功能,是否应该通过MinMaxScaler来缩放数据?

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

例如,考虑作为协变量的年龄范围在0到100之间,和数为0至5的儿童。由于这两个变量的值不同,它们的方差也会不同。现在,通过缩放特征,可以将其设置为相同的单位。这样,我们就可以在相同的尺度上比较他们的信息

请注意,对于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)']
在这种情况下,最好的第一步是将数据集中。这样做可以消除噪音

MinMaxScaler使用以下公式:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
如果您检查treshold的方差并查看方差公式,则一组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的情况下,在标准化之后,两者都将被踢出

因此,是的,当您在方差阈值之前对数据进行规格化时,您总是会跳出更多的列,因为minmaxscaler的基本思想是对数据进行规格化,这意味着数据中的方差会更小。

缩放数据通常不会帮助您找到冗余功能

通常,VarianceThreshold用于删除方差等于零的特征,即不提供任何信息的常量。代码VarianceThresholdthreshold=.8*1-.8中的行将丢弃方差低于0.16的所有特性。在你的例子中,所有的特征都有低于MinMaxScaler的方差,最大的方差是花瓣宽度0.1,所以你扔掉了所有的东西。我相信您的意思是要保留贡献80%以上差异的特性,但这不是您的代码所做的。如果您在MinMaxScaler之前应用该行,那么您的所有功能都将通过

为了删除差异较小的特征,首先需要定义该特定特征的合理阈值。但在一般情况下,您不能为方差设置硬编码的任意阈值,因为对于某些特性,该值将过高,而对于其他特性,该值将过低。例如,PCA通常被用作特征选择过程。执行PCA并仅取K个第一特征向量,其中K的选择方式使得相应特征值的能量为总能量的95%甚至80%。因此,当您拥有一个包含50-100个特征的数据集时,您可以在不丢失大量信息的情况下将特征数量减少十倍

当您应用StandardScaler时,您的所有特征都将被确定和规范化,因此它们的平均值将为零,当然,除了常数外,方差为1。默认情况下,MinMaxScaler将使您的功能处于[0..1]范围内。问题不在于使用哪个scaler,而是为什么要使用scaler。通常情况下,除非需要,否则您不想丢弃特性


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

这似乎与直觉相反。为了使用VarianceThreshold,我们必须首先规范化数据。StandardScaler是更好的选择吗?通过对数据进行居中处理,可以消除偏差,即平均值或常量分量,而不是噪声。通常会进行数据规范化,因为当数据在[-1..1]范围内时,许多算法(例如SVM)的工作效果更好。对一些人来说,比如说,根本不需要决策树规范化。
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
a  b
1  0
0  0.5
0  1
a: 2/3
b: 2/3