机器学习————随机森林
一、核心概念
随机森林(Random Forest)是集成学习中 “装袋法” 的经典应用,核心是 “随机”+“森林”。
- 森林:由多棵决策树组成的 “树集合”,最终预测结果由所有树的结果投票(分类)或平均(回归)得到;
- 随机:
-
样本随机:对原始训练集进行有放回抽样,每棵树用不同的样本子集训练;
- 特征随机:每棵树在分裂节点时,只从随机选取的特征子集里选择最优分裂特征,而非全部特征。
-
- 任务目标:通过 “随机化” 降低单棵决策树的过拟合风险,同时利用多棵树的 “集体智慧” 提升模型的稳定性和泛化能力。
(注:装袋法是集成学习的经典方法,通过有放回抽样从原始训练集生成多个不同的样本子集,为每个子集训练一棵独立的基学习器(如决策树),最终通过分类任务或回归任务整合所有基学习器的预测结果,其核心逻辑是利用基学习器之间的随机性降低单模型的过拟合风险、提升模型的稳定性和泛化能力,随机森林就是装袋法以决策树为基学习器,并在特征维度增加随机化的典型应用。)
二、数学原理
1. 基础:单棵决策树的分裂准则
随机森林的基学习器是决策树,常用分裂准则:
分类任务中使用基尼系数(Gini Impurity),回归任务使用均方误差(MSE)。
(注:不明白基尼系数和均方误差的话,大家可以看上一节的决策树,里面有提到。)
2. 随机森林的数学逻辑
任务假设:随机森林有M棵决策树。
- 分类任务:采用多数投票法,最终预测类别:
其中 I(⋅) 是指示函数,满足则为 1,否则为 0;
- 回归任务:采用简单平均法,最终预测值为
;
3. 泛化能力的数学保障
随机森林通过 “样本随机” 和 “特征随机” 让每棵树之间的相关性降低,同时保证单棵树的预测能力。
最终集成模型的泛化误差满足:
;
其中是单棵树的平均误差,ρ 是树之间的平均相关系数。
使用原理:随机化降低 ρ,从而降低整体误差。
三、代码解释——以分类任务为例
模块一:导入必要的库
import numpy as np # 数值计算基础库
from sklearn.datasets import load_iris # 导入鸢尾花数据集(经典分类数据集)
from sklearn.ensemble import RandomForestClassifier # 随机森林分类器
from sklearn.model_selection import train_test_split # 划分训练集/测试集
from sklearn.metrics import accuracy_score # 计算分类准确率
模块二:加载并预处理数据
X = iris.data为提取特征矩阵,赋值给变量X。
维度说明:X.shape输出(150, 4),表示 150 个样本,每个样本有 4 个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。
y = iris.target为取标签向量,赋值给变量y。
标签含义:0对应setosa(山鸢尾)、1对应versicolor(变色鸢尾)、2对应virginica(维吉尼亚鸢尾),可通过iris.target_names查看。
# 加载鸢尾花数据集:包含4个特征(花萼长度和宽度、花瓣长度和宽度),3类鸢尾花标签
iris = load_iris()
X = iris.data # 特征矩阵,形状(150,4),150个样本,4个特征
y = iris.target # 标签向量,形状(150,),取值0、1、2对应3类鸢尾花
# 划分训练集和测试集:测试集占30%,随机种子固定
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42 # random_state=42是常用的固定随机种子
)
模块三:初始化随机森林分类器
n_estimators=100,数量越多,模型越稳定,集成效果越好,但训练时间和内存占用会增加;通常先设 100,若效果不足可增加到 200/500,若速度慢可减少到 50。
max_depth=5,防止单棵树 “生长过深” 导致过拟合(比如把训练集的噪声也学习进去);鸢尾花数据集简单,设 5 足够,复杂数据集可设10或20,或用None(不限制)。
max_features='sqrt',每棵决策树在分裂节点时,随机选择的特征数量。
n_jobs=-1,训练模型时使用的 CPU 核心数;-1表示使用所有可用核心,1表示单核心。
rf_model = RandomForestClassifier(
n_estimators=100, # 森林中决策树的数量,默认100,数量越多效果越稳定,但缺点是计算量增加.
max_depth=5, # 单棵树的最大深度,限制深度防止过拟合
max_features='sqrt', # 每棵树分裂时随机选的特征数:sqrt为总特征数,是分类任务的默认值
random_state=42, # 固定随机种子,保证每次运行结果一致
n_jobs=-1 # 使用所有CPU核心并行训练,加速模型训练
)
模块四: 训练模型
用训练集的特征(X_train)和标签(y_train)训练随机森林模型。
底层逻辑:
- 对训练集进行多次 Bootstrap 抽样,生成 100 个样本子集;
- 为每个子集训练一棵决策树(分裂时随机选特征);
- 所有树训练完成后,整合到rf_model中。
rf_model.fit(X_train, y_train)
模块五:模型预测
y_pred = rf_model.predict(X_test) # 对测试集做预测
y_pred_proba = rf_model.predict_proba(X_test) # 输出每个样本属于各类别的概率
模块六:评估模型性能
accuracy = accuracy_score(y_test, y_pred) # 计算准确率:正确预测数和总样本数
print(f"随机森林模型测试集准确率:{accuracy:.4f}") # 输出准确率,并保留4位小数
模块七:查看特征重要性
feature_importance = rf_model.feature_importances_
feature_names = iris.feature_names
# 打印每个特征的重要性
for name, importance in zip(feature_names, feature_importance):
print(f"特征 {name} 的重要性:{importance:.4f}")
运行结果:
随机森林模型测试集准确率:1.0000
特征 sepal length (cm) 的重要性:0.1046
特征 sepal width (cm) 的重要性:0.0415
特征 petal length (cm) 的重要性:0.4173
特征 petal width (cm) 的重要性:0.4366
(注:准确率为100%的核心原因是鸢尾花数据集本身简单可分,花瓣相关特征能清晰区分 3 类样本;)
结语
我只对随机森林进行了简单的讲解,大家有不明白的可以评论留言。代码部分,我只以分类任务为例,如果对回归任务有需求,大家也可以留言。谢谢大家的观看!
更多推荐

所有评论(0)