python回归算法_随机森林回归

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。


分类与回归算法

机器学习中的分类与回归算法是两种主要的监督学习任务,它们分别用于解决不同类型的问题。以下是这两种算法的总结:

  1. 分类算法
    分类算法用于将数据分成不同的类别,适用于输出为离散标签的问题。常见的分类算法包括:

    1. 逻辑回归:使用逻辑函数来估计概率,用于二分类问题,也可以扩展到多分类问题。
    2. 支持向量机(SVM):通过找到最优的决策边界来最大化样本的分类准确率,适用于高维数据。
    3. 决策树:通过树结构来进行决策,每个节点代表一个特征的选择,叶子节点代表分类结果。
    4. 随机森林:由多个决策树组成的集成学习方法,通过投票来决定最终分类结果。
    5. 梯度提升决策树(GBDT):通过构建和结合多个弱学习器来形成强学习器,适用于分类和回归问题。
    6. 朴素贝叶斯:基于贝叶斯定理,假设特征之间相互独立,适用于文本分类等场景。
    7. K近邻(KNN):根据样本之间的距离进行分类,适用于小规模数据集。
    8. 神经网络:通过多层感知机学习数据的复杂模式,适用于图像、语音等复杂分类问题。
  2. 回归算法
    回归算法用于预测连续数值输出,适用于输出为连续变量的问题。常见的回归算法包括:

    1. 线性回归:通过拟合一条直线来预测目标变量的值,是最简单的回归方法。
    2. 岭回归:线性回归的扩展,通过引入L2正则化项来防止过拟合。
    3. Lasso回归:线性回归的另一种扩展,通过引入L1正则化项来进行特征选择。
    4. 弹性网回归:结合了岭回归和Lasso回归,同时引入L1和L2正则化项。
    5. 决策树回归:使用决策树结构来进行回归预测,适用于非线性关系。
    6. 随机森林回归:由多个决策树组成的集成学习方法,通过平均来决定最终回归结果。
    7. 梯度提升决策树回归(GBDT回归):通过构建和结合多个弱学习器来形成强学习器,适用于回归问题。
    8. 支持向量回归(SVR):支持向量机在回归问题上的应用,通过找到最优的决策边界来最大化样本的回归准确率。
    9. 神经网络回归:通过多层感知机学习数据的复杂模式,适用于复杂的回归问题。
  3. 分类与回归算法的比较

    • 输出类型:分类算法输出离散标签,回归算法输出连续数值。
    • 评估指标:分类算法常用准确率、召回率、F1分数等指标,回归算法常用均方误差(MSE)、均方根误差(RMSE)等指标。
    • 问题类型:分类算法适用于类别预测问题,如垃圾邮件检测;回归算法适用于数值预测问题,如房价预测。 在实际应用中,选择分类还是回归算法取决于问题的性质和需求。有时,可以将回归问题转化为分类问题,或者将分类问题转化为回归问题,具体取决于问题的特点和目标。

随机森林回归算法与分类算法

随机森林分类算法可参见:python_随机森林

随机森林(RandomForest)是一种基于决策树的集成学习方法,既可以用于回归任务,也可以用于分类任务。尽管它们的基本思想相似,但在具体实现和应用上存在一些关键区别。以下是随机森林回归算法与随机森林分类算法的主要区别:

  1. 目标不同

    • 随机森林回归:用于解决回归问题,目标是预测连续值(如房价、温度等)。
    • 随机森林分类:用于解决分类问题,目标是预测离散类别(如邮件是否为垃圾邮件、图像属于哪个类别等)。
  2. 输出结果不同

    • 随机森林回归:最终的输出是所有决策树预测值的平均值。
    • 随机森林分类:最终的输出是通过投票机制决定的类别,即选择得票最多的类别作为预测结果。
  3. 决策树的构建方式不同

    • 随机森林回归:在构建每棵决策树时,使用方差减少(Variance Reduction)作为分裂标准,选择能够最大程度减少目标变量方差的特征进行分裂。
    • 随机森林分类:在构建每棵决策树时,通常使用基尼不纯度(Gini Impurity)或信息增益(Information Gain)作为分裂标准,选择能够最大程度减少类别不确定性的特征进行分裂。
  4. 评估指标不同

    • 随机森林回归:常用的评估指标包括均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)等。
    • 随机森林分类:常用的评估指标包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1分数等。
  5. 叶子节点的值不同

    • 随机森林回归:叶子节点的值是训练样本目标变量的平均值。
    • 随机森林分类:叶子节点的值是训练样本中多数类别的标签。
  6. 应用场景不同

    • 随机森林回归:适用于需要预测连续值的场景,如股票价格预测、温度预测等。
    • 随机森林分类:适用于需要预测离散类别的场景,如垃圾邮件分类、疾病诊断等。
  7. 参数设置不同

    • 随机森林回归:某些参数(如分裂标准)可能与分类不同,需要根据回归任务的特点进行调整。
    • 随机森林分类:参数设置通常针对分类任务进行优化,如类别权重、分类阈值等。
  8. 总结
    随机森林回归和分类的核心思想相同,都是通过集成多棵决策树来提高模型的泛化能力。但由于任务性质不同,它们在分裂标准、输出结果、评估指标等方面存在显著差异。理解这些区别有助于在实际应用中选择合适的算法并优化模型性能。

随机森林回归算法

随机森林回归算法(Random Forest Regression)是一种基于决策树的集成学习方法,旨在通过构建多棵决策树并对其结果进行平均来预测连续值。以下是随机森林回归算法的原理,结合相关数学公式进行讲解。


  1. 基本思想
    随机森林回归通过以下步骤构建模型:
  2. 从训练数据中随机抽取多个样本子集(Bootstrap抽样)。
  3. 为每个样本子集构建一棵回归决策树。
  4. 在每棵树的分裂过程中,随机选择特征子集进行分裂。
  5. 对所有树的预测结果取平均值,作为最终的预测值。

  1. Bootstrap抽样
    假设训练数据集为 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } D = \{(x_1, y_1), (x_2, y_2), \dots, (x_N, y_N)\} D={(x1,y1),(x2,y2),,(xN,yN)},其中 x i x_i xi 是特征向量, y i y_i yi 是目标值。随机森林从 D D D 中进行有放回的随机抽样,生成 T T T 个样本子集 D 1 , D 2 , … , D T D_1, D_2, \dots, D_T D1,D2,,DT

  1. 回归决策树的构建
    对于每个样本子集 D t D_t Dt,构建一棵回归决策树。回归树的分裂目标是最大化目标变量的方差减少。

分裂标准:方差减少
假设一个节点 S S S 包含 m m m 个样本,其目标变量的方差为:
Var ( S ) = 1 m ∑ i = 1 m ( y i − y ˉ ) 2 \text{Var}(S) = \frac{1}{m} \sum_{i=1}^m (y_i - \bar{y})^2 Var(S)=m1i=1m(yiyˉ)2
其中, y ˉ \bar{y} yˉ 是节点 S S S 中目标变量的平均值:
y ˉ = 1 m ∑ i = 1 m y i \bar{y} = \frac{1}{m} \sum_{i=1}^m y_i yˉ=m1i=1myi

在分裂过程中,选择一个特征 j j j 和一个分割点 s s s,将节点 S S S 分为左子节点 S L S_L SL 和右子节点 S R S_R SR。分裂的目标是选择 j j j s s s 使得方差减少最大化:
VarReduction ( S , j , s ) = Var ( S ) − ( ∣ S L ∣ ∣ S ∣ Var ( S L ) + ∣ S R ∣ ∣ S ∣ Var ( S R ) ) \text{VarReduction}(S, j, s) = \text{Var}(S) - \left( \frac{|S_L|}{|S|} \text{Var}(S_L) + \frac{|S_R|}{|S|} \text{Var}(S_R) \right) VarReduction(S,j,s)=Var(S)(SSLVar(SL)+SSRVar(SR))
其中, ∣ S L ∣ |S_L| SL ∣ S R ∣ |S_R| SR 分别是左子节点和右子节点的样本数。


  1. 随机特征选择
    在每棵树的每个节点分裂时,随机选择一部分特征(而不是所有特征)作为候选特征。假设总特征数为 p p p,则随机选择的特征数为 m m m(通常 m = p m = \sqrt{p} m=p m = log ⁡ 2 ( p ) m = \log_2(p) m=log2(p))。这种随机性可以有效减少模型的方差,提高泛化能力。

  1. 预测
    对于一个新的输入样本 x x x,每棵回归树会给出一个预测值 h t ( x ) h_t(x) ht(x)。随机森林的最终预测值是所有树预测值的平均值:
    y ^ = 1 T ∑ t = 1 T h t ( x ) \hat{y} = \frac{1}{T} \sum_{t=1}^T h_t(x) y^=T1t=1Tht(x)
    其中, T T T 是树的数量, h t ( x ) h_t(x) ht(x) 是第 t t t 棵树的预测值。

  1. 优点
  • 降低过拟合:通过集成多棵树和随机特征选择,减少模型的方差。
  • 鲁棒性强:对噪声和异常值不敏感。
  • 可解释性:可以通过特征重要性评估特征的重要性。

  1. 数学公式总结
    1. 方差计算
      Var ( S ) = 1 m ∑ i = 1 m ( y i − y ˉ ) 2 \text{Var}(S) = \frac{1}{m} \sum_{i=1}^m (y_i - \bar{y})^2 Var(S)=m1i=1m(yiyˉ)2
    2. 方差减少
      VarReduction ( S , j , s ) = Var ( S ) − ( ∣ S L ∣ ∣ S ∣ Var ( S L ) + ∣ S R ∣ ∣ S ∣ Var ( S R ) ) \text{VarReduction}(S, j, s) = \text{Var}(S) - \left( \frac{|S_L|}{|S|} \text{Var}(S_L) + \frac{|S_R|}{|S|} \text{Var}(S_R) \right) VarReduction(S,j,s)=Var(S)(SSLVar(SL)+SSRVar(SR))
    3. 最终预测
      y ^ = 1 T ∑ t = 1 T h t ( x ) \hat{y} = \frac{1}{T} \sum_{t=1}^T h_t(x) y^=T1t=1Tht(x)

算法实现

手动实现

代码中的决策树部分使用函数库实现
决策树回归算法可参见:python回归算法_决策树回归

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor

class RandomForestRegressor:
    def __init__(self, n_trees=10, max_depth=None):
        self.n_trees = n_trees
        self.max_depth = max_depth
        self.trees = []

    def fit(self, X, y):
        n_samples = X.shape[0]
        for _ in range(self.n_trees):
            # Bootstrap sampling
            indices = np.random.choice(n_samples, n_samples, replace=True)
            X_sample = X[indices]
            y_sample = y[indices]
            # Create and fit a decision tree
            tree = DecisionTreeRegressor(max_depth=self.max_depth)
            tree.fit(X_sample, y_sample)
            self.trees.append(tree)

    def predict(self, X):
        # Aggregate predictions from all trees
        predictions = np.zeros((X.shape[0], self.n_trees))
        for i, tree in enumerate(self.trees):
            predictions[:, i] = tree.predict(X)
        return np.mean(predictions, axis=1)

# 生成示例数据
X = np.sort(5 * np.random.rand(80, 1), axis=0)  # 生成80个随机数
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])  # 加入噪声

# 拟合随机森林回归模型
rf = RandomForestRegressor(n_trees=100, max_depth=5)
rf.fit(X, y)

# 进行预测
X_test = np.arange(0, 5, 0.01).reshape(-1, 1)
y_pred = rf.predict(X_test)

# 可视化结果
plt.scatter(X, y, color='red', label='Data', s=20)
plt.plot(X_test, y_pred, color='blue', label='Random Forest Prediction', linewidth=2)
plt.title("Random Forest Regression")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.show()

运行结果:
在这里插入图片描述

python函数库实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# 生成示例数据
X = np.sort(5 * np.random.rand(80, 1), axis=0)  # 生成80个随机数
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])  # 加入噪声

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

# 创建随机森林回归模型
rf = RandomForestRegressor(n_estimators=100, max_depth=5, random_state=42)

# 拟合模型
rf.fit(X_train, y_train)

# 进行预测
X_grid = np.arange(0, 5, 0.01).reshape(-1, 1)  # 用于绘制平滑曲线的细分点
y_pred = rf.predict(X_grid)

# 可视化结果
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, color='red', label='Training Data', s=20)
plt.scatter(X_test, y_test, color='green', label='Test Data', s=20)
plt.plot(X_grid, y_pred, color='blue', label='Random Forest Prediction', linewidth=2)
plt.title("Random Forest Regression")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.grid()
plt.show()

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值