Python中XGBoost的特性重要性和特性选择

2023-10-27

使用像梯度增强这样的决策树方法的集合的一个好处是,它们可以从经过训练的预测模型中自动提供特征重要性的估计。

在这篇文章中,您将发现如何使用Python中的XGBoost库估计特性对于预测建模问题的重要性。

读完这篇文章你就会知道:

如何使用梯度增强算法计算特征的重要性。
如何在Python中绘制由XGBoost模型计算的特性重要性。
如何使用XGBoost计算的特性重要性来执行特性选择。

让我们开始吧。

特征在梯度增强中的重要性

使用梯度增强的一个好处是,在构造了增强的树之后,检索每个属性的重要性得分相对简单。

一般来说,重要性提供了一个评分,它表明每个特性在模型中增强决策树的构建中有多有用或多有价值。属性用于使用决策树做出关键决策的次数越多,其相对重要性就越高。

这个重要性是为数据集中的每个属性显式计算的,允许属性之间进行排序和比较。

对于单个决策树,重要性是通过每个属性分割点改进性能度量的数量来计算的,权重是通过节点负责观察的数量来计算的。性能指标可以是纯度(基尼指数),用来选择分割点或其他更具体的误差函数。

然后,对模型中所有决策树的特征重要性进行平均。

手动绘制特性重要性

一个经过训练的XGBoost模型会自动计算出预测建模问题中特性的重要性。

这些重要性评分可以在训练模型的feature_importances_成员变量中获得。例如,它们可以直接打印如下:

print(model.feature_importances_)

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

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

我们可以通过在Pima indian 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]

我们还得到了相对重要性的条形图。
Manual Bar Chart of XGBoost Feature Importance
这个图的一个缺点是,这些特性是根据它们的输入索引而不是它们的重要性排序的。我们可以在绘图之前对特性进行排序。

值得庆幸的是,plot中内置了一个函数来帮助我们。

使用内置的XGBoost功能的重要性图

XGBoost库提供了一个内置函数来绘制按重要性排序的特性。

该函数称为plot_importance(),可以使用如下:

# plot feature importance
plot_importance(model)
pyplot.show()

例如,下面是一个完整的代码清单,它使用内置的plot_importance()函数绘制Pima Indians数据集的特性重要性。

# 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()

运行这个例子可以得到一个更有用的柱状图。
XGBoost Feature Importance Bar Chart
您可以看到,特性是根据输入数组(X)中从F0到F7的索引自动命名的。

手动将这些指标映射到问题描述中的名称,我们可以看到图中显示F5(身体质量指数)的重要性最高,F3(皮肤褶皱厚度)的重要性最低。

使用XGBoost特性重要性评分选择特性

特征重要性评分可用于科学技术学习中的特征选择。

这是使用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 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)
	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%

我们可以看到,模型的性能通常随着所选特征的数量而下降。

在这个问题上,为了测试集的精度,需要权衡一些特性,我们可以选择一个不那么复杂的模型(更少的属性,比如n=4),并接受将估计精度从77.95%适度降低到76.38%。

总结

在这篇文章中,您发现了如何在一个经过训练的XGBoost梯度增强模型中选择特性和使用重要性。

具体来说,你学会了:

特性的重要性是什么,以及在XGBoost中如何计算特性的重要性。
如何从XGBoost模型访问和绘制功能的重要性评分。
如何使用XGBoost模型中的特性重要性进行特性选择。对于这样一个小的数据集,这可能是一种冲击,但是对于更大的数据集,使用交叉验证作为模型评估方案可能是一种更有用的策略。

原文出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中XGBoost的特性重要性和特性选择 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 深入学习前端开发,掌握HTML、CSS、JavaScript等技术

    课程链接 链接 https pan baidu com s 1WECwJ4T8UQfs2FyjUMbxig pwd i654 提取码 i654 复制这段内容后打开百度网盘手机App 操作更方便哦 来自百度网盘超级会员v4的分享 课程介绍 第
  • 【项目设计】负载均衡在线OJ

    Linux 博客主页 一起去看日落吗 分享博主的在Linux中学习到的知识和遇到的问题 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 看似不起波澜的日复一日 一定会在某一天让你看见坚持的意义 祝我们都能在鸡零狗碎里找
  • 信息学奥赛C++语言:最高分数的学生姓名

    题目描述 输入学生的人数 然后再输入每位学生的分数和姓名 求获得最高分数的学生的姓名 输入 第一行输入一个正整数N N 100 表示学生人数 接着输入N行 每行格式 分数 姓名 分数是一个非负整数 且小于等于100 姓名为一个连续的字符串
  • catkin_make出现CMake Error: The source directory “/home/ming/catkin_ws_test/src“ does not ex

    问题 catkin make出现CMake Error The source directory home ming catkin ws test src does not exist 解决 删除与src同目录下的编译文件夹build和de
  • 豆瓣api访问流程

    豆瓣api访问流程 1 https api douban com 2 通过文档查找接口Resources URI 如 v2 movie in theaters添加到1后面 3 将 apikey 0b2bdeda43b5688921839c8
  • UE中FRotator和Pitch(Roll,Yaw)以及相对朝向的关系

    前几天 看人宅的塔防视频教程 他使用了塔的成员变量rotator 我可能在哪里少写了 所以 老是朝向不对 跟踪调试了下 发现FRotator是由pitch roll yaw三个部分组成 而pitch roll yaw是局部坐标系中的朝向 那
  • 雷达水位计安装细节注意点

    近年来 随着国家防汛抗旱工作对中小河流水文监测的要求不断提高 许多流域及大中型水库 电站逐步建立了水情自动测报系统 而水位监测则是测报系统的重要组成部分 水位传感器的适用性是建立系统的重要因素 随着自动测报系统的发展 各类水位传感器在不同的
  • 卡特尔16PF性格测试与答案

    大学生在职业生涯规划时 必须充分注意到自己的性格和职业的适宜性 性格是指一个人在生活中形成的对现实的稳定的态度和行为方式 研究表明 性格影响着一个人的职业取向 由于性格的不同 每个人对工作和职业的态度也是不同的 一定的性格必然适合从事一定的
  • Java多线程实现

    Java多线程 多线程的创建方式 方式一 继承Thread类 创建一个继承Thread类的子类 重写Thread类中的run方法 创建Thread子类对象 通过此对象调用start 方法 public class ThreadDemo1 p
  • 蓝桥杯超时?给你一些小技巧

    自己在敲代码的时候碰到了超时的情况 总结了一下 1 统一定义变量 不要在循环内定义局部变量 2 把函数定义放在main函数之前 可以减少在main函数内的声明 3 循环尽量增设break条件 对循环进行剪枝可以减少不必要循环 4 尽量省略头
  • Django框架 - 路由配置全解

    Django框架学习笔记 路由配置全解 文章目录 1 初始配置 2 路由配置 2 1 一般路由 命名路由与reverse 函数 2 2 子路由 命名空间与reverse 函数 2 3 带参路由 reverse 函数 自定义path转换器 2
  • LeetCode周赛159

    1232 Check If It Is a Straight Line 检查是否为直线 暴力算斜率 但要注意分母为0的情况 class Solution public bool checkStraightLine vector
  • 重新审视Faster RCNN:优缺点与改进

    重新审视Faster RCNN Faster RCNN优点 Faster RCNN缺点 对于Faster RCNN的改进算法 特征融合 HyperNet 实例分割 Mask RCNN 全卷机网络 R FCN 级联网络 Cascade RCN
  • 使用Qt实现简单的日志记录功能(qInstallMessageHandler)

    前言 相信大家在软件开发的过程中 都有记录软件运行日志的需求 凭借日志信息来分析软件的运行状况 或者是查找 定位软件存在的未知Bug 基于C 的日志工具有log4cplus log4cxx Log4Qt等 但如果只是并非复杂的环境使用 其实
  • ubuntu18.04安装后没有wifi图标,并且无法安装wifi驱动

    网上绝大部分的解决方案是安装wifi驱动 当你发现无法安装wiifi驱动时 可以试试这个办法 1 给笔记本电脑插入网线 联网 或着采用手机USB网络共享功能 给笔记本联网 2 打开 软件与更新 选择更新源 将软件更新一下 在 开发者选项 那
  • 软件工程综合实训日志

    前期准备阶段 1 注册 heroku com 在注册heroku时需要爬墙 2 注册github 在注册github时 由于电脑网络问题出现注册不成功 还有密码问题一定不要设置自己最常用的数字 不然也会注册不成功 3 安装git bash
  • Win 2003系统传真功能的配置及使用

    传真在现 公中应用极为广泛 随着电脑的普及 我们可用电脑方便地进行传真的收发 下面以Windows 2003系统为例介绍其传真的使用 供需要的朋友参考 注意 首先要正确安装了调制解调器 并确保您的调制解调器支持传真功能 操作系统 Windo
  • 汇编指令之MOV

    汇编指令之 MOV 传送字或字节 学习来自 汇编语言MOV指令 mov指令详解 Assembly Addressing Modes 汇编用户指南 MOV 简单格式 mov dst src 扩展格式1 MOV S cond Rd Operan
  • Dynamic Hierarchical Reasoning with Language Model and Knowledge Graph for Question Answering

    本文是LLM系列文章 针对 Dynamic Hierarchical Reasoning with Language Model and Knowledge Graph for Question Answering 的翻译 DRLK 基于语
  • Python中XGBoost的特性重要性和特性选择

    使用像梯度增强这样的决策树方法的集合的一个好处是 它们可以从经过训练的预测模型中自动提供特征重要性的估计 在这篇文章中 您将发现如何使用Python中的XGBoost库估计特性对于预测建模问题的重要性 读完这篇文章你就会知道 如何使用梯度增