我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

继续描述独立的xgboost模型,模型对数据的处理过程中,各个特征对最终结果的影响力是不同的。那么,这些特征的影响力里面,谁大谁小呢?换句话说,谁更重要呢?这就是本文讨论的问题。使用xgboost.plot_importance()来画个特征重要性排序图。

苏南大叔:如何使用xgboost的plot_importance函数?特征重要性排序 - plot_importance函数-特征重要性排序
如何使用xgboost的plot_importance函数?特征重要性排序(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码所学所想。本文测试环境:win10python@3.12.0pandas@2.1.3matplotlib@3.8.2xgboost@2.0.2

前文回顾

本文还是使用xgboost来处理鸢尾花数据集,所以主要的内容,可以参考下面的文章:

本文的结果可以表明:在选择任意两个特征画散点图的时候,可以有依据了。参考文章:

plot画图显示中文的事情,可以参考:

加载鸢尾花数据集

from sklearn.model_selection import train_test_split
import pandas as pd
data_url = "http://download.tensorflow.org/data/iris_training.csv"
column_names = ["萼长", "萼宽", "瓣长", "瓣宽", "种类"]
data = pd.read_csv(data_url, header=0, names=column_names)
# X = data.iloc[:, :-1].values              # ndarray
# y = data.iloc[:, -1:].values.flatten()    # ndarray
X = data.iloc[:, :-1]                       # dataframe
y = data.iloc[:, -1:]                       # dataframe
X_train, X_true, y_train, y_true = train_test_split(X, y, test_size=0.2, random_state=8)

这里其实有个细节,需要特别说明一下:
拿到的鸢尾花数据X,从原来的ndarray类型改成了dataframe类型。对预测的结果是没有任何影响的。否则也不可能这么多的预测模型方法,都是使用ndarray类型处理的数据。
但是,对于本文来说,是有一些影响。dataframe类型变量里面,携带了列名column的信息。对于本文结果的展示,有着更直观方便的影响。

苏南大叔:如何使用xgboost的plot_importance函数?特征重要性排序 - 结果截图
如何使用xgboost的plot_importance函数?特征重要性排序(图3-2)

xgboost的importance_type

本文是以讨论特征的重要性为目的的,而xgb.XGBClassifier()importance_type有着不同的取值。理论上是可以影响预测结果的。【当然,对于本文的鸢尾花数据集来说,似乎没有影响】

  • weight默认值,表示一个特征在所有树中被使用的次数。这个参数反映了该特征的重要性,因为如果一个特征被用于更多的树中,那么它对最终预测结果的贡献就更大。
  • gain,表示一个特征在所有树中对预测结果的平均增益。这个参数反映了该特征在每个节点上的分裂能力,因为如果一个特征在每个节点上的分裂能力越强,它对最终预测结果的贡献就越大。
  • cover,表示一个特征在所有树中对样本的平均覆盖度。这个参数反映了该特征对模型的覆盖能力,因为如果一个特征对更多的样本有影响,它对最终预测结果的贡献就更大。
import xgboost as xgb
# model = xgb.XGBClassifier(importance_type="weight")
# model = xgb.XGBClassifier(importance_type="gain")
# model = xgb.XGBClassifier(importance_type="cover")
model = xgb.XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_true)   # 预测结果其实在本文里面没那么重要了...

画图排序重要性【本文重点】

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]      # 显示中文
from xgboost import plot_importance
fig,ax = plt.subplots(figsize=(5,5))              # 纸张大小
plot_importance(model,ax=ax)                      # 必须写ax,否则画图奇怪输出
# plot_importance(model,ax=ax,max_num_features=2) # max_num_features控制输出的特征柱状图的数量
plt.show()

苏南大叔:如何使用xgboost的plot_importance函数?特征重要性排序 - 重要性排名代码
如何使用xgboost的plot_importance函数?特征重要性排序(图3-3)

这里需要说明的是:

  • xgboost模型进行数据填充的时候,是带着column信息的。所以,这里的图会显示对应的标签名。
  • ax是把plot_importance()和默认的plt画图对象进行关联的关键点。
  • 如果特征点很多的话,max_num_features就可以控制显示的特征点的数量。

从图的结果上来看,四个特征里面,最重要的两个特征是:"萼长"和"瓣长"。

结语

不想写结语,不知道写啥。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    ml