python - 在删除低方差之前对数据进行归一化,会出错

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

我正在使用 scikit-学习函数 normalizeVarianceThreshold

似乎如果我使用 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)?

最佳答案

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

通常,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] 范围内。问题不是使用哪个缩放器,而是为什么要使用缩放器。在一般情况下,除非需要,否则您不想丢弃功能。

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

关于python - 在删除低方差之前对数据进行归一化,会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61159209/

相关文章:

python - 量化文件更改

python - appJar - ListBox/OptionBox 小部件在选择时调用函数

python - 从椭圆生成数组

python - 使用 xgboost 绘制特征重要性

machine-learning - 使用匹配分数来确定正确的特征(机器学习)

python - 函数参数中的列表理解

python - 如何返回标签的原始值

python - pandas_ml 中的 cross_validation 问题

python - 使用python,如何计算图像中具有指定尺寸的对象的面积

python - 使用mutual_info回归进行特征选择时的 reshape 错误