背景
什么是随机森林?
随机森林是一种属于树模型的集成学习算法,它通过构建多棵决策树来进行预测,其核心原理是利用 Bagging(自助法)从训练数据中随机抽取多个子集,训练多棵树,每棵树在分裂节点时随机选择部分特征,以增加模型的多样性,最终,分类任务通过多数投票,回归任务通过平均值得出预测结果
随机森林作为树模型的一种,具备通过特征重要性评估来衡量各个特征对预测结果贡献的能力,这也是树模型的一个显著特点
为什么要获取特征贡献度?
获取特征贡献度可以帮助我们了解模型中哪些特征对预测结果影响最大,提升模型的解释性,有助于优化模型、去除不重要特征,并为决策提供依据,此外,它还能揭示数据中的潜在关系,帮助更好地理解业务问题
特征贡献度的计算方式
随机森林的特征贡献度通过衡量每个特征在所有树中 减少节点不纯度 的程度来计算,不纯度通常用均方误差(回归)或基尼系数(分类)来表示,当某个特征用于节点分裂时,模型会计算使用该特征后,节点不纯度的减少量,并将其累计到该特征的贡献度上,最终,每个特征的贡献度是所有树中节点不纯度减少的平均值
代码实现
数据读取并分割
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('气象、环境、火灾烧毁.xlsx')
# 划分特征和目标变量
X = df.drop(['month', 'day', 'area'], axis=1)
y = df['area']
# 划分训练集和测试集
# 注意:random_state=42 是为了确保结果的可复现性,并且针对该数据集进行了特定处理。读者在使用自己的数据时,可以自由修改此参数。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42)
df.head()
"这个数据集包含了气象、环境和火灾信息,其中X、Y表示地理位置,month和day是日期信息,FFMC、DMC、DC、ISI是火灾相关的气象指数,temp表示温度,RH是湿度,wind是风速,rain是降雨量,area是火灾烧毁的面积,在建模时,我们未使用日期信息(month 和 day)
模型建立
from sklearn.ensemble import RandomForestRegressor
# 创建随机森林回归器实例,并设置参数
rf_regressor = RandomForestRegressor(
n_estimators=100, # 'n_estimators'是森林中树的数量。默认是100,可以根据需要调整。
criterion='squared_error', # 'criterion'参数指定用于拆分的质量指标。'squared_error'(默认)表示使用均方误差,另一选项是'absolute_error'。
max_depth=None, # 'max_depth'限制每棵树的最大深度。'None'表示不限制深度。
min_samples_split=2, # 'min_samples_split'指定一个节点分裂所需的最小样本数。默认是2。
min_samples_leaf=1, # 'min_samples_leaf'指定叶子节点所需的最小样本数。默认是1。
min_weight_fraction_leaf=0.0, # 'min_weight_fraction_leaf'与'min_samples_leaf'类似,但基于总样本权重。默认是0.0。
random_state=42, # 'random_state'控制随机数生成,以便结果可复现。42是一个常用的随机种子。
max_leaf_nodes=None, # 'max_leaf_nodes'限制每棵树的最大叶子节点数。'None'表示不限制。
min_impurity_decrease=0.0 # 'min_impurity_decrease'在分裂节点时要求的最小不纯度减少量。默认是0.0。
)
# 训练模型
rf_regressor.fit(X_train, y_train)
创建一个随机森林回归模型并使用训练集(X_train 和 y_train)来训练该模型
获取特征重要性
# 获取特征的重要性
feature_importances = rf_regressor.feature_importances_
# 将特征和其重要性一起排序
sorted_indices = np.argsort(feature_importances)[::-1] # 逆序排列,重要性从高到低
sorted_features = X_train.columns[sorted_indices]
sorted_importances = feature_importances[sorted_indices]
# 打印排序后的特征及其重要性
for feature_name, importance in zip(sorted_features, sorted_importances):
print(f"Feature: {feature_name}, Importance: {importance:.4f}")
主要通过 rf_regressor.feature_importances_,获取每个特征对模型预测贡献的权重值,即特征的重要性,最后将特征从高到低进行排序,并输出结果
特征重要性可视化
# 绘制按重要性排序的特征贡献性柱状图
plt.figure(figsize=(10, 6), dpi=1200)
plt.barh(sorted_features, sorted_importances, color='steelblue')
plt.xlabel('Importance', fontsize=14)
plt.ylabel('Features', fontsize=14)
plt.title('Sorted Feature Importance', fontsize=16)
plt.gca().invert_yaxis()
plt.savefig("Sorted Feature Importance.pdf", format='pdf',bbox_inches='tight')
# 显示图表
plt.show()
通过 plt.barh() 绘制按重要性排序的特征贡献柱状图,并保存为 PDF 文件,图表显示了各个特征对随机森林模型预测火灾面积的相对重要性
结果说明:图中显示 DMC(湿润度代码)、temp(温度)和 RH(相对湿度)是对火灾面积预测贡献最大的特征,而 rain(降雨量)对模型的影响最小
在这个图表和代码中,作者对原始数据进行了特定处理,部分步骤未展示,因为主要目的是为了演示如何从随机森林模型中获取特征的重要性,因此,当前结果并不具有实际意义,主要用于帮助读者理解获取特征重要性的过程,希望读者能够将这一过程应用到自己的项目中,从而获得对实际问题有意义的结果
往期推荐
复现 Nature 图表可视化——基于模型残差分析与显著性检验的模型解释
不止 SHAP 力图:LIME 实现任意黑盒模型的单样本解释
微信号|deep_ML
欢迎添加作者微信进入Python、ChatGPT群
进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考