Random Forest随机森林算法

Random Forest是加州大学伯克利分校的Breiman Leo和Adele Cutler于2001年发表的论文中提到的新的机器学习算法,可以用来做分类,聚类,回归,这里只简单介绍该算法在分类上的应用。
Random Forest(随机森林)算法是通过训练多个决策树,生成模型,然后综合利用多个决策树的分类结果进行投票,从而实现分类。随机森林算法只需要两个参数:构建的决策树的个数t,在决策树的每个节点进行分裂时需要考虑的输入特征的个数m。

算法流程

1. 生成单棵决策树:

(1)训练总样本的个数为N,则单棵决策树从N个训练集中有放回的随机抽取n个作为此单颗树的训练样本。

(2)令训练样例的输入特征的个数为M,m远远小于M,则我们在每颗决策树的每个节点上进行分裂时,从M个输入特征里随机选择m个输入特征,然后从这m个输入特征里选择一个最好的进行分裂。m在构建决策树的过程中不会          改变。这里注意,要为每个节点随机选出m个特征,然后选择最好的那个特征来分裂。

(3)每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。不需要剪枝。由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。


 2. 生成t颗决策树

     按照1的方式产生t颗决策树加入到森林中


3.利用随机森林分类

对于每个新的测试样例,综合多个决策树的分类结果来作为随机森林的分类结果。

(1)目标特征为数字类型:取t个决策树的平均值作为分类结果。

(2)目标特征为类别类型:少数服从多数,取单棵树分类结果最多的那个类别作为整个随机森林的分类结果。

 

算法1中,用majority vote表示多数投票.随机森林的泛化误差依赖于以下两个因素:RF中任意两棵树的相关度(correlation)和RF中单棵树的分类效能(strength)。

关于随机性

随机性主要体现在两个方面:

(1)训练每棵树时,从全部训练样本中选取一个子集进行训练(即bootstrap取样)。用剩余的数据进行评测,评估其          误差;

(2)在每个节点,随机选取所有特征的一个子集,用来计算最佳分割方式。

为什么有效

采用bagging和randomization结合的方法,Bagging(bootstrap aggregating)方法制造有差异的训练样本集,构建单棵决策树时采用一种随机子空间划分(random subspace method)的策略,从随机选择的部分属性中挑选最佳属性对内部节点进行属性分裂,在保证单颗树分类效能的同时,减少了各分类树之间的相关度,降低了噪声的影响,降低过拟合情况产生的可能,从而提高了组合分类器的性能。

由于树随机生成的树,大部分的树(或许 99.9%树) 不会对学习的分类/回归问题都有意义 。但是随着很多糟糕的决策树被生成,其中也会有很少确实很优秀的决策树。当你要做预测的时候,新的观察到的特征随着决策树自上而下走下来,这样一组观察到的特征将会被贴上一个预测值/标签。一旦森林中的每棵树都给出了预测值/标签,所有的预测结果将被归总到一起,所有树的模式投票被返回做为最终的预测结果。
简单来说,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。






<span style="font-size:12px;">% 函数返回一棵决策树
function  [node,child_value,child_node_num]=ID3(S)%%%clear clear global node child_value child_node_num;global node child_value child_node_num%S=xlsread('aaa.xls');%%%DValue=S(:,1:6);    DValue=roundn(DValue,-1);CN=S(:,7);CN=num2str(CN);%将标签设为string型for i=1:length(CN)A(i)=i;endClassPNum=[1 2 3 4 5 6];m=0;[node,child_value,child_node_num]=TreeNode( DValue, CN, A, ClassPNum,m ); end% 生成树结点
% DValue--前四列数据
% A--参与划分的行号
% CN--属性值的集合(第5列数据)
% ClassPNum为划分的剩余属性编号
% 当前node的父亲结点为node{m}
function [node,child_value,child_node_num]=TreeNode( DValue, CN, A, ClassPNum,m)global node child_value child_node_numn=length(node);if m>0%如果父亲结点存在,将本结点的序号存入父亲结点的子结点序号集中k=length(child_node_num{m});child_node_num{m}(k+1)=n+1;  end     % 1、样本为空,则树为空if isempty(DValue)node{ n+1 }=[];child_value{ n+1 }=[];child_node_num{ n+1 }=[];return;end % 2、用于划分的剩余属性为空,选择多数元组所在的类作为结点if isempty( ClassPNum ) node{ n+1 }=find_most( CN,A );child_value{ n+1 }=[];child_node_num{ n+1 }=[];return;end % 3、样本中所有数据都属于同一类,将此类作为结点CNRowNum=CN_sta( CN, A);if length( find(CNRowNum==0) )>=2node{ n+1 }=CN(A(1));child_value{ n+1 }=[];child_node_num{ n+1 }=[];return;% 4、样本中所有数据不属于同一类elseI=Exp( CN,A );for i=1:length( ClassPNum )            Entropy(i)=avg_entropy( DValue(:,ClassPNum(i)), A, CN);Gain(i)=I-Entropy(i);end% 4.1、各属性的信息增益均小于0,选择多数元组所在的类作为结点if max(Gain)<=0node{ n+1 }=find_most( CN,A );child_value{ n+1 }=[];child_node_num{ n+1 }=[];return;% 4.2、在信息增益最大的属性上进行划分elsemaxG=find( Gain==max(Gain) );[PValue RowNum]=type_sta( DValue(:,ClassPNum(maxG(1))), A );node{ n+1 }=ClassPNum(maxG(1));child_value{ n+1 }=PValue;child_node_num{ n+1 }=[];ClassPNum(maxG)=[];     % 删除ClassPNum(maxG)--已经进行划分的属性for i=1:length(PValue)[node,child_value,child_node_num]=TreeNode( DValue, CN, RowNum{i}, ClassPNum,n+1 );endreturn;endend
end% A--参与划分的行号
% DValue--数据集的前四列
% 本函数用于统计参与划分的行大多数属于哪一个类
function most_type=find_most( CN,A )TypeName={'1','2','3'};CNRowNum=CN_sta( CN, A);n=max(CNRowNum);maxn=find( CNRowNum==n );most_type=TypeName{maxn};
end% 计算属性P的熵
% A--参与计算的行号,即计算的行范围
% Attri--求属性Attri的熵
% CN--类别属性值
function entropy=avg_entropy( Attri, A, CN )k=0;entropy=0;n=length(A);I=Exp( CN,A );[PValue,RowNum]=type_sta( Attri, A );for i=1:length( PValue )CI=Exp( CN, RowNum{i});entropy=entropy-length( RowNum{i} )/n*CI;end
end% 计算样本分类的期望
% A--参与计算的行号
% Attri--求期望的属性值的集合
function I=Exp(CN,A)CNRowNum=CN_sta( CN, A );n=length(A);I=0;for i=1:3if CNRowNum(i)>0P(i)=CNRowNum(i)/n;I=I-P(i)*log2( P(i) );endend
end% 统计属性的取值及各取值对应的行号集合
% A为参与统计的记录的行号集合
% Attri为属性值的集合
function [PValue,RowNum]=type_sta( Attri, A)k=1;PValue=Attri( A(1) );RowNum{1}=A(1);for i=2:length(A)n1=find( PValue==Attri( A(i) ) );if isempty(n1)k=k+1;PValue(k)=Attri( A(i) );RowNum{k}=A(i);elsen2=length( RowNum{n1} );RowNum{n1}(n2+1)=A(i);endend            
end% 统计类别属性的取值及各取值对应的行号集合
% A为参与统计的记录的行号集合
% CN为类别属性值的集合
function CNRowNum=CN_sta( CN, A)CNRowNum=[0 0 0];TypeName={'1','2'};for i=1:length( A )if strcmp( CN(A(i)),TypeName{1})CNRowNum(1)=CNRowNum(1)+1;elseif strcmp( CN(A(i)),TypeName{2} )CNRowNum(2)=CNRowNum(2)+1;else CNRowNum(3)=CNRowNum(3)+1;endend            
end</span>

<span style="font-size:12px;">clear all;
rnode=cell(3,1);%3*1的单元数组
rchild_value=cell(3,1);%3*1的单元数组
rchild_node_num=cell(3,1);%3*1的单元数组
sn=600; %随机可重复的抽取sn个样本
tn=10;  %森林中决策树的棵树
S=xlsread('aaa.xls');
%% 样本训练采用随机森林和ID3算法构建决策森林for j=1:tnSample_num=randi([1,1000],1,sn);%从1至1000内随机抽取sn个样本SData=S(Sample_num,:);[node,child_value,child_node_num]=ID3(SData);rnode{j,1}=node;rchild_value{j,1}=child_value;rchild_node_num{j,1}=child_node_num;end%% 样本测试T=xlsread('bbb.xls');%TData=roundn(T,-1);TData=roundn(T,-1);len=length(TData(:,1));%测试样本的数目type=zeros(len,1);for j=1:len%统计函数,对输入的测试向量进行投票,然后统计出选票最高的标签类型输出[type(j)]=statistics(tn,rnode,rchild_value,rchild_node_num,TData(j,:));endxlswrite('result.xls',[T type]);%输出测试报告</span>


<span style="font-size:12px;">function [type] = statistics(tn,rnode,rchild_value,rchild_node_num,PValue)TypeName={'1','2','3'};TypeNum=[0 0 0]; for i=1:tn  %对测试向量进行投票,共有tn棵树[type]=vote(rnode,rchild_value,rchild_node_num,PValue,i);if strcmp( type,TypeName{1})TypeNum(1) = TypeNum(1) + 1;elseif strcmp( type,TypeName{2})TypeNum(2) = TypeNum(2) + 1;else TypeNum(3) = TypeNum(3) + 1;endendmaxn=find( TypeNum==max(TypeNum) );type=str2num(TypeName{maxn(1)});
endfunction [type] = vote(rnode,rchild_value,rchild_node_num,PValue,j)n=1;       %从树的根结点(即node{1})开始查找k=0;   while ~isempty(rchild_node_num{j,1}{n})%不为空则进入循环for i=1:length(rchild_value{j,1}{n})if PValue(rnode{j,1}{n})==rchild_value{j,1}{n}(i)n=rchild_node_num{j,1}{n}(i);k=0;break;end                    endif i==length(rchild_value{j,1}{n})% 若这个值在分类器中不存在,则取其最近的值进行分类PValue(rnode{j,1}{n})=PValue(rnode{j,1}{n})+0.1*k;PValue=roundn(PValue,-1);end     k=(-1)^k*( abs(k)+1 );     endtype=rnode{j,1}{n};                                                                                                          type=rnode{j,1}{n};end
</span>


随机森林的几个重要参数



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7899.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【随机森林】random forests 简单介绍

Random Forest&#xff0c;顾名思义 Random 就是随机抽取&#xff1b; Forest 就是说这里不止一棵树&#xff0c;而由 一群决策树组成的一片森林 &#xff0c;连起来就是用随机抽取的方法训练出一群决策树来完成分类任务。RF用了两次随机抽取, 一次是对训练样本的随机抽取; 另一…

随机森林!

定义:在以决策树为基学习器构建Bagging集成的基础上&#xff0c;进一步在决策树节点分裂时引入随机属性扰动。 随机性体现(与传统决策树的差异):对基决策树的每个节点&#xff0c;先从该节点的属性集合中随机选择包含K(log2(d))个属性的子集&#xff0c;然后再从这个子集中选择…

随机森林 (Random Forests) 简单介绍与应用

1 集成方法(Ensemble methods) 1.1 什么是集成方法 简单来说&#xff0c;集成方法 就是组合多个模型&#xff0c;以获得更好效果。 1.2 两种集成方法 平均法(averaging methods)&#xff1a;也有人直接称之为“袋装法”&#xff0c;所有算法进行 相互独立 训练得到各自的模…

随机森林--

----------------------集成学习---------------------- 集成学习可以被分为三个主要研究领域&#xff1a; -----------------------------------------------------模型融合----------------------------------------------------- 模型融合在最初的时候被称为“分类器结合…

R随机森林实现

原文链接&#xff1a;来自公众号生信数据挖掘 目录 R实现随机森林随机森林R包估值过程袋外错误率&#xff08;oob error&#xff09;R randomForest函数实现安装程序包&#xff0c;查看样本数据结构建模与观察 R实现随机森林 该文只简单的讲解关于的R的随机森林具体实现步骤&a…

随机森林 – Random forest

随机森林 – Random forest 随机森林是一种由决策树构成的集成算法&#xff0c;他在很多情况下都能有不错的表现。 本文将介绍随机森林的基本概念、4 个构造步骤、4 种方式的对比评测、10 个优缺点和 4 个应用方向。 什么是随机森林&#xff1f; 随机森林属于 集成学习 中的 …

随机森林原理详解 random forest 代码+参数讲解

事实上随机森林的基本单元决策树很早就被提出来了&#xff0c;只不过单个决策树效果不好。这个情况和神经网络差不多。 到了2001年Breiman把分类树组合成随机森林&#xff08;Breiman 2001a&#xff09;&#xff0c;即在变量&#xff08;列&#xff09;的使用和数据&#xff0…

随机森林及应用

学习了B站视频《随机森林及应用》&#xff0c;记录一下学习笔记啦&#xff0c;原视频链接&#xff1a;Python机器学习算法实践Ⅲ-随机森林及应用。 一、随机森林属于集成学习&#xff0c;所以首先了解集成学习。在集成学习中&#xff0c;主要分为Bagging算法和Boosting算法。 B…

随机森林(Random Forests)介绍

1.决策树&#xff08;Decision Tree&#xff09; 决策树是一种树形结构&#xff0c;其中每个内部节点表示一个属性上的测试&#xff0c;每个分支代表一个测试输出&#xff0c;每个叶节点代表一种类别。常见的决策树算法有C4.5、ID3和CART。ID3算法用的是信息增益&#xff0c;C…

使用随机森林进行特征选择

绘制随机森林每棵树的决策边界 首先导入必要的库函数&#xff1a; from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_moons from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import numpy as…

python实现随机森林

定义&#xff1a; 随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器。可回归可分类。 所以随机森林是基于多颗决策树的一种集成学习算法&#xff0c;常见的决策树算法主要有以下几种&#xff1a; 1. ID3&#xff1a;使用信息增益g(D,A)进行特征选择 2. C4.5&…

教你体验目前最火AI - 在craft AI assistant 使用chatGPT

atGPT大火之后&#xff0c;很多人都想体验一把&#xff0c;今天为大家推荐一种免费方式&#xff0c;体验chatGPT同款内核的AI助手。 craft AI assistant Craft 推出的 AI 助手产品 Craft AI Assistant&#xff0c;并且现在就可以使用。根据 Craft 官方介绍&#xff0c;Craft …

【ChatGPT+AI】持续更新

ChatGPT的缘分 ChatGPT的缘分 一、小白必知1.1ChatGPT是什么&#xff1f;1.2ChatGPT怎么用&#xff1f;1.3ChatGPT登录注意事项 二、ChatGPT实战2.1什么Prompt&#xff1f;2.2ChatGPT怎么发图片2.3ChatGPT快速制作PPT 三、其他AI与免费镜像网站四、星球介绍 ChatGPT的缘分 大家…

DetectGPT VS ChatGPT:AI反击战?

1.背景 随着 ChatGPT 的持续火爆&#xff0c;现在无论哪个行业&#xff0c;几乎是人尽皆知。同时&#xff0c;利用 ChatGPT 进行造假作弊的情况也是层出不穷&#xff0c;尤其是在教育和传媒行业。在美国的一项千人调查中&#xff0c;有89%的学生表示在家庭作业中使用了 ChatGP…

多国拟发ChatGPT禁令 关“野兽”的笼子要来了?

“人工智能想越狱“、”AI产生自我意识”、“AI终将杀死人类”、“硅基生命的进化”.......曾经只在在赛博朋克等科技幻想中出现的剧情&#xff0c;在今年走向现实&#xff0c;生成式自然语言模型正在遭受前所未有的质疑。 聚光灯下最瞩目的那个是ChatGPT&#xff0c;3月底到4…

ChatGPT从入门到精通,深入认识Prompt

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公&#xff01;行动起来吧。欢迎关注专栏 。。。。。 还有更多。。。。&…

【Prompting】ChatGPT Prompt Engineering开发指南(1)

ChatGPT Prompt Engineering开发指南1 Prompting指南设置 提示原则策略1&#xff1a;使用分隔符清楚地指示输入的不同部分策略2&#xff1a;要求结构化输出策略3&#xff1a;让模型检查条件是否满足策略4: “Few-shot”提示 原则2&#xff1a;给模型时间“思考”策略1&#xff…

【ChatGPT】Prompt Engineering入门

Prompt Engineering入门 一、什么是 Prompt Engineering&#xff1f;二、我们还需要学习 PE 吗&#xff1f;三、Prompt基础原则 一、什么是 Prompt Engineering&#xff1f; 简单的理解它是给 AI 模型的指令。它可以是一个问题、一段文字描述&#xff0c;甚至可以是带有一堆参数…

大型语言模型LLM的基础应用

ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型&#xff0c;一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚…

【ChatGPT】怎样计算文本token数量?

ChatGPT 按 token 计费&#xff0c;当你把一段长文本发送给它时&#xff0c;你如何计算该文本消耗了多少 token&#xff1f; 在非流式访问的情况下&#xff0c;ChatGPT 的回复信息中包含有 token 消耗数量。但是在流式访问的情况下&#xff0c;回复信息里没有 token 数量&…