Hello,我是kk~
数据挖掘和机器学习领域中,特征选择是一个非常重要的工作步骤,对于模型的最终效果和性能都有着决定性的影响。随着数据维度的增加,特征选择变得越发关键。在现实生活中,数据通常非常稀疏,存在大量的冗余特征,这会使得机器学习算法的性能下降,因此特征选择是十分必要的。
目前,特征选择方法有很多种,比如过滤型、包裹型和嵌入型等等,其中较为流行的就是基于决策树的特征选择方法,本文将详细介绍该方法的原理和实现过程。
决策树特征选择原理
决策树是一种非常常用的分类算法,该算法通过从一组特征中选择一个最重要的特征,然后将数据集划分成两个子集,不断重复这个过程,构建一颗树型结构,最终形成一个分类模型。在这个过程中,决策树中每个节点代表了单一特征的某种判定,并且每个分支代表该特征的某一可能取值,直至最终得到一个分类结果。
在决策树分类过程中,人们通常选择一个最优的特征,根据这个特征来构建子集,这样能够最大程度上降低分类错误率,因此,选取特征的重要性成为决策树中非常重要的一个问题。
常见的基于决策树的特征选择方法,一般包括两个部分:首先,基于某一度量方法测量出各个特征的重要性,然后按照特征重要性排序,进而选择前N个对模型性能最为有利的特征。这里的度量方法通常包括信息增益、信息增益比、基尼指数等。
信息增益
假设
是一个训练数据集,其中
是类标记,即分类特征,每个样本所属的类别都为
,
。记
为样本容量,即样本总数。简单来说,信息增益即可以理解为不确定性的减少量。在选择特征之前,我们先来定义一下信息熵的概念:
这里,
为样本中属于类别
的样本子集,
的值越小,说明样本的纯度越高,数据集的不确定性就越小,为了找到对分类结果具有最大信息增益的特征,我们需要对每个特征的信息增益进行计算。特征
的信息增益指
对训练数据集
的信息熵
的减少程度,即:
其中,
是特征
所有取值的集合,
是
在
上取值为
的样本子集,|
|是
的样本个数,Ent(
)是
的信息熵。公式解释如下:
计算数据集
的信息熵。
来计算数据集
对于特征
所能带来的减少的不确定性之和。
因此,
相当于数据集D的不确定性减少的程度。Gain越大,则该特征的判别能力就越强。
其中,使用信息增益的方法要求各个特征的取值都是离散值,而且数据集中没有缺失值。
信息增益比
信息增益比是在信息增益基础上做的改进,由于信息增益在特征取值比较多时会表现出偏好过大的问题,因此,我们采用信息增益比来解决这个问题。其具体公式如下:
其中,
是信息增益率,被定义为每个值的比率在该特征下所占比例的对数:
除此之外,我们还可以使用基尼系数来度量特征的重要性。
基尼系数
基尼系数是指通过随机抽取两个样本,并根据某个分类特征将它们分成两组所需进行的平均操作数目。
其中,
是属于类别
的样本占总体样本的比例,基尼系数公式的第二个表达式说明,基尼系数可以看做样本的不纯度。
实现过程
为了更好地理解特征选择的实现方法,我们选择一个经典的分类数据集:鸢尾花数据集(iris),该数据集包含4个特征及其对应的3个分类。我们可以使用Python中的机器学习框架Scikit-Learn来完成特征选择的工作,具体代码如下:
from sklearn.datasets import load_irisfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scoreiris = load_iris()X_train,X_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=2022)clf = DecisionTreeClassifier(criterion='entropy')clf = clf.fit(X_train, y_train)y_pred = clf.predict(X_test)print(accuracy_score(y_test, y_pred))
模型训练:我们首先使用train_test_split函数将数据集分成训练集和测试集,之后使用决策树模型进行训练,这里模型的选择主要基于上述介绍的三种度量方法,这里我们以信息增益作为例子,代码如下:
clf = DecisionTreeClassifier(criterion='entropy')clf = clf.fit(X_train, y_train)
特征选择:在模型训练之后,我们可以使用clf.feature_importances_方法来计算各个特征的重要度,然后按照重要度排名,选择前N个特征作为我们的最终特征集,具体代码如下:
feature_importances_ = clf.feature_importances_idx_sorted = feature_importances_.argsort()[::-1]idx_topN = idx_sorted[:2]print('Top %d features: %s' % (2, ','.join([iris.feature_names[i] for i in idx_topN])))
特征数量选择:根据实际训练准确度表现情况来选择最终特征数量,通常选择的特征数目越大,模型的复杂度越高,但是准确率不一定提高,因此需要在这两者之间做出折中。
N = 2idx_sorted = feature_importances_.argsort()[::-1]idx_topN = idx_sorted[:N]clf = DecisionTreeClassifier(criterion='entropy')clf.fit(X_train[:, idx_topN], y_train)y_pred = clf.predict(X_test[:, idx_topN])print('Accuracy of top %d features: %.2f%%' % (N,accuracy_score(y_test,y_pred)*100))
综上所述,基于决策树的特征选择方法可以帮助我们从原始数据集中选择出最具有代表性的特征,并将其应用于模型训练中,进而提高模型的准确率和结果的可解释性。