【人工智能概论】 XGBoost应用——特征筛选

这篇具有很好参考价值的文章主要介绍了【人工智能概论】 XGBoost应用——特征筛选。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【人工智能概论】 XGBoost应用——特征筛选


换一个评价指标,特征排序结果就会不一样,甚至同样的数据同样的方法多次执行得到的结果也不是完全一样,特征筛选这件事见仁见智,要理性看待,但确实可以提供一种交叉验证的角度。

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

  • 使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个特征的重要性得分。
  • 一般来说,一个特征越多的被用来在模型中构建决策树,它的重要性就相对越高。
  • 在单个决策树中通过每个特征分裂点改进性能度量的量来计算特征的重要性。由节点负责加权和记录次数,也就是说一个特征对分裂点改进性能度量越大(或越靠近根节点),权值越大;被越多提升树所选择,特征越重要。性能度量可以是选择分裂节点的Gini纯度,也可以是其他度量函数。
  • 最终将一个特征在所有提升树中的结果进行加权求和后然后平均,得到重要性得分。

二. 动手绘制特征的重要性

2.1 特征关键度分数 feature_importances_

  • 通过xgboost模块提供的方法构建一个XGBoost模型,在训练的过程中模型会自动给各特征的重要性打分。
  • 这些特征重要性分数可以通过模型成员变量 feature_importances_ 获得。
  • 可以将它们打印出来:
print(model.feature_importances_)
  • 也可以将它们绘制于条形图上:
# from matplotlib import pyplot as plt
plt.bar(range(len(model.feature_importances_)), model.feature_importances_)
plt.show()

2.2 应用举例

  • 训练一个XGBoost模型,并展示特征的重要性。
from numpy import loadtxt
from xgboost import XGBClassifier
from matplotlib import pyplot as plt

# load data
dataset = loadtxt('machine-1-1.csv', delimiter=",")

# split data into X and y
X = dataset[:,1:39]
y = dataset[:,39]

# fit model no training data
model = XGBClassifier()
model.fit(X, y)

# feature importance
print(model.feature_importances_)

# plot
plt.bar(range(len(model.feature_importances_)), model.feature_importances_)
plt.show()
  • 得分情况与直方图显示
    xgboost特征重要性筛选,【人工智能概论】,机器学习,决策树,python,人工智能

2.3 特征关键度排序可视化显示 plot_importance

  • 前面用条形图显示的方法很不错,但是并没有按照重要程度进行排序,所幸xgboost提供内置的绘图函数可以实现这个功能。
  • xgboost库提供了plot_importance()函数,其可以按重要性顺序绘制要素。
# plot feature importance
# from matplotlib import pyplot as plt
plot_importance(model)
plt.show()

2.4 应用举例

  • 还是上面的数据
# plot feature importance using built-in function
from numpy import loadtxt
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot as plt
# load data
dataset = loadtxt('machine-1-1.csv', delimiter=",")
# split data into X and y
X = dataset[:,1:39]
y = dataset[:,39]
# fit model no training data
model = XGBClassifier()
model.fit(X, y)
# plot feature importance
plot_importance(model,importance_type='gain')
plt.show()
  • 得分情况
    xgboost特征重要性筛选,【人工智能概论】,机器学习,决策树,python,人工智能

2.5 解决plot_importance和feature_importance获得的特征排序不同

  • 在使用xgboost提供的plot_importance和feature_importance方法获得的特征排序时,可能会出现获得的排名不一样的问题。
  • 为什么会出现?
  • 因为plot_importance默认的importance_type是’weight’,而feature_importance_默认的importance_type是’gain’。
  • 怎么办?
  • 换成一样的就行了。
  • xgboost里面的feature importance是怎么计算的呢?
  • importance type一共有三种类型:weight, gain, cover
  • weight 是特征在提升树里出现的次数,即所有树中,某个特征作为分裂节点的次数。
  • gain 是在所有树中,某个特征在分裂后带来的平均信息增益。
  • cover 是与特征相关的记录(observation)的相对数量。例如,如果有100条记录(observation),4个特征(feature) 和3棵树(tree),并且假设特征1分别用于确定树1,树2和树3中10、5和2个记录的叶节点;则cover指标会将该特征的coverage计算为10 + 5 + 2 = 17个记录。这将针对所有4个特征进行计算,其cover将以所有特征的cover指标的17%表示。
  • 换一个评价指标,结果就会不一样,这其实告诉我们一个什么道理,特征筛选这件事见仁见智,要理性看待,但确实可以提供一种交叉验证的角度。

三. 基于评分的特征选择

3.1 基本原理

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

3.2 实际举例

  • 首先,在训练集上训练xgboost模型,并在测试集上检测效果;
  • 然后,将模型封装在一个SelectFromModel实例中,通过该实例与特征重要性评分来选择特征;
  • 最后,用所选择的特征子集训练模型,并在相同的特征方案下在测试集上评估效果。
  • 核心代码:
# 用阈值选择特征
selection = SelectFromModel(model, threshold=thresh, prefit=True)
select_X_train = selection.transform(X_train)
# 训练模型
selection_model = XGBClassifier()
selection_model.fit(select_X_train, y_train)
# 评估模型
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('machine-1-1.csv', delimiter=",")

# split data into X and y
X = dataset[:,1:39]
Y = dataset[:,39]

# 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))
  • 结果展示:
    xgboost特征重要性筛选,【人工智能概论】,机器学习,决策树,python,人工智能

  • 从直觉来说随着阈值的变大,特征数量会减少,模型的准确率也应随之下降。

  • 这是有道理的,因此就需要在模型复杂度(特征数量)和准确率做一个权衡。

  • 但是有些情况(就像上边),特征数量的减少反而会让准确率升高,或许因为这些被剔除特征是噪声。文章来源地址https://www.toymoban.com/news/detail-818205.html

四. XGBoost做回归任务

  • 总体与分类的差不多,只是细节需要调整。
  • accuracy_score -> XGBRegressor;XGBClassifier -> mean_squared_error
from numpy import loadtxt
from numpy import sort
from xgboost import XGBRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.feature_selection import SelectFromModel
import pandas as pd

# load data
dataset = pd.read_csv('diabetes.csv', header=0)
dataset = dataset.iloc[:,1:].values

# split data into X and y
X = dataset[:,:-2]
Y = dataset[:,-2]

# 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 = XGBRegressor()
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 = mean_squared_error(y_test, predictions)
print("Accuracy: %.2f" % accuracy)

# 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 = XGBRegressor()
    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 = mean_squared_error(y_test, predictions)
    print("Thresh=%.3f, n=%d, Accuracy: %.2f" % (thresh, select_X_train.shape[1], accuracy))
  • 也可以继续看特征关键程度
from matplotlib import pyplot as plt
from xgboost import plot_importance

# feature importance
print(model.feature_importances_)

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

# plot feature importance
plot_importance(model,importance_type='gain')
plt.show()

五. 其它内容

5.1 参数的问题

  • XGBoost有多种超参数,它们对模型的性能有很大的影响,调参是门艺术。

5.2 网格调参法

  • xgboost既可以用来做二分类、多分类,也可以用来做回归,除了数据特征以外,对模型调参也是影响模型性能的关键环节,一般是按一定的步骤、网格搜索最优参数,如下两篇文章一个是用来分类,一个是用来预测数值的案例,并且详细给出了调参的步骤和代码:
  • 分类器XGBClassifier的调参
  • 回归器XGBRegressor的调参

5.3 随机种子

  • random_state可以用于很多函数,比如训练集测试集的划分;构建决策树;构建随机森林。
  • 可以通过确定随机种子来实现可复现的结果。

到了这里,关于【人工智能概论】 XGBoost应用——特征筛选的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hnu计算机与人工智能概论答案3.8

    连夜更新,求求关注!! 写在前面:这一课难度较低,报错时多看看冒号和缩进有无错误,祝大家做题顺利!!! 第1关:python分支入门基础 根据提示,在右侧编辑器补充代码,完成分支程序设计(用函数调用的方式来实现)。 第1题: 闰年的判断:判断某一年是否是闰年,

    2024年02月08日
    浏览(37)
  • hnu计算机与人工智能概论答案2.20

    补一下第一次作业 第1关:数据输入与输出 第一题 在屏幕上输出字符串:hi, \\\"how are you\\\" ,I\\\'m fine and you 第二题 从键盘输入两个整数,计算两个数相除的商与余数 假设输入12,5 输出为 2 2 第三题 在屏幕上 输入一个三位数输出该数的个位、十位和百位数字 假设输入125 输出为 5 2

    2024年02月08日
    浏览(50)
  • hnu计算机与人工智能概论答案3.15

     终于肝完了!有一说一,这一次难度肉眼可见的提升,终于明白程序员为什么会秃顶了(头发真的禁不住薅啊),祝大家好运! 第1关:循环结构-while与for循环 第1题 编程计算如下公式的值1^2+3^2+5^2+...+995^2+997^2+999^2并输出结果 第2题 用 while 语句完成程序逻辑,求如下算法可

    2024年02月08日
    浏览(43)
  • hnu计算机与人工智能概论5.26(方程求根)

    第1关:用暴力搜索法求方程的近似根  本关任务:用暴力搜索法求 f(x)=x3−x−1 在[-10,10]之间的近似根。已知f(-10)0,f(10)0,画图可知函数在[-10,10]区间有且仅有一个根。要求近似根带入函数f(x)之后,函数值与0之间的误差在 10−6 之内,请保留4位小数输出该根值,并输出搜寻次

    2024年02月03日
    浏览(37)
  • 【人工智能概论】 使用kaggle提供的GPU训练神经网络

    注册账号的时候可能会遇到无法进行人际验证的问题,因此可能需要科学上网一下。具体步骤略。 kaggle的GPU资源需要绑定手机号才能使用 点击右上角的头像。 点击Account 找到手机验证界面Phone Verification,会看到下图,根据1处的提示知,这种情况下手机是收不到验证码的,因

    2024年02月04日
    浏览(45)
  • 【人工智能概论】 PyTorch可视化工具Tensorboard安装与简单使用

    Tensorboard原本是Tensorflow的可视化工具,但自PyTorch1.2.0版本开始,PyTorch正式内置Tensorboard的支持,尽管如此仍需手动安装Tensorboard。否则会报错。 ModuleNotFoundError: No module named ‘tensorboard’ 进入相应虚拟环境后,输入以下指令即可安装。 输入以下指令,不报错即说明安装成功。

    2023年04月24日
    浏览(43)
  • 【人工智能概论】 自编码器(Auto-Encoder , AE)

    自编码器结构图 自编码器是自监督学习的一种,其可以理解为一个试图还原其原始输入的系统。 其主要由编码器(Encoder)和解码器(Decoder)组成,其工作流程是将输入的数据 x 经编码器压缩成 y , y 再由解码器转化成 x* ,其目的是让 x* 和 x 尽可能相近。 注意:尽管自编码

    2024年02月04日
    浏览(32)
  • 【人工智能概论】 构建神经网络——以用InceptionNet解决MNIST任务为例

    两条原则,四个步骤。 从宏观到微观 把握数据形状 准备数据 构建模型 确定优化策略 完善训练与测试代码 InceptionNet的设计思路是通过增加网络宽度来获得更好的模型性能。 其核心在于基本单元Inception结构块,如下图: 通过纵向堆叠Inception块构建完整网络。 MNIST是入门级的

    2023年04月20日
    浏览(42)
  • NHU-Python(商)实验九-二维列表(计算与人工智能概论)

    任务描述 血压的正常范围是 60mmHg舒张压90mmHg 90mmHg收缩压140mmHg 输入小张测量血压的日期,舒张压和收缩压,存放到列表xy中 将小张血压不正常次数百分比计算并显示出来 将小张血压不正常的日期,舒张压和收缩压显示出来 例如输入 2020-1-1,80,100 2020-1-2,90,120 2020-1-3,100,150 202

    2024年02月04日
    浏览(36)
  • 【人工智能概论】 PyTorch中的topk、expand_as、eq方法

    对PyTorch中的tensor类型的数据都存在topk方法,其功能是按照要求取前k个最大值。 其最常用的场合就是求一个样本被网络认为的前k种可能的类别。 举例: torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) 其中: input: 是待处理的tensor数据; k: 指明要前k个数据及其index;

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包