permutation_importance(),如何衡量模型特征重要性?
发布于 作者:苏南大叔 来源:程序如此灵动~继续特征重要性分析的话题,本文和上一篇文章类似,龙套代码还是采用xgboost
对泰坦尼克号数据进行分析。但是特征重要性分析的结果,则采用更加具有通用性的permutation_importance()
。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章。测试环境:python@3.12.3
,pandas@2.2.2
,numpy@1.26.4
,xlrd@2.0.1
,openpyxl@3.1.2
,scikit-learn@1.5.0
,xgboost@2.0.3
。
前文回顾
首先,需要明确的观点是:特征重要性分析并没有唯一的标准答案。正如每个模型都有不同的转确率一样。每种方法都可能得到不同的结果。主要回顾的文章是这篇:
文章里,使用xgboost
对泰坦尼克号数据集进行预测的时候,使用了三种方案对其进行分析。
模型名 | 基于 | 参数booster | .coef_ | .feature_importances_ | plot_importance() |
---|---|---|---|---|---|
gbtree | 树模型 | 默认值 | 不存在 | 存在(越大越重要) | 存在(越大越重要) |
gblinear | 线性模型 | 非默认值 | 存在(越小越重要) | 存在(越大越重要) | 存在(越大越重要) |
对于其它模型来说,
.coef_
属性和线性模型深度绑定。.feature_importances_
属性和树模型深度绑定。plot_importance()
方法和xgbooster
深度绑定。
permutation_importance()
permutation_importance()
方法来自于sklearn.inspection
,所以它并不是和某种模型深度绑定的。是一个较为通用的算法表述。它是一种外部的特征重要性的观测方式。
其官方描述链接,如下:
- https://scikit-learn.org/stable/modules/permutation_importance.html#permutation-importance
- https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html
原型如下:
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()
进行特征重要性分析,结果是:
在gbliner
的情况下,使用permutation_importance()
进行特征重要性分析,结果是:
结束语
更多苏南大叔的机器学习的文章,可以参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。