随机森林回归Random Forest Regression)是一种在机器学习领域广泛应用的算法,由美国科学家 Leo Breiman 在2001年提出。
它是一种集成学习方法,通过整合多个决策树的预测结果来提高预测精度和稳定性。

随机森林回归适用于各种需要预测连续数值输出的问题,
如金融领域的股票价格预测、客户信用评分,医疗领域的疾病诊断和药物发现等。

1. 算法概述

随机森林回归算法通过引入随机性来构建多个决策树,再通过对这些树的预测结果进行平均或投票来得出最终的预测结果。
这里的随机性主要体现在两个方面:一是训练样本的随机选取,二是在训练过程中特征的随机选取。

随机森林的算法过程并不复杂,主要的步骤如下:

  1. 从原始训练集中随机选择一部分样本,构成一个新的子样本集。这样可以使得每棵决策树都在不同的样本集上进行训练,增加模型的多样性。
  2. 对于每个决策树的每个节点,在选择最佳划分特征时,只考虑随机选择的一部分特征。这样可以防止某些特征对整个模型的影响过大,提高模型的鲁棒性。
  3. 在每个子样本集上使用某种决策树算法构建一棵决策树。决策树的生长过程中,通常采用递归地选择最佳划分特征,将数据集划分为不纯度最小的子集。
  4. 通过上述步骤生成的大量决策树最终组合成随机森林。

上面第一,第二步骤中的随机性就是随机森林这个名称的由来。

2. 创建样本数据

这次的回归样本数据,我们用 scikit-learn 自带的样本生成器来生成回归样本。
关于样本生成器的内容,可以参考:TODO

from sklearn.datasets import make_regression

# 回归样本生成器
X, y = make_regression(n_features=4, n_informative=2)

每个样本有4个特征。

3. 模型训练

训练之前,为了减少算法误差,先对数据进行标准化处理。

from sklearn import preprocessing as pp

# 数据标准化
X = pp.scale(X)
y = pp.scale(y)

接下来分割训练集测试集

from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

然后用scikit-learn中的RandomForestRegressor模型来训练:

from sklearn.ensemble import RandomForestRegressor

# 定义随机森林回归模型
reg = RandomForestRegressor(max_depth=2) # 训练模型
reg.fit(X_train, y_train) # 在测试集上进行预测
y_pred = reg.predict(X_test)

RandomForestRegressor的主要参数包括:

  1. n_estimators:森林中决策树的数量。默认值为100,表示这是森林中树木的数量,即基评估器的数量。但是,任何模型都有决策边界,当n_estimators达到一定的程度之后,随机森林的精确性往往不再上升或开始波动。同时,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。
  2. max_depth:树的最大深度。默认是None,与剪枝相关。设置为None时,树的节点会一直分裂,直到每个叶子都是“纯”的,或者叶子中包含于min_samples_split个样本。可以从3开始尝试增加,观察是否应该继续加大深度。
  3. min_samples_split:在叶节点处需要的最小样本数。默认值是2,指定每个内部节点(非叶子节点)包含的最少的样本数。
  4. min_samples_leaf:每个叶子结点包含的最少的样本数。参数的取值除了整数之外,还可以是浮点数。如果参数的值设置过小会导致过拟合,反之就会欠拟合。
  5. min_weight_fraction_leaf:叶子节点所需要的最小权值。
  6. max_features:用于限制分枝时考虑的特征个数。超过限制个数的特征都会被舍弃。此参数可以设为整数、浮点数、字符或None,默认为'auto'。
  7. max_leaf_nodes:最大叶子节点数,整数,默认为None。这个参数通过限制树的最大叶子数量来防止过拟合,如果设置了一个正整数,则会在建立的最大叶节点内的树中选择最优的决策树。
  8. min_impurity_decrease:如果分裂指标的减少量大于该值,则进行分裂。
  9. min_impurity_split:决策树生长的最小纯净度。默认是0。

最后验证模型的训练效果:

from sklearn import metrics

# 在测试集上进行预测
y_pred = reg.predict(X_test) mse, r2, m_error = 0.0, 0.0, 0.0
y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred) print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error)) # 运行结果
均方误差:0.0918182629293023
复相关系数:0.9137032593574914
中位数绝对误差:0.17199566634564867

从预测的误差来看,训练的效果非常好

有同样的数据试了下上一篇介绍的决策树回归算法,发现还是随机森林回归的效果要好一些。
决策数回归的模型效果:

from sklearn.tree import DecisionTreeRegressor
from sklearn import metrics # 定义决策树回归模型
reg = DecisionTreeRegressor(max_depth=2) # 训练模型
reg.fit(X_train, y_train) # 在测试集上进行预测
y_pred = reg.predict(X_test) mse, r2, m_error = 0.0, 0.0, 0.0
y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred) print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error)) # 运行结果
均方误差:0.1681399575883647
复相关系数:0.8419711956126009
中位数绝对误差:0.36483491370039456

从运行结果来看,决策树回归的误差比随机森林回归要大不少。

4. 总结

随机森林回归算法的优势主要在于可以有效地处理大量的输入变量,并且可以处理非线性关系和交互作用,
同时 ,由于它是集成学习方法,所以可以有效地减少过拟合和欠拟合的问题,提高预测的准确性。

此外,在训练过程中,它可以自动进行特征选择和降维,帮助找到最重要的特征,
还可以处理缺失值和异常值,不需要进行特殊的数据预处理。

然而,随机森林回归算法也有一些劣势,
首先,它的训练过程相对较慢,尤其是在数据集较大或特征维度较高的情况下;
其次,在某些情况下,它可能过于依赖输入数据的随机性,导致预测结果的不稳定。
此外,随机森林算法在处理那些需要精确控制的问题时可能效果不佳

【scikit-learn基础】--『监督学习』之 随机森林回归的更多相关文章

  1. 机器学习实战基础(三十八):随机森林 (五)RandomForestRegressor 之 用随机森林回归填补缺失值

    简介 我们从现实中收集的数据,几乎不可能是完美无缺的,往往都会有一些缺失值.面对缺失值,很多人选择的方式是直接将含有缺失值的样本删除,这是一种有效的方法,但是有时候填补缺失值会比直接丢弃样本效果更好, ...

  2. MATLAB随机森林回归模型

    MATLAB随机森林回归模型: 调用matlab自带的TreeBagger.m T=textread('E:\datasets-orreview\discretized-regression\10bi ...

  3. 机器学习之路:python 集成回归模型 随机森林回归RandomForestRegressor 极端随机森林回归ExtraTreesRegressor GradientBoostingRegressor回归 预测波士顿房价

    python3 学习机器学习api 使用了三种集成回归模型 git: https://github.com/linyi0604/MachineLearning 代码: from sklearn.dat ...

  4. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  5. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  6. pyspark RandomForestRegressor 随机森林回归

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Fri Jun 8 09:27:08 2018 ...

  7. 机器学习实战基础(三十七):随机森林 (四)之 RandomForestRegressor 重要参数,属性与接口

    RandomForestRegressor class sklearn.ensemble.RandomForestRegressor (n_estimators=’warn’, criterion=’ ...

  8. 机器学习实战基础(三十五):随机森林 (二)之 RandomForestClassifier 之重要参数

    RandomForestClassifier class sklearn.ensemble.RandomForestClassifier (n_estimators=’10’, criterion=’g ...

  9. Python机器学习笔记——随机森林算法

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...

  10. 随机森林random forest及python实现

    引言想通过随机森林来获取数据的主要特征 1.理论根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器之间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系 ...

随机推荐

  1. Windows上Dart安装

    过程 *1 去github上下载一个release包或者直接将flutter通过git clone下来 *2 将下载下来的flutter/bin添加到path中 *3 此时运行flutter或者flu ...

  2. Github的一个奇技淫巧

    背景 前段时间给 VictoriaLogs 提交了一个 PR: https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4934 本来一切都很顺 ...

  3. proto转java类时相关option配置

    转载请注明出处: option java_multiple_files = true; 作用和意义:此选项指示生成的 Java 代码将被分割成多个文件而不是一个文件.每个消息类型都会生成一个单独的 J ...

  4. containerd镜像拉取配置

    背景: 公司要求部署最一套新版的k8s系统来部署生产应用,说实话很头疼.因为k8s自1.23版本之后就用不docker作为容器的默认运行时了,而是采用的containerd,这就带来了一系列的问题.没 ...

  5. Docker V24 及 Docker Compose V2 的安装及使用

    前言 Docker 是一款流行的开源容器化平台,使用 Docker 可以有效地隔离应用程序和系统环境,使得应用程序在不同的环境中具有相同的行为 Docker Compose 是一个用于定义和管理多个 ...

  6. A piece of cake

    1. A piece of cake(易事情)2. Break a leg(祝好运)3. Don't count your chickens before they hatch(不要过早乐观)4. D ...

  7. 轻量通讯协议 --- MQTT

    介绍 一.MQTT简介 MQTT(Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,通常用于在物联网(IoT)和传感器网络中进行通信.它设计用于在低 ...

  8. 一次考试的简单T3

    我的第一个想法其实是毫无头绪 根本就想不到dp,直接就写了爆搜后来讲了才知道... 这种dp的状态好像是一类dp的模型,他们的状态都有这样的一维:以第i个数结尾.这样的dp有什么样的标志呢?以第i个数 ...

  9. 可视化-vscode安装pandas

    pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.pandas提供了大量能使我们快速 ...

  10. Go泛型解密:从基础到实战的全方位解析

    本篇文章深入探讨了Go语言的泛型特性,从其基础概念到高级用法,并通过实战示例展示了其在实际项目中的应用. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互 ...