XGBoost特征重要性的实现原理?

日期: 2024-04-04 17:08:03|浏览: 130|编号: 42323

友情提醒:信息内容由网友发布,请自鉴内容实用性。

XGBoost特征重要性的实现原理?

是一个梯度提升库。它提供了可以解决机器学习任务的并行提升树算法。它支持多种语言,例如:C++、Java、、R、Julia、Scala。本文介绍如何在 中从 模型中获取特征重要性。

使用 -learn 中 数据集计算特征重要性:

内置功能的重要性

import numpy as np
import pandas as pd
import shap
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.inspection import permutation_importance
from matplotlib import pyplot as plt
import seaborn as sns
from xgboost import XGBRegressor

加载 数据集并将其拆分为训练和测试子集。75% 的数据将用于训练,其余用于测试。

boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=12)

安装 回归器很简单,只需 2 行代码

xgb = XGBRegressor(n_estimators=100)
xgb.fit(X_train, y_train)

在 中使用了默认的超参数,并且只设置了模型中的树数 ( =100)。

从 模型中使用 获取特征重要性:

xgb.feature_importances_
array([0.01690426, 0.00777439, 0.0084541 , 0.04072201, 0.04373369,
       0.20451033, 0.01512331, 0.04763542, 0.01018296, 0.02332482,
       0.04085794, 0.01299683, 0.52778   ], dtype=float32)

与 -learn 模型的 API 接口相同,例如在随机森林中可是使用同样的方法获取特征重要性。

使用条形图方式观察特征重要性更加直观

plt.barh(boston.feature_names, xgb.feature_importances_)

根据重要性值对特征进行排序获取更优的观察方式:

sorted_idx = xgb.feature_importances_.argsort()
plt.barh(boston.feature_names[sorted_idx], xgb.feature_importances_[sorted_idx])
plt.xlabel("Xgboost Feature Importance")

内置功能基于排列的特征重要性 (with -learn)

可以在 上使用 ce , 实现了 -learn(0.22版本) 接口 API。

这种排列方法将随机打乱每个特征并计算模型性能的变化,对性能影响最大的特性是最重要的特性,而且可以很容易地计算出来并可视化:

perm_importance = permutation_importance(xgb, X_test, y_test)
sorted_idx = perm_importance.importances_mean.argsort()
plt.barh(boston.feature_names[sorted_idx], perm_importance.importances_mean[sorted_idx])
plt.xlabel("Permutation Importance")

基于排列的重要性比较复杂,检查数据集中的相关性:

def correlation_heatmap(train):
    correlations = train.corr()
    fig, ax = plt.subplots(figsize=(10,10))
    sns.heatmap(correlations, vmax=1.0, center=0, fmt='.2f', cmap="YlGnBu",
                square=True, linewidths=.5, annot=True, cbar_kws={"shrink": .70}
                )
    plt.show();
correlation_heatmap(X_train[boston.feature_names[sorted_idx]])

根据上述结果,理论上会剔除ZN、CHAS、AGE、INDUS。它们基于排列的重要性非常低,并且与其他特征的相关性不高(abs(corr) < 0.8)。

在 包 mljar- 中,做了一个特征选择技巧:将随机特征插入到训练数据中,并检查哪些特征的重要性低于随机特征。我将这些从进一步的培训中删除,与 算法 中使用的技巧非常相似。

使用 SHAP 值计算的特征重要性

在 中计算特征重要性的第三种方法是使用 SHAP包。它与模型无关,并使用博弈论中的 值来估计每个特征对预测的贡献。

explainer = shap.TreeExplainer(xgb)
shap_values = explainer.shap_values(X_test)

为了可视化特征重要性,我们需要使用 方法:

shap.summary_plot(shap_values, X_test, plot_type="bar")

提醒:请联系我时一定说明是从浚耀商务生活网上看到的!