3 回答
TA贡献1877条经验 获得超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] 范围内。问题不在于使用哪个缩放器,而是为什么要使用缩放器。在一般情况下,除非需要,否则您不想丢弃功能。
对于大多数真实数据集来说,信息被保存在方差中的假设并不正确,并且很多时候具有较低方差的特征与低信息特征不对应。由于您的最终目标不是减少特征数量而是创建更好的分类算法,因此您不应该对中间目标进行过分优化。
TA贡献1946条经验 获得超3个赞
使用以下MinMaxScaler公式:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) X_scaled = X_std * (max - min) + min
如果您检查方差阈值的文档并查看方差公式,则可以等效地表示一组 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 的基本思想是标准化您的数据,这意味着您的数据方差会更小。
TA贡献1851条经验 获得超4个赞
基本上,低方差特征意味着缺乏信息的特征。也就是说,如果一个特征的方差接近于零,则接近于取一个常数值。但是,每个特征可能代表不同的数量,因此它的方差是不同的。
例如,age将范围从 0 到 100 以及number_of_childs范围从 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)']
在这种情况下,一个好的第一步是使数据居中。通过这样做,可以消除其中的噪音。
import pandas as pd
X = pd.DataFrame(data['data'], columns=data.feature_names)
X = X - X.mean()
添加回答
举报
