机器学习-自动筛选特征

选择属性(weka的书中把特征翻译成属性,那么这里的属性其实也就是指特征了)
选择属性的目的:
就是通过搜索数据中所有可能的属性组合,以找到预测效果最好的属性子集。
也就是说假设属性目前有6个,准确率为80%,假设只取5个属性(这就是子集),反而准确率却变为90%

选择属性和PCA降维有啥不同?
选择属性和PCA的目的都是一样,都是为了降低特征的数量,减少计算量
但是PCA是将原始特征进行一个映射压缩,这使得原始的特征面目全非,生成新的特征。也就是说原本20个特征,PCA以后用
全新的5个特征(这5个特征我已经不知道是代表原来的啥了)来表示。但有时这5个特征并不能完全代替这原本的20个特征,而是容纳了98%的信息,这也是能接收的范围。

在weka Explorer页面中,有Select attributes 选择属性的菜单
进入Select attributes以后
有Attribute Evaluator(属性评估器),Search Method(搜索方法)两个选项,这两项需要组合使用

属性评估器
子集评估器
CfsSubsetEval 评估每个属性的预测能力以及其相互之间的冗余度,倾向于选择与类别属性相关度搞,但相互直接相关度低的属性
WrapperSubsetEval 使用一个分类器(可以是任何分类算法)来评估属性集,它对每一个子集采用交叉验证来估计

单个属性评估器
ReliefFAttributeEval 是基于实例的评估器,它随机抽取实例样本,并检查具有相同和不同类别的邻近实例。它可运行在
离散型类别和连续型类别的数据上,参数包括指定抽样实例的数量,要检查的邻近实例的数量,是否对最近邻的距离加权,以及控制
权重如何根据距离衰减的指数函数

InfoGainAttributeEval 评估器通过测量类别对应的属性信息增益来评估属性
GainRatioAttributeEval 评估器通过测量相应类别的增益率来评估属性
SysmmtricalUncertAttributeEval 评估器通过测量相应类别对称的不确定性来评估属性
OneRAttributeEval 评估器使用见得OneR分类器采用的准确性度量。

搜索方法
搜索方法遍历属性空间以搜索好的子集,然后使用评估器来衡量其质量。
BestFirst 搜索方法执行带回溯的贪婪爬山法。
GreedyStepwise 搜索方法贪婪搜索属性的子集空间

Ranker 不是一个搜索属性子集的方法,而是对单个属性进行排名

在sklearn中如何自动筛选特征
有两种方式,sklearn中都有相应的模块:
1.sklearn.feature_selection
2.sklearn.ensemble(集成模块,对于决策树模型中都会有一个属性feature_importances_,就可通过这个排序后筛选特征)

sklearn.feature_selection

#coding=utf-8
'''
Created on 2018-3-1

'''
# RFE和RFECV
# 作用:通过筛选子集+分类器进行特征筛选
# 参数详情请参考
# http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html#sklearn.feature_selection.RFE
# http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFECV.html#sklearn.feature_selection.RFECV
# 这个方法有个缺点,就是当数据量很大但内存的很小的时候并没有分片训练的功能

from sklearn import datasets
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

dataset =datasets.load_iris() # 加载数据
print dataset.data.shape
# (150, 4)
model = LogisticRegression() # 构建分类器
rfe = RFE(model)
rfe = rfe.fit(dataset.data,dataset.target)
print(rfe.n_features_) #选出来特征的数量
# 2
print(rfe.support_) #查看哪些特征是被选择的
# [False  True False  True],结果说明第2,4个特征被选择
print(rfe.ranking_) #查看特征排名
# [3 1 2 1],结果说明特征排名分别为3,1,2,1,其中有两个并列第一
print rfe.get_support(True)
# [1 3],返回筛选出来的特征的下标

from sklearn.feature_selection import RFECV
# 使用RFECV,和RFE相比,这里分类器的验证结果为交叉验证
rfecv = RFECV(model) # limit number of variables to three
rfecv = rfecv.fit(dataset.data,dataset.target)
print(rfecv.n_features_) #选出来特征的数量
# 3
print(rfecv.support_) #查看哪些特征是被选择的
# [False  True  True  True],结果说明第2,3,4个特征被选择
print(rfecv.ranking_) #查看特征排名
# [2 1 1 1],结果说明特征排名分别为2,1,1,1,其中有三个并列第一


# SelectPercentile
# 作用:通过计算每个特征的得分值筛选特征,得分越高,特征就越好
# 参数详情请参考
# http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectPercentile.html#sklearn.feature_selection.SelectPercentile

from sklearn import datasets
from sklearn.feature_selection import SelectPercentile, f_classif
import numpy as np

dataset =datasets.load_iris() # 加载数据
print dataset.data.shape
# (150, 4)
# f_classif为内置的计算函数函数,有多种计算函数供选择;保持10%最有意义的特征
selectorPer = SelectPercentile(f_classif, percentile=10)
selectorPer = selectorPer.fit(dataset.data,dataset.target)
print(selectorPer.scores_) #特征的得分值
# [  119.26450218    47.3644614   1179.0343277    959.32440573]
print(selectorPer.pvalues_) #特征的p-value值
# [  1.66966919e-31   1.32791652e-16   3.05197580e-91   4.37695696e-85],结果说明第2,4个特征被选择
scores = -np.log10(selectorPer.pvalues_)
print scores
# [ 30.77736957  15.87682923  90.51541891  84.35882772]
scores /= scores.max()
print scores
# [ 0.3400235   0.17540469  1.          0.93198296]


# SelectKBest
# 作用:根据k最高分选择特征

from sklearn import datasets
from sklearn.feature_selection import SelectKBest

dataset =datasets.load_iris() # 加载数据
print dataset.data.shape
# (150, 4)
# f_classif为内置的计算函数函数,有多种计算函数供选择;选择前k个最高得分特征
selectKB = SelectKBest(f_classif,k=2)
selectKB = selectKB.fit(dataset.data,dataset.target)
print(selectKB.scores_) #特征的得分值
# [  119.26450218    47.3644614   1179.0343277    959.32440573]
print(selectKB.pvalues_) #特征的得分值
# [  1.66966919e-31   1.32791652e-16   3.05197580e-91   4.37695696e-85]
print(selectKB.get_support()) #特征的得分值
# [False False  True  True]
print selectKB.get_support(True)
# [2 3],返回筛选出来的特征的下标,但是有个缺点就是按得分值进行排序没有排序

sklearn.ensemble

#coding=utf-8
'''
Created on 2018-3-1

'''

from sklearn import datasets
from sklearn import metrics
from sklearn.ensemble import ExtraTreesClassifier

dataset =datasets.load_iris() # 加载数据
model = ExtraTreesClassifier() # 生成决策树
model.fit(dataset.data,dataset.target)
print(model.feature_importances_) #获取关键特征
# [ 0.13826514  0.09158596  0.28037233  0.48977657]
### 机器学习中的特征选择方法 在构建有效的机器学习模型过程中,特征选择扮演着至关重要的角色。通过精心挑选最能代表数据本质的特征,可以显著提高模型的表现力并减少过拟合的风险。 #### 基于过滤的方法 这类技术依赖统计测试来衡量输入变量与目标变量之间的关系强度。常见的度量标准包括卡方检验、互信息以及皮尔逊相关系数等。这种方法独立于所使用的具体学习算法,因此具有较高的通用性灵活性[^2]。 #### 包裹法(Wrapper Methods) 包裹法直接利用预测模型来进行评估,通常会迭代地增加或移除某些特征组合,并观察这样做对于最终性能指标的影响。递归特征消除(RFE)及其变体RFECV就是典型的例子;前者允许用户自定义希望保留下来的特征数量,而后者则借助交叉验证机制自动寻找最佳子集大小。 #### 嵌入式方法(Embedded Methods) 嵌入式的策略是在训练期间同步完成特征选择工作。Lasso回归就是一个很好的案例——它不仅能够估计参数权重,还能自然地实现稀疏化效果,即让不重要度对应的系数趋向零从而达到的目的。此外像XGBoost这样的梯度提升框架也内置了类似的正则项用于控制复杂度[^3]。 为了防止时间序列场景下的“特征穿越”,应当特别注意确保所有参与建模的历史记录均不会泄露任何有关未来时刻的信息。这意味着当处理此类特殊结构的数据集时,需谨慎设计实验流程以护因果顺序完整性[^4]。 ```python from sklearn.feature_selection import RFE, RFECV from sklearn.svm import SVC # 使用RFE进行特征选择的例子 estimator = SVC(kernel="linear") selector = RFE(estimator=estimator, n_features_to_select=5).fit(X_train, y_train) # 获取被选中的特征索引 selected_indices = selector.support_ ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值