Matlab TreeBagger随机森林回归实例

article/2025/10/3 8:28:53

简介

在探寻变量之间相关性时,简单线性相关容易实现,对于多元的非线性关系,如果不知道关系式(函数方程)很难建立自变量和因变量之间关系。而机器学习方法为解决这类复杂多元非线性问题提供了很好的思路。
其中,随机森林回归是一种机器学习和数据分析领域常用且有效的算法。本文介绍在Matlab平台如何使用自带函数(TreeBagger)和测试数据实现回归森林,对于随机森林和决策树的相关理论原理将不做太深入的描述。

算法流程

(1)加载Matlab测试数据集;
(2)训练TreeBagger(随机森林);
(3)创建散点图;
(4)估计输入变量的相对重要性;
(5)检查需要多少棵树。

TreeBagger介绍

TreeBagger集成了一组决策树,用于分类或回归。集成中的每棵树都生长在独立绘制的输入数据的引导程序副本上。该副本中未包含的观察结果对于该树而言是“无用之物”。

TreeBagger将决策树用于分类或回归。TreeBagger依靠ClassificationTree和 RegressionTree功能来生长单个树。ClassificationTree和RegressionTree接受为每个决策拆分随机选择的特征数作为可选输入参数。也就是说, TreeBagger实现了随机森林算法。
对于回归问题,TreeBagger支持均值和分位数回归(即分位数回归森林)。

默认情况下,TreeBagger为分类树。要使用回归树,请指定 ‘Method’,‘regression’。

语法

Mdl = TreeBagger(NumTrees,Tbl,ResponseVarName)
Mdl = TreeBagger(NumTrees,Tbl,formula)
Mdl = TreeBagger(NumTrees,Tbl,Y)
B = TreeBagger(NumTrees,X,Y)
B = TreeBagger(NumTrees,X,Y,Name,Value)

描述

Y是相应自变量数据的因变量数组,对于分类问题, Y是一组类标签。标签可以是数字或逻辑向量等。对于回归问题,Y是一个数值向量。对于回归树,必须指定名称-值对 ‘Method’,‘regression’。

若要预测均值响应或估计给定数据的均方误差,请分别传递TreeBagger模型和数据分析。要对袋外观测数据执行类似的操作,请使用oobPredict或oobError。

要估计给定数据的响应分布的分位数或分位数误差,请将TreeBagger模型和数据分别传递给quantilePredict或quantileError。要对袋外观察执行类似的操作,请使用oobQuantilePredict或oobError。

测试数据集下载

波士顿房价数据集:http://t.cn/RfHTAgY
https://download.csdn.net/download/wokaowokaowokao12345/12243422
或者使用Matlab自带测试数据集。

波士顿房价数据集是一个回归问题数据集,共有 506 个样本,13 个输入变量和1个输出变量。每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。房价是因变量,其它变量为自变量。
在这里插入图片描述

例子1

https://www.mathworks.com/help/stats/regression-treeBagger-examples.html

clear;clc;close all%%
% 加载Matlab提供的测试数据——使用1985年汽车进口量数据库,其中包含205个样本数据,25个自变量和1个因变量
load imports-85;
Y = X(:,1);
X = X(:,2:end);
isCategorical = [zeros(15,1);ones(size(X,2)-15,1)]; % Categorical variable flag% 设置随机生成器种子,实际运用中可以注释掉,以获得随机性
rng(1945,'twister')%% 最优leaf选择
% 对于回归,一般规则是将叶子大小设置为5。通过比较不同叶子数量MSE获得最佳叶子数量
% 叶子数量越少MSE越小,即使如此也肯定不是越小越好,这里就假设leaf=5是最优了
leaf = [5 10 20 50 100];
col = 'rbcmy';
figure
for i=1:length(leaf)b = TreeBagger(50,X,Y,'Method','R','OOBPrediction','On',...'CategoricalPredictors',find(isCategorical == 1),...'MinLeafSize',leaf(i));plot(oobError(b),col(i))hold on
end
xlabel('Number of Grown Trees')
ylabel('Mean Squared Error') 
legend({'5' '10' '20' '50' '100'},'Location','NorthEast')
hold off%% 树的数量设置,前面用了50棵树(为了收敛速度快),接下来增加到100
b = TreeBagger(100,X,Y,'Method','R','OOBPredictorImportance','On',...'CategoricalPredictors',find(isCategorical == 1),...'MinLeafSize',5);% 绘制误差曲线
figure
plot(oobError(b))
xlabel('Number of Grown Trees')
ylabel('Out-of-Bag Mean Squared Error')%% 自变量重要性分析
% 自变量对RF模型贡献有大有小,RF的预测能力依赖于贡献大的自变量。对于每个自变量,可以观察其重要性,进行取舍组合,并查看MSE是否有改善。
% OOBPermutedPredictorDeltaError提供了每个自变量的重要性,值越大,变量越重要。
figure
bar(b.OOBPermutedPredictorDeltaError)
xlabel('Feature Number') 
ylabel('Out-of-Bag Feature Importance')% 选择重要性大于0.7的变量
idxvar = find(b.OOBPermutedPredictorDeltaError>0.7)
idxCategorical = find(isCategorical(idxvar)==1);
finbag = zeros(1,b.NTrees);
for t=1:b.NTreesfinbag(t) = sum(all(~b.OOBIndices(:,1:t),2));
end
finbag = finbag / size(X,1);
figure
plot(finbag)
xlabel('Number of Grown Trees')
ylabel('Fraction of In-Bag Observations')%% 使用选择的特征重新训练
b5v = TreeBagger(100,X(:,idxvar),Y,'Method','R',...'OOBPredictorImportance','On','CategoricalPredictors',idxCategorical,...'MinLeafSize',5);
figure
plot(oobError(b5v))
xlabel('Number of Grown Trees')
ylabel('Out-of-Bag Mean Squared Error')figure
bar(b5v.OOBPermutedPredictorDeltaError)
xlabel('Feature Index')
ylabel('Out-of-Bag Feature Importance')%% 找到样本数据中的异常数据
b5v = fillProximities(b5v);
figure
histogram(b5v.OutlierMeasure)
xlabel('Outlier Measure')
ylabel('Number of Observations')figure(8)
[~,e] = mdsProx(b5v,'Colors','K');
xlabel('First Scaled Coordinate')
ylabel('Second Scaled Coordinate')figure
bar(e(1:20))
xlabel('Scaled Coordinate Index')
ylabel('Eigenvalue')

例子2

clear;clc;close all%%
% 加载Matlab提供的测试数据——使用1985年汽车进口量数据库,其中包含205个样本数据,25个自变量和1个因变量
load imports-85;
Y = X(:,1);
X = X(:,2:end);
isCategorical = [zeros(15,1);ones(size(X,2)-15,1)]; % Categorical variable flag%% 训练随机森林,TreeBagger使用内容,以及设置随机森林参数
tic
leaf = 5;
ntrees = 200;
fboot = 1;
disp('Training the tree bagger')
b = TreeBagger(ntrees, X,Y, 'Method','regression', 'oobvarimp','on', 'surrogate', 'on', 'minleaf',leaf,'FBoot',fboot);
toc%% 使用训练好的模型进行预测
% 这里没有单独设置测试数据集合,如果进行真正的预测性能测试,使用未加入至模型训练的数据进行预测测试。
disp('Estimate Output using tree bagger')
x = Y;
y = predict(b, X);
toc% calculate the training data correlation coefficient
% 计算相关系数
cct=corrcoef(x,y);
cct=cct(2,1);% Create a scatter Diagram
disp('Create a scatter Diagram')% plot the 1:1 line
plot(x,x,'LineWidth',3);hold on
scatter(x,y,'filled');
hold off
grid onset(gca,'FontSize',18)
xlabel('Actual','FontSize',25)
ylabel('Estimated','FontSize',25)
title(['Training Dataset, R^2=' num2str(cct^2,2)],'FontSize',30)drawnowfn='ScatterDiagram';
fnpng=[fn,'.png'];
print('-dpng',fnpng);%--------------------------------------------------------------------------
% Calculate the relative importance of the input variables
tic
disp('Sorting importance into descending order')
weights=b.OOBPermutedVarDeltaError;
[B,iranked] = sort(weights,'descend');
toc%--------------------------------------------------------------------------
disp(['Plotting a horizontal bar graph of sorted labeled weights.']) %--------------------------------------------------------------------------
figure
barh(weights(iranked),'g');
xlabel('Variable Importance','FontSize',30,'Interpreter','latex');
ylabel('Variable Rank','FontSize',30,'Interpreter','latex');
title(...['Relative Importance of Inputs in estimating Redshift'],...'FontSize',17,'Interpreter','latex'...);
hold on
barh(weights(iranked(1:10)),'y');
barh(weights(iranked(1:5)),'r');%--------------------------------------------------------------------------
grid on 
xt = get(gca,'XTick');    
xt_spacing=unique(diff(xt));
xt_spacing=xt_spacing(1);    
yt = get(gca,'YTick');    
ylim([0.25 length(weights)+0.75]);
xl=xlim;
xlim([0 2.5*max(weights)]);%--------------------------------------------------------------------------
% Add text labels to each bar
for ii=1:length(weights)text(...max([0 weights(iranked(ii))+0.02*max(weights)]),ii,...['Column ' num2str(iranked(ii))],'Interpreter','latex','FontSize',11);
end%--------------------------------------------------------------------------
set(gca,'FontSize',16)
set(gca,'XTick',0:2*xt_spacing:1.1*max(xl));
set(gca,'YTick',yt);
set(gca,'TickDir','out');
set(gca, 'ydir', 'reverse' )
set(gca,'LineWidth',2);   
drawnow%--------------------------------------------------------------------------
fn='RelativeImportanceInputs';
fnpng=[fn,'.png'];
print('-dpng',fnpng);%--------------------------------------------------------------------------
% Ploting how weights change with variable rank
disp('Ploting out of bag error versus the number of grown trees')figure
plot(b.oobError,'LineWidth',2);
xlabel('Number of Trees','FontSize',30)
ylabel('Out of Bag Error','FontSize',30)
title('Out of Bag Error','FontSize',30)
set(gca,'FontSize',16)
set(gca,'LineWidth',2);   
grid on
drawnow
fn='EroorAsFunctionOfForestSize';
fnpng=[fn,'.png'];
print('-dpng',fnpng);

实验结果

模型的相关系数
输入变量的重要性

http://chatgpt.dhexx.cn/article/5gK9IvFL.shtml

相关文章

随机森林分类+随机森林回归+实例:用随机森林回归填补缺失值+机器学习调参思想+实例:随机森林在乳腺癌数据上的调参

文章目录 一、集成算法概述二、重要参数1、控制基评估器的参数2、n_estimators3、random_state4、bootstrap & oob_score 三、重要属性和接口四、随机森林回归器1、重要参数,属性与接口2、实例:用随机森林回归填补缺失值 五、机器学习中调参的基本思…

采用支持向量回归(SVR)和随机森林回归预测两种机器学习方法对房价进行预测(附完整代码)

大家好,我是带我去滑雪,每天教你一个小技巧! 本文分别采用支持向量回归(SVR)和随机森林回归预测两种机器学习方法对房价进行预测。随机将数据分为训练集和测试集,比例为8:2,数据和代码均在文末…

python随机森林回归数据实战

文章目录 前言一、随机森林回归器参数介绍二、数据实战1.数据介绍2.重点代码2.1特征集和标签集获取2.2数据集划分2.3随机森林模型训练2.4预测结果可视化2.5 特征重要性选择及可视化 3.完整代码 总结 前言 我为什么写这篇博客? 答:记录一下自己对于sklea…

随机森林回归实验

随机森林回归实验 文章目录 随机森林回归实验实验说明实验步骤可视化 实验说明 sklearn包里已经实现了随机森林回归模型,导入使用即可。 数据集我们使用的是 sklearn包中自带的波士顿房价数据集。 实验环境:Anaconda3VScodePython版本:3.7…

随机森林回归算法的Python实现与应用

摘要 随机森林回归是一种集成学习算法,通过组合多个决策树来实现回归任务,构建多个决策树,并将它们组合成一个强大的回归模型。本文将会从随机森林回归算法的算法原理、Python实现及实际应用进行详细说明。 1 绪论 在现在的数据分析及数学建…

随机森林回归算法

随机森林回归算法原理 随机森林回归模型由多棵回归树构成,且森林中的每一棵决策树之间没有关联,模型的最终输出由森林中的每一棵决策树共同决定。 随机森林的随机性体现在两个方面: 1、样本的随机性,从训练集中随机抽取一定数量的…

随机森林回归器

文章目录 前言一、重要参数criterion 二、重要属性和接口三、随机森林回归用法总结 前言 所有的参数,属性与接口,全部和随机森林分类器一致。仅有的不同就是回归树与分类树的不同,不纯度的指标,参数Criterion不一致。 一、重要参…

随机森林分类、回归算法原理及调参实战

集成算法 ensemble 通过在数据集上构建多个模型,集成所有模型的建模结果,得到一个综合的结果,以此来获得比单个 模型更好的分类或回归表现装袋法bagging:构建多个相互独立的基评估器(base estimator),然后…

LESSON 9.1 随机森林回归器的实现

目录 三 随机森林RandomForest   1 RamdomForestRegressor的实现   2 随机森林回归器的参数    2.1 弱分类器结构    2.2 弱分类器数量    2.3 弱分类器训练的数据    2.4 其他参数 四 增量学习:随机森林处理巨量数据   1 普通学习vs增量学习   2 增量学…

随机森林简单回归预测

随机森林(RandomForest)简单回归预测 随机森林是bagging方法的一种具体实现。它会训练多棵决策树,然后将这些结果融合在一起就是最终的结果。随机森林可以用于分裂,也可以用于回归。主要在于决策树类型的选取,根据具体…

【机器学习项目实战】随机森林(random forest)回归(RandomForestRegressor)模型Python实现

说明:这是一个机器学习实战项目(附带数据代码),如需数据完整代码可以直接到文章最后获取。 1.定义问题 在电子商务领域,现在越来越多的基于历史采购数据、订单数据等,进行销量的预测;本模型也是…

用Python实现随机森林回归

1 介绍 使用Scikit-Learn模块在Python实现任何机器学习算法都比较简单,并且不需要了解所有细节。这里就对如何进行随机森林回归在算法上进行概述,在参数上进行详述。希望对你的工作有所帮助。 这里,将介绍如何在Python中构建和使用Random Fo…

DS和[address]

8086CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元,则一个字要用两个地址连续的内存单元来存放,这个字的低位存放低地址单元中,高位字节存…

a's'da's'd

1:原理ffmpeg读取出来一个包如果是视频包放入视频包队列,如果是音频包放入音频包队列。视频:从视频队列中取出一个包解码根绝帧率或pts等等算出一帧数据的持续时间将这一帧数据放入VideoPicture这个结构体的bmp中,这只是内存,还未…

微信公众号内置浏览器缓存清理

微信公众号的H5页面访问后,会缓存js、css等数据,如果更新了脚本文件,前端一段时间内容反复刷新都无法生效。 使用过程中,更新代码但是H5不能及时更新,推荐以下几种方式: 方法一: 微信->“我…

微信浏览器缓存清理

微信其实内嵌了一个QQ浏览器,只是这个浏览器没有菜单界面,看上去无法清理微信内置浏览器的缓存。 方法一: 1、随便打开一个聊天窗口,输入debugx5.qq.com 并发送 2、点击自己发送的地址debugx5.qq.com,打开debug 调试…

Android手机微信内置浏览器缓存怎么清理?

有很多时候我们的网站需要在微信上打开进行测试,一次次的修改不像是浏览器一样可以随时清理缓存,不清理缓存的话这样会对测试运行结果有影响,那如何清理缓存呢? 注意:此功能只能适用于安卓微信 1、专门的清理缓存的网…

微信内置浏览器清理缓存方法(适用于安卓手机)

用微信内置浏览器打开这个网页debugx5.qq.com ,就会有清除缓存的选项,如下图

微信内置浏览器清除缓存、cookie、local storage清除(安卓手机)

项目需要做一个openIdADFS混合模式的登录,开发的时候发现点问题,需要清除cookie和local storage进行修改。 于是稍微研究了一下,安卓手机如何清除缓存、cookie和local storage。 本人使用的手机是华为Mate 20Pro,微信版本8.0.3.…

h5、微信浏览器、微信公众号清理缓存的常用方法

h5浏览器特别是微信公众号存在缓存的问题,让我们在测试、产品、用户面前彻底丢了面子,他们会问。为什么会有缓存?别人的产品可以做到,为什么我们的不可以? 下面提供几种方案可以尝试处理h5浏览器缓存的问题。 一、普…