趋近智
模型训练完成后,很自然地会问它学到了什么。哪些特征对其预测影响最大?梯度提升模型,尽管是许多决策树的集成,但并非完全的黑箱。我们可以对其进行审视,以明白哪些特征是其决策的最主要因素。此过程有助于验证模型,传递其结果,甚至指导未来的特征工程工作。
特征贡献度在梯度提升等基于树的集成模型中,通常根据特征对减少模型损失或不纯度的贡献程度来计算。Scikit-Learn的实现采用了一种称为“平均不纯度下降”或基尼贡献度的方法。
以下是其高层次工作原理:
分数越高,表示该特征越常用于进行有效的分割,因此模型对其的依赖程度也越大。
在拟合 GradientBoostingClassifier 或 GradientBoostingRegressor 后,您可以通过 feature_importances_ 属性获取特征贡献度分数。此属性返回一个NumPy数组,其中每个元素对应于特征在训练数据中出现的顺序的贡献度。
我们来看一个实际的例子。我们将在一个合成数据集上训练一个 GradientBoostingRegressor,然后检查特征贡献度。
from sklearn.datasets import make_regression
from sklearn.ensemble import GradientBoostingRegressor
import numpy as np
# 生成一个合成数据集
# 我们使第三个特征(索引2)信息量最大
X, y = make_regression(n_samples=1000, n_features=10, n_informative=3, random_state=42)
# 初始化并训练模型
gbr = GradientBoostingRegressor(n_estimators=100, random_state=42)
gbr.fit(X, y)
# 获取特征贡献度
importances = gbr.feature_importances_
# 为清晰起见创建特征名称列表
feature_names = [f'Feature {i}' for i in range(X.shape[1])]
# 打印特征贡献度
for name, score in zip(feature_names, importances):
print(f"{name}: {score:.4f}")
运行此代码将产生一个输出,显示10个特征中每个特征的归一化 (normalization)贡献度分数。您可能会看到,在数据生成时指定的信息量大的特征比其他特征具有明显更高的分数。
一长串数字可能难以理解。水平条形图是一种有效的方式,可以直观地显示和比较每个特征的相对贡献度。这使得模型认为哪些特征最具预测性变得一目了然。
我们可以使用上一个示例中的 importances 和 feature_names 来创建图表。下面的图表显示了一个典型输出。
特征根据其对模型预测能力的贡献进行排名。在这个例子中,特征2显然是最具影响力的。
尽管特征贡献度是一种有用的工具,但了解其局限性也很必要。
这部分内容有帮助吗?
feature_importances_ 属性获取特征重要性分数。© 2026 ApX Machine LearningAI伦理与透明度•