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

继续特征重要性分析的话题,本文和上一篇文章类似,龙套代码还是采用xgboost对泰坦尼克号数据进行分析。但是特征重要性分析的结果,则采用更加具有通用性的permutation_importance()

苏南大叔:permutation_importance(),如何衡量模型特征重要性? - 模型特征重要性
permutation_importance(),如何衡量模型特征重要性?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章。测试环境:python@3.12.3pandas@2.2.2numpy@1.26.4xlrd@2.0.1openpyxl@3.1.2scikit-learn@1.5.0xgboost@2.0.3

前文回顾

首先,需要明确的观点是:特征重要性分析并没有唯一的标准答案。正如每个模型都有不同的转确率一样。每种方法都可能得到不同的结果。主要回顾的文章是这篇:

文章里,使用xgboost对泰坦尼克号数据集进行预测的时候,使用了三种方案对其进行分析。

模型名基于参数booster.coef_.feature_importances_plot_importance()
gbtree树模型默认值不存在存在(越大越重要)存在(越大越重要)
gblinear线性模型非默认值存在(越小越重要)存在(越大越重要)存在(越大越重要)

对于其它模型来说,

  • .coef_属性和线性模型深度绑定。
  • .feature_importances_属性和树模型深度绑定。
  • plot_importance()方法和xgbooster深度绑定。

permutation_importance()

permutation_importance()方法来自于sklearn.inspection,所以它并不是和某种模型深度绑定的。是一个较为通用的算法表述。它是一种外部的特征重要性的观测方式。
其官方描述链接,如下:

原型如下:

sklearn.inspection.permutation_importance(estimator, X, y, *, scoring=None, n_repeats=5, n_jobs=None, random_state=None, sample_weight=None, max_samples=1.0)

permutation_importance()是一种基于排列的特征重要性计算方法,它不依赖于模型本身,而是通过随机打乱某个特征的值,观察模型的预测性能变化来评估该特征的重要性。permutation_importance()是一种模型无关的方法。

龙套代码

龙套代码如下,这里就不详细解释了。可以参考文章:

import pandas as pd
df = pd.read_csv("titanic.csv")

df = df.drop('Name', axis=1)
df = pd.get_dummies(df, columns=['Pclass', 'Sex'], drop_first=True)
target = df['Survived']
features = df.drop('Survived', axis=1)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.25, random_state=42)

import xgboost as xgb
model = xgb.XGBClassifier()
# model = xgb.XGBClassifier(booster='gbtree')
# model = xgb.XGBClassifier(booster='gblinear')
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(model.feature_importances_)

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rc('axes', unicode_minus=False)

permutation_importance()调用

本文虽然是以xgboost模型为例的。但是,需要知道的是:permutation_importance()是一个通用的第三方特征观测体系。并不是针对xgboost而设计的。

# model = xgb.XGBClassifier(booster='gbtree')
# ...
from sklearn.inspection import permutation_importance
perm_importance = permutation_importance(model, X_test, y_test)
sorted_idx = perm_importance.importances_mean.argsort()
plt.barh(features.columns[sorted_idx], perm_importance.importances_mean[sorted_idx])
plt.xlabel("Permutation Importance 测试")
plt.show()

这里也不是非要画图,只不过画图比较直观罢了。

from sklearn.inspection import permutation_importance
perm_importance = permutation_importance(model, X_test, y_test)
perm_importance = pd.Series(perm_importance.importances_mean, index=features.columns).sort_values()
print(perm_importance)

输出:

Pclass_2                  -0.010811
Fare                       0.004505
Age                        0.009910
Siblings/Spouses Aboard    0.009910
Parents/Children Aboard    0.012613
Pclass_3                   0.056757
Sex_male                   0.172973
dtype: float64

结果对比

gbtree的情况下,使用permutation_importance()进行特征重要性分析,结果是:

苏南大叔:permutation_importance(),如何衡量模型特征重要性? - gbtree
permutation_importance(),如何衡量模型特征重要性?(图3-2)

gbliner的情况下,使用permutation_importance()进行特征重要性分析,结果是:

苏南大叔:permutation_importance(),如何衡量模型特征重要性? - gbliner
permutation_importance(),如何衡量模型特征重要性?(图3-3)

结束语

更多苏南大叔的机器学习的文章,可以参考:

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

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

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

 【绝密】秘籍文章入口,仅传授于有缘之人   机器学习