python方差特征选择_特征选择-Filter过滤法(方差)

3.1 Filter过滤法

过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法。它是根据各种统计检验中的分数以及相关

性的各项指标来选择特征。

3.1.1 方差过滤

3.1.1.1 VarianceThreshold

这是通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差

异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。所以无

论接下来的特征工程要做什么,都要优先消除方差为0的特征。VarianceThreshold有重要参数threshold,表示方

差的阈值,表示舍弃所有方差小于threshold的特征,不填默认为0,即删除所有的记录都相同的特征。

import pandas as pd

data = pd.read_csv("digit recognizor.csv")

X = data.iloc[:,1:]

y = data.iloc[:,0]

from sklearn.feature_selection import VarianceThreshold

selector = VarianceThreshold() #实例化,不填参数默认方差为0

X_var0 = selector.fit_transform(X) #获取删除不合格特征之后的新特征矩阵

#也可以直接写成 X = VairanceThreshold().fit_transform(X)

X_var0.shape

import numpy as np

X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)

当特征是二分类时,特征的取值就是伯努利随机变量,这些变量的方差可以计算为:

p*(1-p)

#若特征是伯努利随机变量,假设p=0.8,即二分类特征中某种分类占到80%以上的时候删除特征

X_bvar = VarianceThreshold(.8 * (1 - .8)).fit_transform(X)

X_bvar.shape

3.1.1.2 方差过滤对模型的影响

我们这样做了以后,对模型效果会有怎样的影响呢?在这里,我为大家准备了KNN和随机森林分别在方差过滤前和

方差过滤后运行的效果和运行时间的对比。KNN是K近邻算法中的分类算法,其原理非常简单,是利用每个样本到

其他样本点的距离来判断每个样本点的相似度,然后对样本进行分类。KNN必须遍历每个特征和每个样本,因而特

征越多,KNN的计算也就会越缓慢。由于这一段代码对比运行时间过长,所以我为大家贴出了代码和结果。

1. 导入模块并准备数据

#KNN vs 随机森林在不同方差过滤效果下的对比

from sklearn.ensemble import RandomForestClassifier as RFC

from sklearn.neighbors import KNeighborsClassifier as KNN

from sklearn.model_selection import cross_val_score

import numpy as np

X = data.iloc[:,1:]

y = data.iloc[:,0]

X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)

我们从模块neighbors导入KNeighborsClassfier缩写为KNN,导入随机森林缩写为RFC,然后导入交叉验证模块和

numpy。其中未过滤的数据是X和y,使用中位数过滤后的数据是X_fsvar,都是我们之前已经运行过的代码。

2. KNN方差过滤前

#======【TIME WARNING:35mins +】======#

cross_val_score(KNN(),X,y,cv=5).mean()

#python中的魔法命令,可以直接使用%%timeit来计算运行这个cell中的代码所需的时间

#为了计算所需的时间,需要将这个cell中的代码运行很多次(通常是7次)后求平均值,因此运行%%timeit的时间会

#远远超过cell中的代码单独运行的时间

#======【TIME WARNING:4 hours】======#

%%timeit

cross_val_score(KNN(),X,y,cv=5).mean()

3. KNN方差过滤后

#======【TIME WARNING:20 mins+】======#

cross_val_score(KNN(),X_fsvar,y,cv=5).mean()

#======【TIME WARNING:2 hours】======#

%%timeit

cross_val_score(KNN(),X,y,cv=5).mean()

可以看出,对于KNN,

过滤后的效果十分明显:准确率稍有提升,但平均运行时间减少了10分钟,特征选择过后算

法的效率上升了1/3。那随机森林又如何呢?

4. 随机森林方差过滤前

cross_val_score(RFC(n_estimators=10,random_state=0),X,y,cv=5).mean()

5. 随机森林方差过滤后

cross_val_score(RFC(n_estimators=10,random_state=0),X_fsvar,y,cv=5).mean()

首先可以观察到的是,随机森林的准确率略逊于KNN,但运行时间却连KNN的1%都不到,只需要十几秒钟。其

次,方差过滤后,随机森林的准确率也微弱上升,但运行时间却几乎是没什么变化,依然是11秒钟。

为什么随机森林运行如此之快?为什么方差过滤对随机森林没很大的有影响?这是由于两种算法的原理中涉及到的

计算量不同。最近邻算法KNN,单棵决策树,支持向量机SVM,神经网络,回归算法,都需要遍历特征或升维来进

行运算,所以他们本身的运算量就很大,需要的时间就很长,因此方差过滤这样的特征选择对他们来说就尤为重

要。但对于不需要遍历特征的算法,比如随机森林,它随机选取特征进行分枝,本身运算就非常快速,因此特征选

择对它来说效果平平。这其实很容易理解,无论过滤法如何降低特征的数量,随机森林也只会选取固定数量的特征

来建模;而最近邻算法就不同了,特征越少,距离计算的维度就越少,模型明显会随着特征的减少变得轻量。因

此,过滤法的主要对象是:需要遍历特征或升维的算法们,而过滤法的主要目的是:在维持算法表现的前提下,帮

助算法们降低计算成本。

思考:过滤法对随机森林无效,却对树模型有效?

从算法原理上来说,传统决策树需要遍历所有特征,计算不纯度后进行分枝,而随机森林却是随机选择特征进

行计算和分枝,因此随机森林的运算更快,过滤法对随机森林无用,对决策树却有用

在sklearn中,决策树和随机森林都是随机选择特征进行分枝(不记得的小伙伴可以去复习第一章:决策树,

参数random_state),但决策树在建模过程中随机抽取的特征数目却远远超过随机森林当中每棵树随机抽取

的特征数目(比如说对于这个780维的数据,随机森林每棵树只会抽取10~20个特征,而决策树可能会抽取

300~400个特征),因此,过滤法对随机森林无用,却对决策树有用

也因此,在sklearn中,随机森林中的每棵树都比单独的一棵决策树简单得多,高维数据下的随机森林的计算

比决策树快很多。

总结:

阈值很小

被过滤掉得特征比较少

模型表现    不会有太大影响

运行时间 可能降低模型的运行时间 基于方差很小的特征有多少  当方差很小的特征不多时对模型没有太大影响

阈值比较大

被过滤掉的特征有很多

模型表现

可能变更好,代表被滤掉的特征大部分是噪音

也可能变糟糕,代表被滤掉的特征中很多都是有效特征

运行时间

定能够降低模型的运行时间

算法在遍历特征时的计算越复杂,运行时间下降得越多

在我们的对比当中,我们使用的方差阈值是特征方差的中位数,因此属于阈值比较大,过滤掉的特征比较多的情

况。我们可以观察到,无论是KNN还是随机森林,在过滤掉一半特征之后,模型的精确度都上升了。这说明被我们

过滤掉的特征在当前随机模式(random_state = 0)下大部分是噪音。那我们就可以保留这个去掉了一半特征的数

据,来为之后的特征选择做准备。当然,如果过滤之后模型的效果反而变差了,我们就可以认为,被我们过滤掉的

特征中有很多都有有效特征,那我们就放弃过滤,使用其他手段来进行特征选择

3.1.1.3 选取超参数threshold

我们怎样知道,方差过滤掉的到底时噪音还是有效特征呢?过滤后模型到底会变好还是会变坏呢?答案是:每个数

据集不一样,只能自己去尝试。这里的方差阈值,其实相当于是一个超参数,要选定最优的超参数,我们可以画学

习曲线,找模型效果最好的点。但现实中,我们往往不会这样去做,因为这样会耗费大量的时间。我们只会使用阈

值为0或者阈值很小的方差过滤,来为我们优先消除一些明显用不到的特征,然后我们会选择更优的特征选择方法

继续削减特征数量

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的SelectKBest是一个特征选择的方法,可以通过特征与目标变量之间的关联度进行排序,然后选择前k个相关度最高的特征。它使用的是统计学中的一些方法,例如卡方检验、F检验等。这个方法可以用于数值型和分类型数据。 在使用SelectKBest时,首先需要指定要使用的评分函数,例如f_classif(用于分类问题)或f_regression(用于回归问题)。然后,可以通过fit_transform方法来选择最佳的k个特征。 以下是一个使用SelectKBest的示例代码: ```python from sklearn.feature_selection import SelectKBest, f_classif from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target # 选择最好的4个特征 selector = SelectKBest(f_classif, k=4) X_new = selector.fit_transform(X, y) print(X.shape) # (150, 4) print(X_new.shape) # (150, 4) ``` 在此示例中,我们使用了Iris数据集,将数据集中的4个特征缩减为最佳的4个特征。注意,SelectKBest仅对特征进行筛选,不对数据进行预处理或标准化。 ### 回答2: Python中的高相关特征过滤是一种特征选择技术,它基于统计检验来评估特征与目标变量之间的相关性,并选择与目标变量高度相关的k个特征作为最终的特征子集。 在使用高相关特征过滤进行特征选择时,需要先对特征进行预处理,如标准化或归一化,以确保各个特征具有相同的尺度。然后,使用SelectKBest类从特征集中选择k个最佳特征。此类基于统计检验方法(例如卡方检验、F检验或互信息)计算每个特征与目标变量之间的相关性,然后根据相关性进行特征选择。 使用SelectKBest的过程如下: 1. 导入必要的库和数据集。 2. 对特征进行预处理,如标准化或归一化。 3. 实例化SelectKBest类,并选择所需的检验方法(例如卡方检验、F检验或互信息)。 4. 使用fit方法计算每个特征与目标变量之间的相关性得分。 5. 使用get_support方法获取选择的特征索引。 6. 根据选择的特征索引从原始特征集中提取最佳特征子集。 高相关特征过滤可以帮助我们从原始特征集中选择最具有预测能力的特征,减少无关特征的影响,提高模型的性能和效率。但需要注意的是,选择的特征数量k应根据具体问题和数据集进行调整,避免选择过多或过少的特征。 总而言之,Python中的高相关特征过滤(SelectKBest)是一种基于统计检验的特征选择技术,可用于从原始特征集中选择与目标变量高度相关的k个最佳特征子集。 ### 回答3: Python中的SelectKBest是一个特征选择方法。它通过评估每个特征与目标变量之间的相关性来选择与目标变量最相关的K个特征。在使用SelectKBest之前,我们需要先定义一个相关性评估方法,比如卡方检验、方差分析等。然后,我们可以使用SelectKBest的fit方法来拟合特征和目标变量,并通过调用transform方法来选择最相关的K个特征。 使用SelectKBest的好处是可以减少特征数量,从而减少模型的复杂度,提高模型训练的效率和预测的准确性。此外,由于只选择了与目标变量最相关的特征,还可以降低特征选择过程中出现的过拟合风险。 在使用SelectKBest时,我们需要注意选择合适的K值。一个较小的K值可能会导致遗漏了一些相关特征,而一个较大的K值可能会引入一些无关特征,降低模型的预测性能。因此,选择合适的K值需要结合具体问题和数据集进行实验和调优。 总而言之,SelectKBest是一个用于特征选择的方法,它通过评估每个特征与目标变量之间的相关性来选择最相关的K个特征。在实际应用中,根据具体问题和数据集的特点,我们可以使用SelectKBest来提取与目标变量相关性最高的特征,从而提高模型训练的效率和预测的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值