06_特征选择,特征选择的原因,sklearn特征选择API

1、特征选择

在现实生活中,一个对象往往具有很多属性(以下称为特征),这些特征大致可以被分成三种主要的类型:
1、相关特征: 对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果;
2、无关特征: 对于我们的算法没有任何帮助,不会给算法的效果带来任何提升;
3、冗余特征: 不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出

但是对于一个特定的学习算法来说,哪一个特征是有效的是未知的。因此,需要从所有特征中选择出对于学习算法有益的相关特征。而且在实际应用中,经常会出现维度灾难问题,尤其是在文本处理中。例如,可以把一篇文档表示成一个词向量,但是往往会使用所有的单词作为字典,因此对于一篇可能仅仅包含100或者200个单词的文档,可能需要上万的维度(也就是特征)。如果可以从中选择一部分相关特征构建模型,这个问题就可以得到一定程度的解决。所以,特征选择和降维有一定的相似之处。另外,从上面的例子中可以发现,如果只选择所有特征中的部分特征构建模型,那么可以大大减少学习算法的运行时间,也可以增加模型的可解释性。

因此,进行特征选择的主要目的:
1、降维
2、降低学习任务的难度
3、提升模型的效率

定义:
从N个特征中选择其中M(M<N)个子特征,并且在M个子特征中,准则函数可以达到最优解。

特征选择想要做的是:选择尽可能少的子特征,模型的效果不会显著下降,并且结果的类别分布尽可能的接近真实的类别分类

特征选择的过程:
对于一个有N个特征的对象,可以产生2^N个特征子集,特征选择就是从这些子集中选出对于特定任务最好的子集。特征选择主要包括四个过程:

1、生成过程:生成候选的特征子集
2、评价函数:评价特征子集的好坏
3、停止条件:决定什么时候该停止
4、验证过程:特征子集是否有效

在这里插入图片描述
生成过程其实是一个搜索过程,这个过程可以从以下几种情况开始:
1、没有特征
2、所有特征
3、随机特征子集。
在前两种情况下,每次迭代可以增加、删除特征;但是在最后一种情况下,每次迭代随机增加或者删除特征。

评价函数用来评价生成过程中生成的特征子集,产生一个值用来比较当前特征子集和当前最有特征子集,如果这个特征子集更好,那么就取代当前最优子集。

停止条件用来决定迭代过程什么时候停止,生成过程和评价函数可能会对于怎样选择停止条件产生影响。停止条件有以下四种选择:
1、达到预定义的最大迭代次数;
2、达到预定义的最大特征数
3、增加(删除)任何特征不会产生更好的特征子集;
4、根据评价函数,产生最优特征子集。

验证过程并不是特征选择本身的一部分,但是选择出的特征必须是有效。因此,需要使用不同的测试集、学习方法验证选择出来的特征子集,然后比较这些验证结果。

生成过程:
生成过程是一个搜索过程,这个过程主要有以下三个策略:
1、完全搜索:根据评价函数做完全搜索。完全搜索主要有两种:穷举搜索和非穷举搜索;
2、启发式搜索:根据一些启发式规则在每次迭代时,决定剩下的特征是应该被选择还是被拒绝。这种方法很简单并且速度很快,因为它的搜索空间是O(n^2);
3、随机搜索:每次迭代时会设置一些参数,参数的选择会影响特征选择的效果。由于会设置一些参数(例如最大迭代次数),所以搜索空间也远远小于O(2^n)

评价函数:
评价函数主要用来评价选出的特征子集的好坏,一个特征子集是最优的往往指相对于特定的评价函数来说的。评价函数主要用来度量一个特征(或者特征子集)可以区分不同类别的能力。根据具体的评价方法主要有三类:

1、过滤式(filter): 先进行特征选择,然后去训练学习器,所以特征选择的过程与学习器无关。相当于先对于特征进行过滤操作,然后用特征子集来训练分类器。
2、包裹式(wrapper): 直接把最后要使用的分类器作为特征选择的评价函数,对于特定的分类器选择最优的特征子集。
3、Filter和Wrapper组合式算法: 先使用Filter进行特征选择,去掉不相关的特征,降低特征维度;然后利用Wrapper进行特征选择。
4、嵌入式(embedding): 把特征选择的过程与分类器学习的过程融合一起,在学习的过程中进行特征选择。最常见的使用L1正则化进行特征选择。

一般有5中比较常见的评价函数:
1、距离度量: 如果 X 在不同类别中能产生比 Y 大的差异,那么就说明 X 要好于 Y;
2、信息度量: 主要是计算一个特征的信息增益(度量先验不确定性和期望后验不确定性之间的差异);
3、依赖度量: 主要用来度量从一个变量的值预测另一个变量值的能力。最常见的是相关系数:用来发现一个特征和一个类别的相关性。如果 X 和类别的相关性高于 Y与类别的相关性,那么X优于Y。对相关系数做一点改变,用来计算两个特征之间的依赖性,值代表着两个特征之间的冗余度。
4、一致性度量: 对于两个样本,如果它们的类别不同,但是特征值是相同的,那么它们是不一致的;否则是一致的。找到与全集具有同样区分能力的最小子集。严重依赖于特定的训练集和 最小特征偏见(Min-Feature bias)的用法;找到满足可接受的不一致率(用户指定的参数)的最小规模的特征子集。
5、误分类率度量: 主要用于Wrapper式的评价方法中。使用特定的分类器,利用选择的特征子集来预测测试集的类别,用分类器的准确率来作为指标。这种方法准确率很高,但是计算开销较大。

以上摘自:
https://blog.csdn.net/hren_ron/article/details/80914491

1.1 特征选择原因

冗余:部分特征的相关度高,容易消耗计算性能
噪声:部分特征对预测结果有负影响

1.1 特征选择是什么?

特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。

主要方法(三大武器):Filter(过滤式):VarianceThreshold
Embedded(嵌入式):正则化、决策树
Wrapper(包裹式)

1.2 sklearn特征选择API

sklearn.feature_selection.VarianceThreshold

VarianceThreshold语法:

VarianceThreshold(threshold = 0.0)
     A:删除所有低方差特征

     B:Variance.fit_transform(X,y) 
        1、X:numpy array格式的数据[n_samples,n_features]
        2、返回值:训练集差异低于threshold的特征将被删除。
        3、默认值是保留所有非零方差特征,即删除所有样本
        4、中具有相同值的特征。

VarianceThreshold流程(代码演示)
1、初始化VarianceThreshold,指定阀值方差
2、调用fit_transform

例如处理:

[[0, 2, 0, 3], 
[0, 1, 4, 3], 
[0, 1, 1, 3]]
from sklearn.feature_selection import VarianceThreshold

def var():
    """
    特征选择--删除低方差的特征
    :return: None
    """
    var = VarianceThreshold(threshold=1.0)
    data = var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
    print(data)
    return None

if __name__ == "__main__":
    var()

输出结果为:

[[0]
 [4]
 [1]]

我们发现在三组数据里,我们发现第一列,(注意是观察每一列的数据)全是0,第二列方差小于1,第四列也是相同的值,那么这些列的区分度就会很微弱,也就不具备分析的价值了

猜你喜欢

转载自blog.csdn.net/toto1297488504/article/details/105524747