写点什么

Scikit-Learn 中的特征排名与递归特征消除

发布于: 2020 年 10 月 23 日

全文2K字,建议阅读时间5分钟​。


由于我本人最近正在做特征工程方面的工作,以特征选择和特征降维为主,所以本篇文章为同学们讲解sklearn库中常用的特征选择方法。

本文介绍如何使用scikit-learn为您的机器学习项目获取最佳数量的特征。





对于任何机器学习应用程序而言,特征选择都是一项重要任务。当所讨论的数据具有许多功能时,这尤其重要。最佳数量的特征还可以提高模型的准确性。获得最重要的特征和最佳特征的数量可以通过特征重要性或特征等级来获得。在本文中,我们将探讨功能排名。




递归特征消除

消除递归特征所需的第一项是估计器。例如,线性模型或决策树模型。

这些模型具有线性模型的系数,并且在决策树模型中具有重要的功能。在选择最佳数量的特征时,训练估计器,并通过系数或特征重要性选择特征。最不重要的功能已删除。递归地重复此过程,直到获得最佳数量的特征。



在Sklearn中的应用

Scikit-learn使通过类实现递归特征消除成为可能。该类具有以下参数:sklearn.feature_selection.RFE

  • estimator —可以通过coef_ 或 feature_importances_ 属性提供功能重要性的机器学习估计器 。

  • n_features_to_select —要选择的功能数量。选择 half 是否未指定。

  • step —一个整数,指示每次迭代要删除的特征的数量,或者一个介于0和1之间的数字以指示每次迭代要删除的特征的百分比。

拟合后,可以获得以下属性:

  • ranking_ —功能的排名。

  • n_features_ —已选择的功能数。

  • support_ —一个数组,指示是否选择了功能。

应用

如前所述,我们需要使用提供feature_importance_s 属性或 coeff_ 属性的估计器 。让我们来看一个简单的例子。数据集具有13个要素-我们将努力获得最佳数量的要素。





让我们获得 X 和 y 特征。



我们将其分为测试和训练集以准备建模:



几个导入:

  • Pipeline —因为我们将执行一些交叉验证。最佳实践是为了避免数据泄漏。

  • RepeatedStratifiedKFold —用于重复分层交叉验证。

  • cross_val_score —用于评估交叉验证的分数。

  • GradientBoostingClassifier —我们将使用的估算器。

  • numpy -这样我们就可以计算分数的平均值。





第一步是创建RFE 类的实例, 同时指定估算器和您要选择的特征数量。在这种情况下,我们选择6:



接下来,我们创建要使用的模型的实例:



我们将使用 Pipeline 转换数据。在中, Pipeline 我们指定 rfe 了特征选择步骤以及将在下一步中使用的模型。

然后,我们指定 RepeatedStratifiedKFold 10个拆分和5个重复的。分层的K折确保在每个折中每个类别的样本数量均衡。RepeatedStratifiedKFold重复分层K倍指定次数,每次重复具有不同的随机性。







有了这些,我们可以检查支持和排名。支持说明是否选择了特征。

rfe.support_array([ True, False, True, False, True, False, False, True, False,True, False, True, True])

我们可以将其放入数据框并检查结果。







我们还可以检查相对排名。

rf_df = pd.DataFrame(rfe.ranking_,index=X.columns,columns=[‘Rank’]).sort_values(by=’Rank’,ascending=True)rf_df.head()








如果我们可以自动选择功能,那么与其手动配置功能数量,不如说是很好。这可以通过递归特征消除和交叉验证来实现。这是通过sklearn.feature_selection.RFECV 类完成的 。该类具有以下参数:

  • estimator -与RFE 班级相似 。

  • min_features_to_select —最少要选择的功能。

  • cv—交叉验证拆分策略。

返回的属性是:

  • n_features_ —通过交叉验证选择的最佳特征数。

  • support_ —包含有关要素选择信息的数组。

  • ranking_ —功能的排名。

  • grid_scores_ —从交叉验证中获得的分数。

第一步是导入类并创建其实例。

from sklearn.feature_selection import RFECVrfecv = RFECV(estimator=GradientBoostingClassifier())

下一步是指定管道。在此管道中,我们使用刚刚创建的 rfecv





让我们拟合管道,然后获得最佳数量的特征。





可以通过该n_features_ 属性获得最佳数量的特征 。





排名和支持可以像上次一样获得。

rfecv.support_rfecv_df = pd.DataFrame(rfecv.ranking_,index=X.columns,columns=[‘Rank’]).sort_values(by=’Rank’,ascending=True)rfecv_df.head()

使用, grid_scores_ 我们可以绘制一个显示交叉验证得分的图表。










将其应用于回归问题的过程是相同的。只要确保使用回归指标而不是准确性即可。我希望本文能为您提供一些有关为您的机器学习问题选择最佳特征的见解。



参考内容:

具有递归特征消除的代码库





看完别走还有惊喜!

我精心整理了计算机/Python/机器学习/深度学习相关的2TB视频课与书籍,价值1W元。关注微信公众号“计算机与AI”,点击下方菜单即可获取网盘链接。



发布于: 2020 年 10 月 23 日阅读数: 723
用户头像

微信公众号:计算机与AI 2020.09.19 加入

数据科学科班出身,专注分享计算机和人工智能相关知识。

评论

发布
暂无评论
Scikit-Learn中的特征排名与递归特征消除