用Python实现9大回归算法详解——08. 随机森林回归算法

1. 随机森林回归的基本概念

随机森林回归(Random Forest Regression)是一种集成学习方法,基于多棵决策树的组合来进行预测。它通过引入随机性来构建多棵独立的决策树,并将这些树的预测结果进行平均,从而提升模型的泛化能力并降低过拟合的风险。

随机森林回归的核心思想是通过引入两种随机性来创建一个强大的预测模型:

  1. 样本随机性:通过从原始数据集中有放回地随机抽取样本(即自助法或Bootstrap)来生成不同的训练数据集。
  2. 特征随机性:在构建每棵决策树时,随机选择部分特征来进行分裂。

2. 随机森林回归的算法流程

(1)样本抽取: 从原始数据集中有放回地随机抽取多个样本,生成多个子数据集。

样本抽取公式:

D^{(b)} = \{ (\mathbf{x}_i, y_i) \mid i \in S_b \}

其中 S_b​ 是第 b 个子数据集的样本索引集合。

(2)决策树构建: 对于每个子数据集,使用决策树算法构建回归树。在每个节点分裂时,随机选择一部分特征,选择最佳特征进行分裂。

特征选择公式:

\text{Split Feature} = \arg\min_{j \in \text{Random Subset}} \sum_{i=1}^{m} \left( y_i - \hat{y}_i \right)^2

(3)集成预测: 所有树训练完成后,对新输入的数据点,分别使用每棵决策树进行预测,然后对所有预测结果进行平均,得到最终的预测值。

最终预测公式:

\hat{y}^{(b)}(\mathbf{x}) = \frac{1}{|L_b(\mathbf{x})|} \sum_{i \in L_b(\mathbf{x})} y_i

其中,\hat{y}^{(b)}(\mathbf{x}) 是第 b 棵决策树的预测结果。

3. 随机森林回归的数学表达

随机森林回归的基本公式包括:

(1)样本抽取: 从原始数据集中有放回地随机抽取样本生成子数据集:

D^{(b)} = \{ (\mathbf{x}_i, y_i) \mid i \in S_b \}

其中:

  • D^{(b)} 是第 b 个子数据集。
  • S_b​ 是第 b 个子数据集的样本索引集合。

(2)决策树的训练: 对于每棵决策树,利用随机抽取的特征集合进行分裂,生成回归树。 特征选择:

\text{Split Feature} = \arg\min_{j \in \text{Random Subset}} \sum_{i=1}^{m} \left( y_i - \hat{y}_i \right)^2

其中:

  • j 是特征索引。
  • m 是当前节点中的样本数。
  • y_i 是第 i 个样本的真实值。
  • \hat{y}_i 是根据特征 j 进行分裂后的预测值。

(3)最终预测: 对于新数据点的预测结果是所有决策树预测结果的平均值:

\hat{y} = \frac{1}{B} \sum_{b=1}^{B} \hat{y}^{(b)}(\mathbf{x})

其中:

  • \hat{y}​ 是输入样本 \mathbf{x} 的最终预测值。
  • B 是决策树的数量。
  • \hat{y}^{(b)}(\mathbf{x}) 是第 b 棵树的预测值

4. 随机森林回归的优缺点

优点

  1. 高准确度:随机森林通过结合多棵决策树,显著提升了模型的预测准确度。
  2. 抗过拟合:由于引入了随机性,随机森林相比单棵决策树更加抗过拟合,能够更好地泛化到未见的数据。
  3. 能够处理高维数据:随机森林在特征维度较高的情况下仍然能够有效工作。

缺点

  1. 计算复杂度高:由于随机森林需要训练多棵决策树,因此计算成本较高,尤其是在数据量大时。
  2. 模型解释性较差:随机森林的集成机制使得模型难以解释,不容易理解每个特征对预测结果的影响。

5. 随机森林回归案例

我们将通过一个具体的案例来展示如何使用随机森林回归进行预测,并对结果进行详细分析。

5.1 数据加载与预处理

我们使用加利福尼亚州房价数据集(California Housing Dataset)进行回归预测。

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 加载加利福尼亚州房价数据集
housing = fetch_california_housing()
X, y = housing.data, housing.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

解释

  • 数据加载:我们选择加利福尼亚州房价数据集,该数据集包含加利福尼亚州的房屋特征数据,用于预测房屋的价格中位数。
  • 数据划分:将数据集划分为训练集和测试集,80% 的数据用于训练,20% 的数据用于测试。
5.2 模型训练与预测

我们使用 RandomForestRegressor 进行模型训练,并对测试集进行预测。

# 定义随机森林回归模型
rfr = RandomForestRegressor(n_estimators=100, random_state=42)

# 训练模型
rfr.fit(X_train, y_train)

# 对测试集进行预测
y_pred = rfr.predict(X_test)

解释

  • 模型定义RandomForestRegressor 是随机森林回归的实现,我们指定 n_estimators=100 来训练 100 棵决策树。
  • 模型训练:使用训练集数据进行模型训练,构建随机森林模型。
  • 模型预测:训练完成后,使用模型对测试集进行预测,得到预测值。
5.3 模型评估与结果分析

我们使用均方误差(MSE)和决定系数(R^2)来评估模型的性能。

# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

输出:

均方误差 (MSE): 0.2553684927247781
决定系数 (R²): 0.8051230593157366

解释

  • 均方误差 (MSE):模型的预测误差为 0.255,表明模型对测试集的预测较为准确。
  • 决定系数 (R²):模型的 R^2 值为 0.805,说明模型能够解释 80.5% 的目标变量方差,模型拟合效果较好。
5.4 特征重要性分析

随机森林还可以用于评估特征的重要性。我们可以输出每个特征的重要性得分,并进行可视化展示。

import matplotlib.pyplot as plt
import numpy as np

# 输出特征重要性
importances = rfr.feature_importances_
indices = np.argsort(importances)[::-1]

# 打印每个特征的重要性
for f in range(X.shape[1]):
    print(f"特征 {f + 1}: {housing.feature_names[indices[f]]} ({importances[indices[f]]})")

# 可视化特征重要性
plt.figure()
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), [housing.feature_names[i] for i in indices], rotation=90)
plt.xlim([-1, X.shape[1]])
plt.show()

 输出:

特征 1: MedInc (0.5248714775266793)
特征 2: AveOccup (0.1384428140532659)
特征 3: Latitude (0.08893574160843591)
特征 4: Longitude (0.08862881090121001)
特征 5: HouseAge (0.05459321807686177)
特征 6: AveRooms (0.04427184750632705)
特征 7: Population (0.030649781480378356)
特征 8: AveBedrms (0.0296063088468417)

 

解释

  • 特征重要性:随机森林通过计算每棵树中某个特征对分裂的重要性,来衡量该特征的重要性得分。重要性得分越高,说明该特征对最终预测结果的贡献越大。
  • 可视化:通过条形图的形式,展示各个特征的重要性,帮助理解哪些特征对预测房价最重要。
5.5 结果可视化

我们还可以通过绘制预测值与实际值的散点图,来进一步验证模型的表现。

# 绘制预测值与实际值的散点图
plt.scatter(y_test, y_pred, color="blue", alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel("Actual")
plt.ylabel("Predicted")
plt.title("Random Forest Regression: Actual vs Predicted")
plt.show()

 

可视化解释

  • 散点图:横轴表示测试集的实际房价,纵轴表示模型预测的房价。每个点代表一个测试样本的预测结果。
  • 红色虚线:表示理想情况下,预测值应与实际值完全一致的参考线(即 y = x 的线)。
  • 分析:如果大多数散点分布在红色虚线附近,说明模型的预测效果良好。分布越集中,预测的准确性越高。
5.6 参数调优

为了进一步提升模型性能,我们可以通过网格搜索(Grid Search)来调优随机森林的超参数,如树的数量(n_estimators)、最大深度(max_depth)等。

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'bootstrap': [True, False]
}

# 实例化随机森林回归模型
rfr = RandomForestRegressor(random_state=42)

# 进行网格搜索
grid_search = GridSearchCV(estimator=rfr, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("最佳参数:", grid_search.best_params_)

解释

  • 参数网格:我们定义了多个超参数的组合来构建参数网格,包括树的数量、最大深度、分裂节点所需的最小样本数等。
  • 网格搜索:通过 5 折交叉验证(cv=5),网格搜索从参数网格中找到最佳的参数组合。
  • 输出最佳参数:模型训练完成后,输出最佳的参数组合,这些参数可以用于构建性能更优的模型。

6. 总结

随机森林回归是一种强大的回归算法,通过结合多棵决策树的预测结果来提升模型的性能。它能够有效处理高维数据,并具有较强的抗过拟合能力。通过合理调优模型的参数,随机森林回归可以在各种回归任务中表现出色。尽管计算复杂度较高,但其强大的泛化能力和稳定性使其成为许多回归任务中的首选算法之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值