使用基于决策树的梯度提升算法的一个好处是,可以自动地获取特征的重要性,从而有效地进行特征的筛选。本文基于xgboost进行特征选择的实践

使用gradient boosting计算特征重要性

通过梯度提升的方法,我们可以根据提升之后的树获取每个特征的重要性。

一般来说,特征的重要性表示这个特征在构建提升树的作用。如果一个特征在所有树中作为划分属性的次数越多,那么该特征就越重要。通过每个属性分割点改进性能度量的量来计算单个决策树的重要性,并由节点负责的观察数量加权。性能度量可以是用于选择分裂点的纯度(基尼指数)或另一个更具体的误差函数。最后,在模型中的所有决策树中对要素重要性进行平均。最终得到每个特征的重要性,之后可以特征排序或者进行相互比较。

基于xgboost的实践

  • xgboost是一个流行的机器学习第三方库,提供可python的借口,可以利用xgboost轻松的获取feature importance
  • 可以利用scikit-learn提供的类 SelectFromModel来进行特征选择,关于SelectFromModel的具体用法可以参考https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html

在下面这个例子中,我们首先将拆分出训练集和测试集,然后在训练集上训练XGBoost模型,用测试集来验证模型的准确率。此外,基于训练XGBoost得到的feature_impoerance,通过SelectFromModel进行特征选择,并比较不同特征重要性阈值下的准确率

# use feature importance for feature selection
from numpy import loadtxt
from numpy import sort
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.feature_selection import SelectFromModel
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)
# fit model on all training data
model = XGBClassifier()
model.fit(X_train, y_train)
# make predictions for test data and evaluate
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
# Fit model using each importance as a threshold
thresholds = sort(model.feature_importances_)
for thresh in thresholds:# select features using thresholdselection = SelectFromModel(model, threshold=thresh, prefit=True)select_X_train = selection.transform(X_train)# train modelselection_model = XGBClassifier()selection_model.fit(select_X_train, y_train)# eval modelselect_X_test = selection.transform(X_test)y_pred = selection_model.predict(select_X_test)predictions = [round(value) for value in y_pred]accuracy = accuracy_score(y_test, predictions)print("Thresh=%.3f, n=%d, Accuracy: %.2f%%" % (thresh, select_X_train.shape[1], accuracy*100.0))

结果如下所示:

Accuracy: 77.95%
Thresh=0.071, n=8, Accuracy: 77.95%
Thresh=0.073, n=7, Accuracy: 76.38%
Thresh=0.084, n=6, Accuracy: 77.56%
Thresh=0.090, n=5, Accuracy: 76.38%
Thresh=0.128, n=4, Accuracy: 76.38%
Thresh=0.160, n=3, Accuracy: 74.80%
Thresh=0.186, n=2, Accuracy: 71.65%
Thresh=0.208, n=1, Accuracy: 63.78%
  • 从结果中可以看出随着特征重要性阈值的增加,选择特征数量的减少,模型的准确率也在下降
  • 我们必须在模型复杂度(特征数量)和准确率做一个权衡,但是有些情况,特征数量的减少反而会是准确率升高,因为这些被剔除特征是噪声

reference

https://machinelearningmastery.com/feature-importance-and-feature-selection-with-xgboost-in-python/

使用xgboost进行特征选择相关推荐

  1. xgboost特征选择

    Xgboost在各大数据挖掘比赛中是一个大杀器,往往可以取得比其他各种机器学习算法更好的效果.数据预处理,特征工程,调参对Xgboost的效果有着非常重要的影响.这里介绍一下运用xgboost的特征选 ...

  2. 结合Scikit-learn介绍几种常用的特征选择方法

    特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...

  3. 机器学习笔记-XGBoost

    天池学习笔记:AI训练营机器学习-阿里云天池 XGBoost参数调优完全指南(附Python代码)_工药叉的经文-CSDN博客_xgboost参数调优 XGBoost的介绍 XGBoost是2016年 ...

  4. (二)提升树模型:Xgboost原理与实践

    本篇博客是提升树模型博客的第二篇文章,第一篇介绍GBDT的博客可以参看这里.第三篇介绍Lightgbm博客可以参看这里. 本篇博客是基于kingsam_的博客整理而来,在此表示感谢.在这篇文章的基础上 ...

  5. 特征选择(过滤法、包装法、嵌入法)

    文章目录 Filter过滤式方法 方差选择法 相关系数法 卡方检验 互信息法和最大信息系数Mutual information and maximal information coefficient ...

  6. xgboost原理分析以及实践

    摘要 本文在写完GBDT的三篇文章后本来就想写的,但一直没有时间,终于刚好碰上需要,有空来写这篇关于xgboost原理以及一些实践的东西(这里实践不是指给出代码然后跑结果,而是我们来手动算一算整个xg ...

  7. 树模型系列之XGBoost算法

    文章目录 树模型系列之XGBoost算法 概要 原理 损失函数 子树 xgboost算法流程总结 关键问题 缺失值处理(稀疏问题的分裂点查找 Sparsity-aware Split Finding) ...

  8. 【机器学习】基于天气数据集的XGBoost分类与预测

    目录 一.学习知识点概要 二.学习内容 代码 1.导入库 2.对离散变量进行编码 3.利用 XGBoost 进行训练与测试 4.利用 XGBoost 进行特征选择 5.模型调参 三.学习问题与解答 四 ...

  9. 机器学习训练营-基于XGBoost的分类预测学习笔记

    文章目录 前言 一.学习知识点概要 二.学习内容 1 XGBoost的应用及优缺点 1.1 XGBoost的应用 1.2 XGBoost的优缺点 2 基于天气数据集的XGBoost分类实战 2.1 目 ...

最新文章

  1. WINDOWS系统调用 和 SYSENTER系统服务调用过程
  2. 网站建设之前需要先了解目标受众
  3. 台积电新工艺路线图披露:7nm最快明年4月试产
  4. 采用Huffman编码进行数据压缩
  5. 41. Leetcode 662. 二叉树最大宽度 (二叉树-二叉树性质)
  6. 【Clickhouse】问题记录
  7. nessus rpm 安装_CentOS8.0下查看已安装的软件位置
  8. 第12章:项目采购管理(2)-章节重点
  9. 中断linux命令快捷键_实用!快速操作Linux终端命令行的快捷键
  10. Cadence 16 ( Allegro PCB ) 使用 Shape Symbol 制作不规则焊盘
  11. ubuntu下编译安卓7.0源码
  12. 一些网络爱好者常用的网络工具
  13. vc2008程序发布指南
  14. Java常见异常和解决办法
  15. 布谷鸟算法(C++实现)
  16. 射频电路设计——传输线理论(Transmission Line Analysis) 【上】
  17. Excel VBA小程序 -使用VBA实现VLOOKUP函数查询?
  18. 利用HbuilderX制作简单网页: HTML5期末大作业——html5漫画风格个人主页
  19. 正则表达式(韩顺平讲解)
  20. 化工厂化纤工厂公用工厂调研报告,化工厂监管工业物联网数据采集上云方案

热门文章

  1. 服务器的防御是什么意思?
  2. iOS xcode9中framework静态库的创建以及xib和图片的使用记录
  3. ui动画_ui后效动画指南
  4. Josn字符串处理 explode/from_json/get_json_object的使用--小记补充
  5. vue-element日期选择器(默认显示当前年月日,并且只能选择当前及当前之前的日期)
  6. java毕业设计汽车商城系统mybatis+源码+调试部署+系统+数据库+lw
  7. P1135 奇怪的电梯(BFS)
  8. dagger2 android封装,Dagger2 Android应用:@Component和@Module
  9. (java毕业设计)基于ssm校园二手交易网站管理系统源码
  10. 我的博客园博客设计更新记录