XGBoost学习(六):输出特征重要性以及筛选特征

2023-11-14

XGBoost学习(一):原理
XGBoost学习(二):安装及介绍
XGBoost学习(三):模型详解
XGBoost学习(四):实战
XGBoost学习(五):参数调优
XGBoost学习(六):输出特征重要性以及筛选特征
完整代码及其数据

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

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

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

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

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

2,绘制特征重要性

一个已训练的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
from sklearn.datasets import load_iris
# load data
dataset = load_iris()
# split data into X and y
X = dataset.data
y = dataset.target
# 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.17941953 0.11345647 0.41556728 0.29155672]
相对重要性条形图:
在这里插入图片描述
  这种绘制的缺点在于,只显示了特征重要性而没有排序,可以在绘制之前对特征重要性得分进行排序。
  通过内建的绘制函数进行特征重要性得分排序后的绘制,这个函数就是plot_importance(),示例如下:

# plot feature importance manually
from numpy import loadtxt
from xgboost import XGBClassifier
from matplotlib import pyplot
from sklearn.datasets import load_iris
from xgboost import plot_importance
 
# load data
dataset = load_iris()
# split data into X and y
X = dataset.data
y = dataset.target
# fit model no training data
model = XGBClassifier()
model.fit(X, y)
# feature importance
print(model.feature_importances_)
# plot feature importance
 
plot_importance(model)
pyplot.show()

示例得到条形图:
在这里插入图片描述

根据其在输入数组的索引,特征被自动命名为f0~f3,在问题描述中手动的将这些索引映射到名称,我们可以看到,f2具有最高的重要性,f1具有最低的重要性。

3,根据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)

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

完整代码如下:

# plot feature importance manually
import numpy as np
from xgboost import XGBClassifier
from matplotlib import pyplot
from sklearn.datasets import load_iris
from xgboost import plot_importance
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.feature_selection import SelectFromModel
 
# load data
dataset = load_iris()
# split data into X and y
X = dataset.data
y = dataset.target
 
# 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 no training data
model = XGBClassifier()
model.fit(X_train, y_train)
# feature importance
print(model.feature_importances_)
 
# 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 = np.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))

运行示例,得到输出:
[0.20993228 0.09029345 0.54176074 0.15801354]
Accuracy:92.00%
Thresh=0.090, n=4, Accuracy: 92.00%
Thresh=0.158, n=3, Accuracy: 92.00%
Thresh=0.210, n=2, Accuracy: 86.00%
Thresh=0.542, n=1, Accuracy: 90.00%
我们可以看到,模型的性能通常随着所选择的特征的数量减少,在这一问题上,可以对测试集准确率和模型复杂度做一个权衡,例如选择三个特征,接受准确率为92%,这可能是对这样一个小数据集的清洗,但是对于更大的数据集和使用交叉验证作为模型评估方案可能是更有用的策略。

4,网格搜索

代码1:

from sklearn.model_selection import GridSearchCV
tuned_parameters= [{'n_estimators':[100,200,500],
                  'max_depth':[3,5,7], ##range(3,10,2)
                  'learning_rate':[0.5, 1.0],
                  'subsample':[0.75,0.8,0.85,0.9]
                  }]
tuned_parameters= [{'n_estimators':[100,200,500,1000]
                  }]
clf = GridSearchCV(XGBClassifier(silent=0,nthread=4,learning_rate= 0.5,min_child_weight=1, max_depth=3,gamma=0,subsample=1,colsample_bytree=1,reg_lambda=1,seed=1000), param_grid=tuned_parameters,scoring='roc_auc',n_jobs=4,iid=False,cv=5) 
clf.fit(X_train, y_train)
##clf.grid_scores_, clf.best_params_, clf.best_score_
print(clf.best_params_)
y_true, y_pred = y_test, clf.predict(X_test)
print"Accuracy : %.4g" % metrics.accuracy_score(y_true, y_pred)
y_proba=clf.predict_proba(X_test)[:,1]
print "AUC Score (Train): %f" % metrics.roc_auc_score(y_true, y_proba)   

代码2:

from sklearn.model_selection import GridSearchCV
parameters= [{'learning_rate':[0.01,0.1,0.3],'n_estimators':[1000,1200,1500,2000,2500]}]
clf = GridSearchCV(XGBClassifier(
             max_depth=3,
             min_child_weight=1,
             gamma=0.5,
             subsample=0.6,
             colsample_bytree=0.6,
             objective= 'binary:logistic', #逻辑回归损失函数
             scale_pos_weight=1,
             reg_alpha=0,
             reg_lambda=1,
             seed=27
            ),
            param_grid=parameters,scoring='roc_auc') 
clf.fit(X_train, y_train)
print(clf.best_params_) 
y_pre= clf.predict(X_test)
y_pro= clf.predict_proba(X_test)[:,1]
print "AUC Score : %f" % metrics.roc_auc_score(y_test, y_pro)
print"Accuracy : %.4g" % metrics.accuracy_score(y_test, y_pre)

输出特征重要性:

import pandas as pd
import matplotlib.pylab as plt
feat_imp = pd.Series(clf.booster().get_fscore()).sort_values(ascending=False)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')
plt.show()

补充:关于随机种子——random_state

random_state是一个随机种子,是在任意带有随机性的类或者函数里作为参数来控制随机模式。random_state取某一个值的时候,也就确定了一种规则。
random_state可以用于很多函数,比如训练集测试集的划分;构建决策树;构建随机森林

1,划分训练集和测试集的类train_test_split

随机数种子控制每次划分训练集和测试集的模式,其取值不变时划分得到的结果一模一样,其值改变时,划分得到的结果不同。若不设置此参数,则函数会自动选择一种随机模式,得到的结果也就不同。

2,构建决策树的函数

clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter="random")

其取值不变时,用相同的训练集建树得到的结果一模一样,对测试集的预测结果也是一样的
其取值改变时,得到的结果不同;
若不设置此参数(即设置为None),则函数会自动选择一种随机模式,每次得到的结果也就不同,可能稍微有所波动。

3,构建随机森林

clf = RandomForestClassifier(random_state=0)

其取值不变时,用相同的训练集建树得到的结果一模一样,对测试集的预测结果也是一样的
其取值改变时,得到的结果不同;
若不设置此参数(即设置为None),则函数会自动选择一种随机模式,每次得到的结果也就不同,可能稍微有所波动。

4,总结

在需要设置random_state的地方给其赋值,当多次运行此段代码得到完全一样的结果,别人运行代码也可以复现你的过程。若不设置此参数则会随机选择一个种子,执行结果也会因此不同。虽然可以对random_state进行调参,但是调参后再训练集上表现好的模型未必在陌生训练集上表现好,所以一般会随便选择一个random_state的值作为参数。
对于那些本质上是随机的过程,我们有必要控制随机的状态,这样才能重复的展现相同的结果。如果对随机状态不加控制,那么实验的结果就无法固定,而是随机的显示。
其实random_state 与 random seed作用是相同的,下面我们通过 random seed来学习一下 random_state:
在这里插入图片描述
第一段代码和第二段代码完全相同,在1~100中取10个随机数,都没有设置 random seed,它每次取的结果就不太,它的随机数种子与当前系统的时间有关。
第三段代码和第四段代码设置了相同的 random seed(123),他们取的随机数就完全相同,你多运行几次也是这样。
第五段代码设置了 random seed(456),但是与之前设置的不同,于是运行取随机数的结果也不同。

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

XGBoost学习(六):输出特征重要性以及筛选特征 的相关文章

随机推荐

  • [创业之路-64]:股权激励的十种形式

    薪酬有三件事 第一 实际绩效提高 第二 员工感受提高 第三 放大员工的未来价值 股权激励是放大价值最有效的说法 股权激励有利于企业与员工成为利益共同体 让员工相信对企业有利的一定对自己有利 股权激励有两个方向 一个是与奖励相关 二是与福利相
  • python入门学习随记(四)

    4 1 查找指定字符 本题要求编写程序 从给定字符串中查找某指定的字符 输入格式 输入的第一行是一个待查找的字符 第二行是一个以回车结束的非空字符串 不超过80个字符 输出格式 如果找到 在一行内按照格式 index 下标 输出该字符在字符
  • WinForm:禁用Panel容器滚动条自动移动位置的功能

    今天遇到了一个问题 描述如下 有一个Panel容器 将AutoScroll属性设置为True 此时Panel容器会在内容过多时自动展示一个滚动条 这个滚动条存在一个缺点 即会随着焦点变化自动滚向焦点位置 如果仅初始化界面时Panel滚动条位
  • MIT-BIH ECG 心电数据的下载和读取图解

    一 如何下载获取MIT BIH的数据从下面这个官方链接页面可以下载到所有48组MIT BIH心电数据 http www physionet org physiobank database mitdb 下面这个链接是MIT BIH数据库的详细
  • cocos2dx游戏以插件形式嵌入IE浏览器的实现

    一 cocos2dx渲染窗口修改及导出dll 1 思路 cocos2dx引擎使用opengl进行游戏画面的渲染 opengl的渲染窗口由其自身创建 具有跨平台性 那么我可以对渲染窗口进行修改 便可以达到将游戏窗口嵌入其他窗口的效果 2 实现
  • 【火灾检测】基于HSV特征实现火灾检测附matlab代码

    1 简介 针对传统火灾监测系统对于大空间的室内场合和开阔的室外环境易失效的问题 提出了一种结合火灾火焰特征和烟雾特征来进行判断的数字图像型火灾监测算法 火焰颜色特征是基于RGB颜色模型中的R G B三基色分量和它们之间的关系来判断是否有火焰
  • 网络攻防——ARP欺骗

    arp基础攻防 1 什么是arp攻击 2 arp攻击条件 3 arp如何进行攻击 3 1靶机环境搭建 3 2攻击机环境搭建 3 3如何发起arp攻击 4 如何防止arp攻击 5 参考文献 1 什么是arp攻击 ARP攻击是指攻击者利用ARP
  • python [3.2] urllib的使用

    urllib是python的一个获取url Uniform Resource Locators 统一资源定址器 的模块 它用urlopen函数的形式提供了一个非常简洁的接口 这使得用各种各样的协议获取url成为可能 它同时 也提供了一个稍微
  • 图灵1

    简介 艾伦 麦席森 图灵 英语 Alan Mathison Turing 1912年6月23日 1954年6月7日 英国数学家 逻辑学家 被称为计算机科学之父 人工智能之父 艾伦 麦席森 图灵 生平 1912年6月23日 艾伦 麦席森 图灵
  • SpringAOP的实现原理

    一 SpringAOP的面向切面编程 是面向对象编程的一种补充 用于处理系统中分布的各个模块的横切关注点 比如说事务管理 日志 缓存等 它是使用动态代理实现的 在内存中临时为增强某个方法生成一个AOP对象 这个对象包含目标对象的所有方法 在
  • 求m到n之间的素数和(函数)python

    目录 题目描述 AC代码 题目描述 输入两个正整数m和n m
  • k8s持久化存储

    目录 一 为什么要做持久化存储 1 emptyDir类型 2 hostPath 3 nfs 4 pvc 1 pv是什么 2 PVC是什么 5 storageclass 一 为什么要做持久化存储 在k8s中部署的应用都是以pod容器的形式运行
  • Windows 安装Redis(图文详解)

    一 Redis是什么数据库 Remote Dictionary Server Redis 是一个开源的使用 ANSI C 语言编写 遵守 BSD 协议 支持网络 可基于内存 分布式 可选持久性的键值对 Key Value 存储数据库 并提供
  • eclipse怎么在包里建一个包

    实现效果如下图 废话不多说 上图 1 设置Package Presentation 为Hierarchical 最为关键一步 2 在src下新建一个名为com abc hrm的包 3 在父包下新建子包a 因为只有一个子包 建完的子包会这样显
  • 关于绿色校园建设中综合能效平台的管理效益与研究

    摘要 伴随当前环保理念的不断发展 绿色节能理念也在逐步深入校园 为响应国家建设节约型校园的号召 本文以校园智能化综合能效管理平台建设为主题 介绍了平台建设方案 比较了某高校平台建设前后学生宿舍 教学及实训楼用能情况 分析结果表明高校综合能效
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • Java如何获取平台(操作系统)的默认编码

    Java如何获取平台 操作系统 的默认编码 平台 这两个字指的就是操作系统 比如Windows平台 MacOS平台 Linux平台 这也是我们经常读API文档的时候见到的英文 platform 如 platform encoding 如何获
  • spring-MVC

    Spring MVC Hello Spring MVC web xml 在WEB INF目录下创建 web xml 配置Spring MVC的入口 DispatcherServlet 把所有的请求都提交到该Servlet
  • 数据库十一章——并发控制

    11 1 并发控制概述 1 并发操作带来的数据不一致性 1 丢失修改 Lost Update 两个事务T1和T2读入同一数据并修改 T2的提交结果破坏了T1提交的结果 导致T1的修改被丢失 2 不可重复读 Non repeatable Re
  • XGBoost学习(六):输出特征重要性以及筛选特征

    XGBoost学习 一 原理 XGBoost学习 二 安装及介绍 XGBoost学习 三 模型详解 XGBoost学习 四 实战 XGBoost学习 五 参数调优 XGBoost学习 六 输出特征重要性以及筛选特征 完整代码及其数据 XGB