用xgboost模型对特征重要性进行排序

在这篇文章中,你将会学习到:

  1. xgboost对预测模型特征重要性排序的原理(即为什么xgboost可以对预测模型特征重要性进行排序)。
  2. 如何绘制xgboost模型得到的特征重要性条形图。
  3. 如何根据xgboost模型得到的特征重要性,在scikit-learn进行特征选择。

梯度提升算法是如何计算特征重要性的?

使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个属性的重要性得分。一般来说,重要性分数,衡量了特征在模型中的提升决策树构建中价值。一个属性越多的被用来在模型中构建决策树,它的重要性就相对越高。

属性重要性是通过对数据集中的每个属性进行计算,并进行排序得到。在单个决策书中通过每个属性分裂点改进性能度量的量来计算属性重要性,由节点负责加权和记录次数。也就说一个属性对分裂点改进性能度量越大(越靠近根节点),权值越大;被越多提升树所选择,属性越重要。性能度量可以是选择分裂节点的Gini纯度,也可以是其他度量函数。

最终将一个属性在所有提升树中的结果进行加权求和后然后平均,得到重要性得分。

绘制特征重要性

一个已训练的xgboost模型能够自动计算特征重要性,这些重要性得分可以通过成员变量feature_importances_得到。可以通过如下命令打印:

print(model.feature_importances_)

我们可以直接在条形图上绘制这些分数,以获得数据集中每个特征的相对重要性的直观显示。例如:

# plot
pyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)
pyplot.show()

我们可以通过在the Pima Indians onset of diabetes 数据集上训练XGBOOST模型来演示,并从计算的特征重要性中绘制条形图。

# plot feature importance manually
from numpy import loadtxt
from xgboost import XGBClassifier
from matplotlib import pyplot
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
y = dataset[:,8]
# fit model no training data
model = XGBClassifier()
model.fit(X, y)
# feature importance
print(model.feature_importances_)
# plot
pyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)
pyplot.show()

运行这个示例,首先的输出特征重要性分数:

[0.089701, 0.17109634, 0.08139535, 0.04651163, 0.10465116, 0.2026578, 0.1627907, 0.14119601]

相对重要性条形图:

这种绘制的缺点在于,只显示了特征重要性而没有排序,可以在绘制之前对特征重要性得分进行排序。

通过内建的绘制函数进行特征重要性得分排序后的绘制,这个函数就是plot_importance(),示例如下:

# plot feature importance using built-in function
from numpy import loadtxt
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
y = dataset[:,8]
# fit model no training data
model = XGBClassifier()
model.fit(X, y)
# plot feature importance
plot_importance(model)
pyplot.show()

运行示例得到条形图:

根据其在输入数组中的索引,特征被自动命名为f0-f7。在问题描述中手动的将这些索引映射到名称,我们可以看到,F5(身体质量指数)具有最高的重要性,F3(皮肤折叠厚度)具有最低的重要性。

根据xgboost特征重要性得分进行特征选择

特征重要性得分,可以用于在scikit-learn中进行特征选择。通过SelectFromModel类实现,该类采用模型并将数据集转换为具有选定特征的子集。这个类可以采取预先训练的模型,例如在整个数据集上训练的模型。然后,它可以阈值来决定选择哪些特征。当在SelectFromModel实例上调用transform()方法时,该阈值被用于在训练集和测试集上一致性选择相同特征。

在下面的示例中,我们首先在训练集上训练xgboost模型,然后在测试上评估。使用从训练数据集计算的特征重要性,然后,将模型封装在一个SelectFromModel实例中。我们使用这个来选择训练集上的特征,用所选择的特征子集训练模型,然后在相同的特征方案下对测试集进行评估。

示例:

# select features using threshold
selection = SelectFromModel(model, threshold=thresh, prefit=True)
select_X_train = selection.transform(X_train)
# train model
selection_model = XGBClassifier()
selection_model.fit(select_X_train, y_train)
# eval model
select_X_test = selection.transform(X_test)
y_pred = selection_model.predict(select_X_test)

我们可以通过测试多个阈值,来从特征重要性中选择特征。具体而言,每个输入变量的特征重要性,本质上允许我们通过重要性来测试每个特征子集。

完整示例如下:

# 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%

我们可以看到,模型的性能通常随着所选择的特征的数量而减少。在这一问题上,可以对测试集准确率和模型复杂度做一个权衡,例如选择4个特征,接受准确率从77.95%降到76.38%。这可能是对这样一个小数据集的清洗,但对于更大的数据集和使用交叉验证作为模型评估方案可能是更有用的策略。

用xgboost模型对特征重要性进行排序相关推荐

  1. XGBoost feature importance特征重要性-实战印第安人糖尿病数据集

    使用梯度提升之类的决策树方法集成的一个好处是,它们可以从训练有素的预测模型中自动提供特征重要性的估计. 在这篇文章中,您将了解如何使用 Python 中的 XGBoost 库估计特征对预测建模问题的重 ...

  2. R语言构建xgboost模型:特征重要度计算及解读、改善特征重要度数据的可解释性、特征重要度可视化

    R语言构建xgboost模型:特征重要度计算及解读.改善特征重要度数据的可解释性.特征重要度可视化 目录

  3. GEE随记(二):随机森林特征重要性的排序

    原因 在Google Earth Engine(GEE)利用随机森林模型进行地物监督分类时,我们往往也需要输出特征重要性来判别哪一种特征对分类最有效,关于随机森林的地物分类可以参考相关博主的文章:GE ...

  4. 机器学习笔记 十五:随机森林(Random Forest)评估机器学习模型的特征重要性

    随机森林 1. 随机森林介绍 1.1 租赁数据案例 2. 特征相关性分析(热图) 2.1 热图绘制 2.2 构建随机森林模型 2.3 不同特征合并的重要性 2.3.1 经纬度合并(分3类) 2.3.2 ...

  5. 数据挖掘#特征工程(二)特征重要性及可解释性总结

    在打比赛的时候一直贯穿的思考,大概就是判别各个特征的重要性. 在建立模型之前,特征重要性能够帮助训练模型,防止过拟合,提升模型的RUC效果. 建立模型之后,特征重要性能够增强模型(集成模型 非深度学习 ...

  6. [机器学习] 树模型(xgboost,lightgbm)特征重要性原理总结

    在使用GBDT.RF.Xgboost等树类模型建模时,往往可以通过 feature_importance 来返回特征重要性,各模型输出特征重要性的原理与方法 一 计算特征重要性方法 首先,目前计算特征 ...

  7. LR模型特征重要性排序

    1.特征重要性的意义 LR模型也就是逻辑回归模型,作为一个简单的常用的模型,其有非常多的优点,除了模型简单,容易实现分布式,还有一个重要的优点就是模型的可解释性非常好.因为每个特征都对应一个模型参数w ...

  8. XGBoost输出特征重要性以及筛选特征

    XGBoost输出特征重要性以及筛选特征 1,梯度提升算法是如何计算特征重要性的? 使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个属性的重要性得分.一般来说,重要性分数,衡量了特征在 ...

  9. 机器学习模型可解释性进行到底——特征重要性(四)

    文章目录 1 四种全局可解释的方法论 1.1 过滤法 1.1.1 方差过滤方差过滤 1.1.2 相关性过滤 1.2 嵌入法 1.2.1 SelectFromModel - 筛选特征 1.2.2 Per ...

最新文章

  1. USB无法识别原因分析及解决方案
  2. 2018.01.21.一周机器学习周记
  3. VTK:PolyData之WarpScalar
  4. java表格树_Java程序员值得拥有的TreeMap指南
  5. 传聊天宝团队解散 罗永浩已退出股东行列
  6. UE4 虚幻引擎,蓝图Movement组件
  7. 60、弱电网络管理入门与基础技术
  8. linux下的rpm命令详解,RPM包命令详解
  9. snipaste滚动截图方法_windows史上最强截图工具 ,有它就够了
  10. python画三色柱状图_python画柱状图--不同颜色并显示数值的方法
  11. 世界那么大,你又怎么能看的完呢
  12. 如何写期刊论文的文献综述
  13. 【TensorFlow】LSTM(基于PTB的自然语言建模)
  14. 太励志!北大物业小哥六战法考终上岸
  15. 阿里云服务器购买教程(新手指南)
  16. 讯飞智能录音笔SR502:支持OCR识别功能的职场礼物
  17. 用 ffmpeg 合并 m4s 音视频
  18. linux中ext3多重索引的原理,Ext3日志原理
  19. stop slave mysql_mysql执行stop slave一直卡在Killing slave的状态
  20. python 读取内存_使用Python学习win32库进行内存读写

热门文章

  1. 杀入“黑五”战场:百度电商又一次“引体向上”
  2. SwiftUI——iOS15新版Animation制作动画介绍
  3. 全新2022强大的趣味心理测试小程序源码,趣味测试引流裂变神器,流量主激励广告实现管道收益
  4. 小程序源码:2022强大的修复版趣味心理测试小程序源码,趣味测试引流裂变神器
  5. 微信小程序 - 云开发轮询实现定时推送订阅消息
  6. 不能通过“www.baidu.com”访问百度解决方法
  7. python文件操作3--批量修改文件后缀名
  8. Java_B_Province测试次数
  9. APP二维码微信扫描后无法下载的问题 微信扫码(扫一扫二维码)下载不了app怎么解决
  10. ★为什么不要和“穷人”做朋友?