您的位置:首页 > 大数据 > 人工智能

机器学习-自动筛选特征

2018-03-02 14:26 337 查看
选择属性(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(datase
4000
t.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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐