机器学习课程项目:随机森林中的特征重要性解析
mlcourse.ai Open Machine Learning Course 项目地址: https://gitcode.com/gh_mirrors/ml/mlcourse.ai
引言
在机器学习项目中,理解模型如何做出决策与模型性能本身同样重要。特征重要性分析是解释模型行为的关键技术之一,特别是在使用随机森林这类集成方法时。本文将深入探讨随机森林中特征重要性的计算原理、实现方法以及实际应用。
一、特征重要性的基本概念
特征重要性(Feature Importance)是指评估模型中各个输入特征对预测结果贡献程度的指标。在随机森林中,主要有两种计算特征重要性的方法:
- 基于不纯度减少的方法:通过计算每个特征在分裂节点时带来的不纯度(如基尼指数或信息熵)减少量来评估特征重要性
- 排列重要性(Permutation Importance):通过随机打乱某个特征的值并观察模型性能下降程度来评估特征重要性
二、基于不纯度减少的特征重要性
2.1 基本原理
在决策树的构建过程中,每次分裂都会选择能够最大程度减少不纯度的特征。随机森林通过聚合所有树中该特征带来的不纯度减少量,最终得到特征重要性评分。
具体计算步骤如下:
- 对于每棵树中的每个节点,计算分裂前后的不纯度减少量
- 将该减少量按到达该节点的样本数加权
- 对每个特征,累加其在所有树中所有相关节点上的加权不纯度减少量
- 最后将所有特征的重要性归一化
2.2 数学表达
对于单棵树t中的节点i,不纯度减少量(RI)计算为:
RIᵢ⁽ᵗ⁾ = wᵢ⁽ᵗ⁾·Iᵢ⁽ᵗ⁾ - w_LEFTᵢ⁽ᵗ⁾·I_LEFTᵢ⁽ᵗ⁾ - w_RIGHTᵢ⁽ᵗ⁾·I_RIGHTᵢ⁽ᵗ⁾
其中:
- w表示节点/子节点的加权样本数
- I表示节点/子节点的不纯度
特征j在树t中的重要性为:
FIⱼ⁽ᵗ⁾ = (∑RIᵢ⁽ᵗ⁾ for nodes splitting on j) / (∑RIᵢ⁽ᵗ⁾ for all nodes)
最终特征重要性是各树中该特征重要性的平均值。
三、排列重要性
3.1 基本原理
排列重要性通过以下步骤计算:
- 计算模型在验证集上的基准性能
- 对某个特征的值进行随机排列(打乱顺序)
- 使用打乱后的数据重新评估模型性能
- 计算性能下降程度作为该特征的重要性
3.2 数学表达
对于树t,特征Xⱼ的排列重要性为:
PI⁽ᵗ⁾(Xⱼ) = (准确率before - 准确率after) / |OOB样本|
其中:
- 准确率before是使用原始数据的预测准确率
- 准确率after是特征Xⱼ值被打乱后的预测准确率
- OOB(Out-of-Bag)样本是指未参与该树训练的数据
四、实际案例:鸢尾花数据集
让我们通过sklearn中的鸢尾花数据集来演示特征重要性的计算过程。
4.1 数据准备
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
data = pd.DataFrame(iris.data, columns=iris.feature_names)
target = pd.Series(iris.target).map({0:0, 1:0, 2:1}) # 转换为二分类问题
4.2 构建随机森林模型
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators=3, max_depth=3, random_state=17)
rfc.fit(data, target)
4.3 分析单棵树的重要性
以第一棵树为例,我们可以手动计算各特征的重要性:
-
Sepal length (cm)出现在节点0和8:
- 节点0的RI = 0.203578
- 节点8的RI = 0.001667
- 总RI = 0.205244
-
Petal length (cm)的RI = 0.035785
-
Petal width (cm)的RI = 0.219453
归一化后得到各特征在该树中的重要性:
- Sepal length: 0.445716
- Petal length: 0.077712
- Petal width: 0.476572
4.4 比较sklearn计算结果
print(iris.feature_names)
print(rfc.feature_importances_)
输出结果与我们手动计算的一致,验证了我们的理解。
五、实际应用:旅舍评分分析
让我们看一个更实际的例子,分析影响旅舍评分的因素。
5.1 数据准备
hostel_data = pd.read_csv("hostel_factors.csv")
features = {
"f1": "Staff",
"f2": "Hostel booking",
# 其他特征...
}
5.2 构建模型并分析重要性
from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor(n_estimators=1000, max_features=10, random_state=0)
forest.fit(hostel_data.drop(["hostel", "rating"], axis=1), hostel_data["rating"])
importances = forest.feature_importances_
5.3 可视化结果
import matplotlib.pyplot as plt
plt.figure(figsize=(15,5))
plt.title("Feature Importance")
bars = plt.bar(range(10), importances[indices[:10]], align="center")
plt.xticks(range(10), feature_indices)
plt.legend(bars, [features["f"+str(i)] for i in feature_indices])
分析结果显示,员工服务(Staff)和性价比(Value for money)是影响旅舍总体评分的最重要因素。
六、总结
特征重要性分析是理解随机森林模型行为的有力工具。本文介绍了两种主要方法:
- 基于不纯度减少的方法:计算简单,直接反映特征在决策过程中的作用
- 排列重要性:更可靠,不易受特征尺度影响,但计算成本较高
在实际应用中,我们可以:
- 识别对预测最重要的特征
- 进行特征选择,简化模型
- 获得业务洞察,指导决策
理解这些技术将帮助您更好地解释模型行为,并做出更明智的数据驱动决策。
mlcourse.ai Open Machine Learning Course 项目地址: https://gitcode.com/gh_mirrors/ml/mlcourse.ai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考