上一篇我们讲了如何在原有特征上添加一些特征,以使模型得到更好的拟合。
但需要注意的是,如果特征过多,那么也容易发生过拟合现象。
这一篇我们就来做减法,看看如何减少过多的特征数。我们将主要介绍3种方法,并且都是机器自动选择特征。
单变量统计
第一种方法是单变量统计。该方法的原理是,单独计算每个特征与目标之间的关系,找出关系最近的几个特征。
在scikit-learn中,我们通常使用SelectKBest和SelectPercentile。前者按照固定数量k来选择特征,后者按照百分比来选择特征。
实战
我们还是用经常使用的乳腺癌数据集的例子来说明。
首先,加载数据集
然后,将数据集分成训练集和测试集
接着,加载我们的特征选择工具
可以看到,我们使用了百分比类型的特征选择,并且选择了60%的特征。
然后,将此工具应用在训练集中,并进行变换
最后,我们还可以查看使用特征工具前后的特征数量的变化
可以看出,原来的特征有30个,使用特征自动选择工具后,减少到了18个。
此外,我们还可以查看哪些特征被选中
所有被选中的特征就储存在了features变量中,下面我们将其可视化:
如上图,红色部分为选中的特征,空白部分为未选中的特征。
基于模型
第二种方法为基于模型的特征选择。该方法是通过一个监督学习的模型来显示出每个特征的重要性,并且只保留最重要的特征。另外,用于特征选择的模型与我们最后进行建模的模型并不需要相同。
通常用于特征选择的模型我们一般使用决策树以及基于决策树的模型,因为它们提供了一个叫做feature_importances_的属性,我们可以根据这个属性来判断每个特征的重要性。
在scikit-learn中,我们使用的变换器是SelectFromModel。
实战
首先,加载我们的工具和用于特征选择的模型,这里我们选择随机森林
可以看到,我们设定了一个平均数的阈值,意思是说我们会选择大于平均数的特征数量。
然后,我们还是用之前的癌症数据集来训练模型并进行特征选择
我们来看下选择前后的特征数量
可以看出,特征选择前有30个特征,之后只剩下了7个。
当然,我们也可以查看这些特征
如上图所示,红色为选中的特征,白色为未选中特征。
递归特征消除
最后一种方法叫做递归特征消除(recursive feature elimination,RFE)。
它的原理是:一开始先选择所有的特征进行建模,然后根据模型的反馈剔除掉不重要的特征,用剩下的特征再次进行建模,直到特征的数量满足我们的需求。
当然,这个模型需要能反馈特征的重要性,因此我们还是使用上面介绍过的随机森林模型来进行特征选择。
实战
首先,还是加载我们的工具
这里有一个参数n_features_to_select,它就指定了最后的特征数量。
然后训练模型并进行转换
特征确实只有10个了。当然,我们也可以把它可视化,看看选择了哪些特征:
跟之前一样,红色部分为选中的特征,其余部分为未选中的特征。
今天的内容就到此为止了,多谢观看。