浅谈特征选择的原理和Python实现

0.引言在现实世界中,我们总是倾向于收集尽可能多的特征来对一个事物进行描述,以期能够全面准确的刻画事物。然而,我们了解事物的目的是时刻变化着的,所以并非每一次对事物的刻画都需要所有特征。例如在机器学习领域众所周知的西瓜,描述西瓜的特征有很多,包括:大小、色泽、敲声、纹理、触感、根蒂等。了解西瓜的目的(学习任务)也各不相同:好吃、好闻、好看等。显然,若学习任务是判断一个西瓜是否好看,则只需要大小、色泽、纹理等特征即可,这些特征即是“相关特征”。若需求为判断西瓜是否好吃,只需要根蒂、敲声即可,其他的特征则为“
摘要由CSDN通过智能技术生成

0.引言

在现实世界中,我们总是倾向于收集尽可能多的特征来描述一个事物,以期能够更加全面准确的对其进行刻画。然而,我们了解事物的目的是变化着的,所以并非每一次对事物的刻画都需要所有特征。例如在机器学习领域众所周知的西瓜,描述西瓜的特征有很多,包括:大小、色泽、敲声、纹理、触感、根蒂等。了解西瓜的目的,即学习任务,也各不相同:好吃、好闻、好看等。显然,若学习任务是判断一个西瓜是否好看,则只需要大小、色泽、纹理等特征即可,这些特征即是“相关特征”。若需求为判断西瓜是否好吃,有经验的人只需要根蒂、敲声即可挑出好瓜,其他的特征则为“无关特征”。故对应于不同的学习任务,不同特征的重要性不同,从所有特征构成的特征集中选取对学习任务有用的相关特征的过程就称为特征选择。
如果我们不对特征进行选择,使用全部的特征,能否在只是付出更多的时间和资源代价的情况下完成学习任务呢?答案是不一定。特征选择是“数据预处理”过程的重要组成部分,其不仅筛选出完成学习任务所需的最少特征,还出于两个很重要的原因。其一是避免维度灾难,如果使用特征数量过多、样本数又不够,则可能带来过拟合等问题,所以需要构筑基于部分特征的模型。特征选择和降维在这一点上有相同的动机,使他们成为高维数据处理的两大主流技术。其二因为特征选择能够去除不相关特征,只留下关键因素,有利于我们在纷繁的因素中抽丝剥茧,看清事物的真相,例如房价和那些因素相关性最大。

1. 子集搜索

如想从初始的数据集中选取一个包含所有重要信息的特征子集,如果没有任何领域知识作为先验假设,则最好的办法就是遍历所有可能的特征子集,也称为暴力破解。显而易见,随着特征数量的增加,计算量终将无法招架,除非在量子计算机或其他非传统计算机领域有重大突破,在现实应用中很难使用这种方法。

相对而言,“贪心算法”则可操作性较强,基本流程如下所述。对于给定的特征集合 { a 1 , a 2 , . . . , a d } \{a_{\tiny 1},a_{\tiny 2},...,a_{\tiny d} \} { a1,a2,...,ad},首先将每个特征看做一个候选子集,对这d个候选子集进行评价,即对比单个特征对数据的分类效果。以人体为例,包含有身高、体重、肤色、发色等诸多特征,若学习的目的是对人种进行分类,则利用每一个特征(身高、体重、肤色、发色等)对数据进行分类(不同的人种),在通过数据真实标签对比就可以选出分类效果最好或者说分类结果最纯的特征。假定特征 { a 2 } \{a_{\tiny 2}\} { a2}最优,将 { a 2 } \{a_{\tiny 2}\} { a2}作为第一轮的选定集;然后在此基础上加入另一个特征,构成包含两个特征的特征集合,按照同样的方法对特征集合进行评价,假设集合 { a 2 , a 4 } \{a_{\tiny 2},a_{\tiny 4}\} { a2,a4}为最优,其优于 { a 2 } \{a_{\tiny 2}\} { a2},于是将 { a 2 , a 4 } \{a_{\tiny 2},a_{\tiny 4}\} { a2,a4}作为本轮的选定集。假设递归至k+1轮时,最优的候选 ( k + 1 ) (k+1) (k+1)特征子集不如上一轮的选定集,则停止生成候选子集,并将上一轮选定的包含k个特征的特征子集作为特征选择结果。这种从一个特征开始的策略称为“前向(forward)搜索”。相反,如果我们从整个特征集合出发,每一轮尝试筛选出一个无关特征,这样逐渐减少的策略称为“后向(backward)搜索”。又或者,还可以将前向和后向搜索结合起来,每一轮逐渐增加相关特征同时减少无关特征,称为“双向搜索”。

由于仅考虑了使本轮选定集最优而无法筛选出全局最优,此种策略故被称为贪心算法。贪心算法并不能涵盖所有可能的可能,只能保证当前利益的最大化,若要获得全局最优只能通过穷举遍历才可行。虽然不能获得绝对的最优解,但贪心算法能够得到解决大对数问题的次优解。类似的有序列向后选择算法(Sequential backward Selection,SBS),其大致流程是先用所有特征训练一个分类器并得到分类器的某种性能度量(MSE、准确度等),然后每次去掉一个特征再训练一个分类器,若去除的是无关特征,则性能变化不大甚至可能还会有所提升,反之可能使性能下降。

2.信息熵

2.1 定义

熵来自于物理学,被称为信息论之父的香农证明了熵与信息内容的不确定性有等价关系。熵是描述物质系统状态,即该状态可能出现的程度。简单的讲,熵用以描述事物无序的状态,越混乱无序的事物熵越大,越确定有序的事物熵越小。熵的一个重要作用就是度量系统的平均信息量,即传递该信息所用的代价。例如:太阳从东方升起,正是一个确定性事件,其熵为0,意味着若要传递该信息,无需进行任何编码。根据定义,若一个系统中存在多个事件 E 1 , E 2 , . . . , E n E_{\tiny 1},E_{\tiny 2},...,E_{\tiny n} E1,E2,...,En,每个事件出现的概率为 p 1 , p 2 , . . . , p n p_{\tiny 1},p_{\tiny 2},...,p_{\tiny n} p1,p2,...,pn,则系统的平均信息量为:
e n t r o p y ( p 1 , p 2 , . . . , p n ) = − p 1 l o g 2 p 1 − p 2 l o g 2 p 2 . . . − p n l o g 2 p n ( b i t s ) entropy(p_{\tiny 1},p_{\tiny 2},...,p_{\tiny n}) = -p_{\tiny1}log_{\tiny 2}{p_{\tiny 1}}-p_{\tiny2}log_{\tiny 2}{p_{\tiny 2}}...-p_{\tiny n}log_{\tiny 2}{p_{\tiny n}}^(bits) entropy(p1,p2,...,pn)=p1log2p1p2log2p2...pnlog2pn(bits)

例如,某事件有四种可能{A,B,C,D},其发生的概率分别为{1/2,1/4,1/8,1/8},假设某一种可能发生视为随机变量 X ∈ { A , B , C , D } X\in\{A,B,C,D\} X{ A,B,C,D},利用信息熵额定义,得到该事件的信息熵为:
H ( x ) = 1 2 l o g ( 2 ) + 1 4 l o g ( 4 ) + 1 8 l o g ( 8 ) + 1 8 l o g ( 8 ) = 1 2 + 1 2 + 3 8 + 3 8 = 7 4 b i t H(x)=\frac{1}{2}log(2)+\frac{1}{4}log(4)+\frac{1}{8}log(8)+\frac{1}{8}log(8)=\frac{1}{2}+\frac{1}{2}+\frac{3}{8}+\frac{3}{8}=\frac{7}{4}bit H(x)=21log(2)+41log(4)+81log(8)+81log(8)=21+21+83+83=47bit
这也就意味着,在计算机中,若要对该事件进行二元(0/1)编码,所需要的平均码长即为1.75比特。

同时,信息熵也是度量集合纯度的一个指标。集合中数据的真实标签全为一个类别时纯度最高,相应的信息熵就越低。假设当前样本集合D中k类样本所占比例为 p k ( k = 1 , 2 , . . . , n ) p_k(k=1,2,...,n) pk(k=1,2,...,n),则D的信息熵定义为:
E n t ( D ) = − ∑ k = 1 n p k l o g 2 p k Ent(D)=-\sum_{k=1}^{n}p_klog_2p_k Ent(D)=k=1npklog2pk
Ent值越小,则集合D的纯度越高。

2.2 信息增益

就特征选择而言,如果按照某个特征(属性)对对数据集进行划分后,能够提高数据纯度,则可以认为该特征对分类任务是有意义的。由于信息熵反应了数据集合的混乱程度,通过比较数据划分后信息熵的变化,就得到了所谓的信息增益。

假设离散属性 a a a V V V个可能的取值 a 1 , a 2 , . . . , a V {a^1,a^2,...,a^V} a

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
n many data analysis tasks, one is often confronted with very high dimensional data. Feature selection techniques are designed to find the relevant feature subset of the original features which can facilitate clustering, classification and retrieval. The feature selection problem is essentially a combinatorial optimization problem which is computationally expensive. Traditional feature selection methods address this issue by selecting the top ranked features based on certain scores computed independently for each feature. These approaches neglect the possible correlation between different features and thus can not produce an optimal feature subset. Inspired from the recent developments on manifold learning and L1-regularized models for subset selection, we propose here a new approach, called {\em Multi-Cluster/Class Feature Selection} (MCFS), for feature selection. Specifically, we select those features such that the multi-cluster/class structure of the data can be best preserved. The corresponding optimization problem can be efficiently solved since it only involves a sparse eigen-problem and a L1-regularized least squares problem. It is important to note that MCFS can be applied in superised, unsupervised and semi-supervised cases. If you find these algoirthms useful, we appreciate it very much if you can cite our following works: Papers Deng Cai, Chiyuan Zhang, Xiaofei He, "Unsupervised Feature Selection for Multi-cluster Data", 16th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (KDD'10), July 2010. Bibtex source Xiaofei He, Deng Cai, and Partha Niyogi, "Laplacian Score for Feature Selection", Advances in Neural Information Processing Systems 18 (NIPS'05), Vancouver, Canada, 2005 Bibtex source
决策树是一种常用的机器学习算法,用于分类和回归问题。它基于一系列的决策规则来构建一个树状模型,通过对数据集的划分来进行预测。 决策树的原理如下: 1. 特征选择:根据某个度量标准(如信息增益、基尼指数等),选择最优的特征作为根节点。 2. 决策节点划分:利用选定的特征进行数据划分,生成子节点。 3. 递归构建:对每个子节点递归地进行特征选择和划分,直到满足终止条件(如叶节点纯度达到一定阈值或无法再划分)。 4. 树剪枝:为了防止过拟合,可以通过后剪枝或预剪枝技术对决策树进行修剪。 下面是一个基于Python的决策树示例实现: ```python from sklearn import datasets from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split # 加载数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建决策树分类器 clf = DecisionTreeClassifier() # 拟合训练集 clf.fit(X_train, y_train) # 预测测试集 y_pred = clf.predict(X_test) # 计算准确率 accuracy = sum(y_pred == y_test) / len(y_test) print("准确率:", accuracy) ``` 以上代码使用`sklearn`库中的`DecisionTreeClassifier`类实现了决策树分类器,通过加载Iris数据集进行训练和预测,并计算出准确率。你可以根据自己的需求进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值