随机森林算法介绍及R语言实现

随机森林算法介绍及R语言实现
随机森林算法介绍及R语言实现

随机森林算法介绍及R语言实现

随机森林算法介绍

算法介绍:

简单的说,随机森林就是用随机的方式建立一个森林,森林里面有很多的决策树,并且每棵树之间是没有关联的。得到一个森林后,当有一个新的样本输入,森林中的每一棵决策树会分别进行一下判断,进行类别归类(针对分类算法),最后比较一下被判定哪一类最多,就预测该样本为哪一类。

随机森林算法有两个主要环节:决策树的生长和投票过程。

决策树生长步骤:

1.从容量为N的原始训练样本数据中采取放回抽样方式(即bootstrap取样)

随机抽取自助样本集,重复k(树的数目为k)次形成一个新的训练集N,以此生成一棵分类树;

2.每个自助样本集生长为单棵分类树,该自助样本集是单棵分类树的全部训

练数据。设有M个输入特征,则在树的每个节点处从M个特征中随机挑选m(m < M)个特征,按照节点不纯度最小的原则从这m个特征中选出一个特征进行分枝生长,然后再分别递归调用上述过程构造各个分枝,直到这棵树能准确地分类训练集或所有属性都已被使用过。在整个森林的生长过程中m将保持恒定;

3.分类树为了达到低偏差和高差异而要充分生长,使每个节点的不纯度达到

最小,不进行通常的剪枝操作。

投票过程:

随机森林采用Bagging方法生成多个决策树分类器。

基本思想:

1.给定一个弱学习算法和一个训练集,单个弱学习算法准确率不高,可以视

为一个窄领域专家;

2.将该学习算法使用多次,得出预测函数序列,进行投票,将多个窄领域专

家评估结果汇总,最后结果准确率将大幅提升。

随机森林的优点:

?可以处理大量的输入变量;

?对于很多种资料,可以产生高准确度的分类器;

?可以在决定类别时,评估变量的重要性;

?在建造森林时,可以在内部对于一般化后的误差产生不偏差的估计; ?包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度;

?提供一个实验方法,可以去侦测variable interactions;

?对于不平衡的分类资料集来说,可以平衡误差;

?计算各例中的亲近度,对于数据挖掘、侦测偏离者(outlier)和将资料视觉化非常有用;

?使用上述。可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料;

?学习过程很快速。

缺点

?随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合; ?对于有不同级别的属性的数据,级别划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

R语言实现

寻找最优参数mtry,即指定节点中用于二叉树的最佳变量个数

library("randomForest")

n<-length(names(train_data)) #计算数据集中自变量个数,等同n=ncol(train_data) rate=1#设置模型误判率向量初始值

for(i in 1:(n-1)){

set.seed(1234)

rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=i,ntre e=1000)

rate[i]<-mean(rf_train$err.rate) #计算基于OOB数据的模型误判率均值

print(rf_train)

}

rate #展示所有模型误判率的均值

plot(rate)

寻找最佳参数ntree,即指定随机森林所包含的最佳决策树数目

set.seed(100)

rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntre

e=1000)

plot(rf_train) #绘制模型误差与决策树数量关系图

legend(800,0.02,"IS_LIUSHI=0",cex=0.9,bty="n")

legend(800,0.0245,"total",cex=0.09,bty="n")

随机森林模型搭建

set.seed(100)

rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntre

e=400,importance=TRUE,proximity=TRUE)

?importance设定是否输出因变量在模型中的重要性,如果移除某个变量,模型方差增加的比例是它判断变量重要性的标准之一;

?proximity参数用于设定是否计算模型的临近矩阵;

?ntree用于设定随机森林的树数。

输出变量重要性:分别从精确度递减和均方误差递减的角度来衡量重要程度。importance<-importance(rf_train)

write.csv(importance,file="E:/模型搭建/importance.csv",https://www.360docs.net/doc/b33844000.html,s=T,quote=F)

barplot(rf_train$importance[,1],main="输入变量重要性测度指标柱形图")

box()

提取随机森林模型中以准确率递减方法得到维度重要性值。type=2为基尼系数方法

importance(rf_train,type=1)

varImpPlot(x=rf_train,sort=TRUE,n.var=nrow(rf_train$importance),main="输入变量重要性测度散点图")

信息展示

print(rf_train) #展示随机森林模型简要信息

hist(treesize(rf_train)) #展示随机森林模型中每棵决策树的节点数

max(treesize(rf_train));min(treesize(rf_train))

MDSplot(rf_train,train_data$IS_OFF_USER,palette=rep(1,2),pch=as.numeric(train_data$IS _LIUSHI)) #展示数据集在二维情况下各类别的具体分布情况

检测

pred<-predict(rf_train,newdata=test_data)

pred_out_1<-predict(object=rf_train,newdata=test_data,type="prob") #输出概率

table <- table(pred,test_data$IS_LIUSHI)

sum(diag(table))/sum(table) #预测准确率

plot(margin(rf_train,test_data$IS_LIUSHI),main=观测值被判断正确的概率图)

randomForest包可以实现随机森林算法的应用,主要涉及5个重要函数,语法和参数请见下

1:randomForest()函数用于构建随机森林模型

randomForest(formula, data=NULL, ..., subset, na.action=na.fail)

randomForest(x, y=NULL, xtest=NULL, ytest=NULL, ntree=500,

mtry=if(!is.null(y) && !is.factor(y))

max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x))),

replace=TRUE, classwt=NULL, cutoff, strata,

sampsize = if(replace) nrow(x) else ceiling(.632*nrow(x)),

nodesize = if(!is.null(y) && !is.factor(y)) 5else1,

maxnodes = NULL,

importance=FALSE, localImp=FALSE, nPerm=1,

proximity, oob.prox=proximity,

norm.votes=TRUE, do.trace=FALSE,

keep.forest=!is.null(y) && is.null(xtest), corr.bias=FALSE,

keep.inbag=FALSE, ...)

?formula指定模型的公式形式,类似于y~x1+x2+x3…;

?data指定分析的数据集;

?subset以向量的形式确定样本数据集;

?na.action指定数据集中缺失值的处理方法,默认为na.fail,即不允许出现缺失值,也可以指定为na.omit,即删除缺失样本;

?x指定模型的解释变量,可以是矩阵,也可以是数据框;

?y指定模型的因变量,可以是离散的因子,也可以是连续的数值,分别对应于随机森林的分类模型和预测模型。这里需要说明的是,如果不指定y 值,则随机森林将是一个无监督的模型;

?xtest和ytest用于预测的测试集;

?ntree指定随机森林所包含的决策树数目,默认为500;

?mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值;

?replace指定Bootstrap随机抽样的方式,默认为有放回的抽样?classwt指定分类水平的权重,对于回归模型,该参数无效;

?strata为因子向量,用于分层抽样;

?sampsize用于指定样本容量,一般与参数strata联合使用,指定分层抽样中层的样本量;

?nodesize指定决策树节点的最小个数,默认情况下,判别模型为1,回归模型为5;

?maxnodes指定决策树节点的最大个数;

?importance逻辑参数,是否计算各个变量在模型中的重要性,默认不计算,该参数主要结合importance()函数使用;

?proximity逻辑参数,是否计算模型的临近矩阵,主要结合MDSplot()函数使用;

?oob.prox是否基于OOB数据计算临近矩阵;

?norm.votes显示投票格式,默认以百分比的形式展示投票结果,也可以采用绝对数的形式;

?do.trace是否输出更详细的随机森林模型运行过程,默认不输出;?keep.forest是否保留模型的输出对象,对于给定xtest值后,默认将不保留算法的运算结果。

2:importance()函数用于计算模型变量的重要性

importance(x, type=NULL, class="NULL", scale=TRUE, ...)

?x为randomForest对象;

?type可以是1,也可以是2,用于判别计算变量重要性的方法,1表示使用精度平均较少值作为度量标准;2表示采用节点不纯度的平均减少值最为度量标准。值越大说明变量的重要性越强;

?scale默认对变量的重要性值进行标准化。

3:MDSplot()函数用于实现随机森林的可视化

MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)

?rf为randomForest对象,需要说明的是,在构建随机森林模型时必须指定计算临近矩阵,即设置proximity参数为TRUE;

?fac指定随机森林模型中所使用到的因子向量(因变量);

?palette指定所绘图形中各个类别的颜色;

?pch指定所绘图形中各个类别形状;

随机森林

学习算法 根据下列算法而建造每棵树: 1. 用N 来表示训练例子的个数,M表示变量的数目。 2. 我们会被告知一个数m ,被用来决定当在一个节点上做决定时,会使用到多少个变量。m应小于M 3. 从N个训练案例中以可重复取样的方式,取样N次,形成一组训练集(即bootstrap取样)。并使用这棵树来对剩余预测其类别,并评估其误差。 4. 对于每一个节点,随机选择m个基于此点上的变量。根据这m 个变量,计算其最佳的分割方式。 5. 每棵树都会完整成长而不会剪枝(Pruning)(这有可能在建完一棵正常树状分类器后会被采用)。 优点 随机森林的优点有: 1. 对于很多种资料,它可以产生高准确度的分类器。 2. 它可以处理大量的输入变量。 3. 它可以在决定类别时,评估变量的重要性。 4. 在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计。 5. 它包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度。 6. 它提供一个实验方法,可以去侦测variable interactions 。 7. 对于不平衡的分类资料集来说,它可以平衡误差。 8. 它计算各例中的亲近度,对于数据挖掘、侦测偏离者(outlier)和将资料视觉化非常有用。 9. 使用上述。它可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料。 10. 学习过程是很快速的。 缺点 1. 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟 2. 对于有不同级别的属性的数据,级别划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

随机森林算法

随机森林算法 1.算法简介 随机森林由LeoBreiman(2001)提出,它通过自助法(bootstrap)重采样技术,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练样本集合,然后根据自助样本集生成k个分类树组成随机森林,新数据的分类结果按分类树投票多少形成的分数而定。其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于一个独立抽取的样品,森林中的每棵树具有相同的分布,分类误差取决于每一棵树的分类能力和它们之间的相关性。特征选择采用随机的方法去分裂每一个节点,然后比较不同情况下产生的误差。能够检测到的内在估计误差、分类能力和相关性决定选择特征的数目。单棵树的分类能力可能很小,但在随机产生大量的决策树后,一个测试样品可以通过每一棵树的分类结果经统计后选择最可能的分类。 2.算法原理 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。 随机森林模型的基本思想是:首先,利用bootstrap抽样从原始训练集抽取k 个样本,且每个样本的样本容量都与原始训练集一样;其次,对k个样本分别建立k个决策树模型,得到k种分类结果;最后,根据k种分类结果对每个记录进行投票表决决定其最终分类,如下图所示。 在建立每一棵决策树的过程中,有两点需要注意采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。

随机森林

随机森林 基础内容: 这里只是准备简单谈谈基础的内容,主要参考一下别人的文章,对于随机森林与GBDT,有两个地方比较重要,首先是information gain,其次是决策树。这里特别推荐Andrew Moore大牛的Decision Trees Tutorial,与Information Gain Tutorial。Moore的Data Mining Tutorial系列非常赞,看懂了上面说的两个内容之后的文章才能继续读下去。 决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,比如说下面的决策树: 就是将空间划分成下面的样子: 这样使得每一个叶子节点都是在空间中的一个不相交的区域,在进行决策的时候,会根据输入样本每一维feature的值,一步一步往下,最后使得样本落入N个区域中的一个(假设有N个叶子节点) 随机森林(Random Forest):

随机森林是一个最近比较火的算法,它有很多的优点: ?在数据集上表现良好 ?在当前的很多数据集上,相对其他算法有着很大的优势 ?它能够处理很高维度(feature很多)的数据,并且不用做特征选择 ?在训练完后,它能够给出哪些feature比较重要 ?在创建随机森林的时候,对generlization error使用的是无偏估计 ?训练速度快 ?在训练过程中,能够检测到feature间的互相影响 ?容易做成并行化方法 ?实现比较简单 随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。 在建立每一棵决策树的过程中,有两点需要注意- 采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M 个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤- 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。 按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。 随机森林的过程请参考Mahout的random forest。这个页面上写的比较清楚了,其中可能不明白的就是Information Gain,可以看看之前推荐过的Moore的页面。

随机森林

随机森林 定义:随机森林是一个分类器,它有一系列的单株树决策器{h (X,,θk );k=1,......} 来组成,其中{θk }是独立同分布的随机变量。再输入X 时,每一棵树只投一票给它认为最合适的类。在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定,构成随机森林的基础分类器称为决策树。 Leo Breiman 和Adele Cutler 发展出推论出随机森林的算法。 这个术语是1995年由贝尔实验室的Tin Kam Ho 所提出的随机决策森林(random decision forests )而来的。这个方法则是结合 Breimans 的 "Bootstrap aggregating" 想法和 Ho 的"random subspace method"" 以建造决策树的集合。 随机森林是一个组合分类器,构成随机森林的基础分类器是决策树。 决策树算法 决策树可以视为一个树状预测模型,它是由结点和有向边组成的层次结构。树中包含3个节点:根节点。内部节点,终节点(叶子节点)。决策树只有一个根节点,是全体训练集的结合。树中的每个内部节点都是一个分裂问题,它将到达该节点的样本按某个特定的属性进行分割,可以将数据集合分割成2块或若干块。每个终结点(叶子节点)是带有分裂标签的数据集合,从决策树的根节点到叶子节点的每一条路径都形成一个类;决策树的算法很多,例如ID3算法,CART 算法等。这些算法均采用自上而下的贪婪的算法,每个内部节点选择分类效果最好的属性进行分裂节点,可以分为两个或若干个子节点,继续此过程到这可决策树能够将全部训练数据准确的分类,或所有属性都被用到为止。具体步骤如下: 1)假设T 为训练样本集。 2)选择一个最能区分T 中样本的一个属性。 3)创建一个数的节点,它的值是所选择的属性,创建此节点的子节点,每个子链代表所选属性的唯一值,适用子链的值进一步将样本细分为子类。 对于3)创建的三个子类 (1)如果子类的样本满足预定义的标准,或者树的这条路的剩余可选属性集为空,为沿此路径的新的样本指定类别。 (2)如果子类不满足于定义的标准,或者至少有一个属性能细分树的路径,设T 为当前子类样本的集合,返回步骤2),以下简单的给出二分树的结构图示: 根节点 中间节点 叶节点 规则1 叶节点 规则2 中间节点

数据挖掘之随机森林算法实验报告

太原师范学院 实验报告 Experimentation Report of Taiyuan Normal University 系部计算机系年级大三课程大数据分析 姓名XXX 同组者日期 项目数据挖掘之随机森林算法 一、实验目的 1.了解随机森林。随机森林就是通过集成学习的思想将多棵树 集成的一种算法,它的基本单元是决策树,而它的本质属于 机器学习的一大分支——集成学习(Ensemble Learning)方 法。 2.掌握随机森林的相关知识,信息、熵、信息增益等的概念。 3.掌握随机森林中数据分析的几种基本方法,决策树算法, CART算法等。 4.了解集成学习的定义和发展。 5.掌握随机森林的生成规则,随机森林的生成方法,随机森林 的特点等相关知识。 二、实验内容 1.结合老师上课所讲内容及课本知识,通过查找相关资料,

学习与决策树,随机森林相关的知识。 2.查找相关例题,深入理解随机森林的各种算法。 3.找一个数据集,利用随机森林的相关算法训练随机森林, 对样本进行判段并计算其判断的准确度。 三、实验仪器及平台 计算机一台MATLAB 2018a 四、实验原理 1.随机森林的基本概念: 通过集成学习的思想将多棵树集成的一种算法,它的基本单 元是决策树,而它的本质属于机器学习的一大分支——集成 学习(Ensemble Learning)方法。随机森林的名称中有两个 关键词,一个是“随机”,一个就是“森林”。“森林”我们 很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了, 这样的比喻还是很贴切的,其实这也是随机森林的主要思想 --集成思想的体现。 2.决策树 2.1信息、熵、信息增益 这三个基本概念是决策树的根本,是决策树利用特征来分类 时,确定特征选取顺序的依据。 2.2决策树算法 决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可

随机森林实验报告

随机森林实验报告 实验目的 实现随机森林模型并测试。 实验问题 Kaggle第二次作业Non-linear classification 算法分析与设计 一.算法设计背景: 1.随机森林的原子分类器一般使用决策树,决策树又分为拟合树和分类树。这两者的区别在于代价估值函数的不同。 2.根据经验,用拟合树做分类的效果比分类树略好。 3.对于一个N分类问题,它总是可以被分解为N个2分类问题,这样分解的好处是其决策树更加方便构造,更加简单,且更加有利于用拟合树来构建分类树。对于每一个2分类问题,构造的树又叫CART树,它是一颗二叉树。 4.将N个2分类树的结果进行汇总即可以得到多分类的结果。 树构造:

6.随机森林构造: 二.算法思路: 将一个N分类问题转化为N个二分类问题。转化方法是:构造N棵二叉拟合树,这里假设N为26,然后我们给N棵二叉树依次标号为1,2,3...26。1号树的结果对应于该条记录是不是属于第一类,是则输出1,否则输出号树的结果对应于该条记录是不是属于第二类,是则1否则0,依此类推。这样,我们的26棵二叉树的结果就对应了26个下标。 例如对于某条记录,这26个二叉树的结果按序号排列为{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...1,0},那么这条记录的分类应该为25。要将一个26维的0,1序列变回

一个索引,我们只需要找出这个序列中值最大的元素的索引,这个索引即是序列号。 我们将上面的26棵分别对26个索引做是否判断的二分类树视为一个整体,在多线程的环境下,构造多个这样的整体,然后进行求和运算,最后取出每个结果序列中值最大的元素的下标作为分类值,那么久得到了我们想要的结果,随机森林完成。 三.算法流程: 1.读入训练集trainset,测试集testset 2.将训练集分割为输入trainIn,输出trainOut 3.这里假设类别数N为26,将trainOut[记录条数] 映射为 transformTrainOut[训练记录数][26] 4.初始化transformTestOut[测试记录数][26]全部为0 i = 1 : ForestSize: 策树 在这里,我们每一次26分类是由26棵CART共同完成的,CART的cost function采用的是gini系数,CART的最大层数为7,分裂停止条件为当前节点GINI为0或者当前节点所在层数到达了7. 2.随机森林 a.随机森林每次循环的训练集采样为原训练集的. b.对于森林中每一棵决策树每一次分割点的选取,对属性进行了打乱抽样,抽样数为25,即每次分割只在25个属性中寻找最合适的值。并且对于每个选取的属性,我们进行了行采样。即如果这个属性所拥有的属性值数大于30,我们选取其中30个作为分割候选,如果小于30,则全部纳入分割候选。 四.代码详解 1.训练集/测试集的读入 a.在中定义了:

随机森林算法介绍及R语言实现

随机森林算法介绍及R语言实现 随机森林算法介绍 算法介绍: 简单的说,随机森林就是用随机的方式建立一个森林,森林里面有很多的决策树,并且每棵树之间是没有关联的。得到一个森林后,当有一个新的样本输入,森林中的每一棵决策树会分别进行一下判断,进行类别归类(针对分类算法),最后比较一下被判定哪一类最多,就预测该样本为哪一类。 随机森林算法有两个主要环节:决策树的生长和投票过程。 决策树生长步骤: 1. 从容量为N的原始训练样本数据中采取放回抽样方式(即bootstrap取样) 随机抽取自助样本集,重复k(树的数目为k)次形成一个新的训练集N,以此生成一棵分类树; 2. 每个自助样本集生长为单棵分类树,该自助样本集是单棵分类树的全部训 练数据。设有M个输入特征,则在树的每个节点处从M个特征中随机挑选m(m < M)个特征,按照节点不纯度最小的原则从这m个特征中选出一个特征进行分枝生长,然后再分别递归调用上述过程构造各个分枝,直到这棵树能准确地分类训练集或所有属性都已被使用过。在整个森林的生长过程中m将保持恒定; 3. 分类树为了达到低偏差和高差异而要充分生长,使每个节点的不纯度达到 最小,不进行通常的剪枝操作。 投票过程: 随机森林采用Bagging方法生成多个决策树分类器。 基本思想: 1. 给定一个弱学习算法和一个训练集,单个弱学习算法准确率不高,可以视 为一个窄领域专家; 2. 将该学习算法使用多次,得出预测函数序列,进行投票,将多个窄领域专 家评估结果汇总,最后结果准确率将大幅提升。 随机森林的优点: ?可以处理大量的输入变量; ?对于很多种资料,可以产生高准确度的分类器; ?可以在决定类别时,评估变量的重要性; ?在建造森林时,可以在内部对于一般化后的误差产生不偏差的估计;

随机森林

随机森林 为了克服决策树容易过度拟合的缺点,Breiman(2001)提出了一种新的组合分类器算法——随机森林算法(Random Forests , RF)。他把分类决策树组合成随即森林,即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果。随机森林在运算量没有显著提高的前提下提高了预测精度,对多元共线性不敏感,可以很好地预测多达几千个解释变量的作用,被称为当前最好的算法之一。 基本原理 1.随机森林的定义 随机森林是一个由决策树分类器集合{} θ构成的组合分类器模 x ,2,1 k h (= ), , k 型,其中参数集{} θ是独立同分布的随机向量,x是输入向量。当给定输入向量 k 时每个决策树有一票投票权来选择最优分类结果。每一个决策树是由分类回归树(CART)算法构建的未剪枝的决策树。因此与CART相对应,随机森林也分为随机分类森林和随机回归森林。目前,随机分类森林的应用较为普遍,它的最终结果是单棵树分类结果的简单多数投票。而随机回归森林的最终结果是单棵树输出结果的简单平均。 2.随机森林的基本思想 随机森林是通过自助法(Bootstrap)重复采样技术,从原始训练样本集N 中有放回地重复随机抽取k个样本生成新的训练集样本集合,然后根据自助样本生成k决策树组成的随机森林。其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖一个独立抽取的样本,森林中的每棵树具有相同的分布,分类误差取决于每一棵树的分类能力和它之间的相关性。 3.随机森林的生成过程 根据随机森林的原理和基本思想,随机森林的生成主要包括以下三个步骤:首先,通过Bootstrap方法在原始样本集S中抽取k个训练样本集,一般情况下每个训练集的样本容量与S一致; 其次,对k个训练集进行学习,以此生成k个决策树模型。在决策树生成过

R软件实现随机森林算法(带详细代码操作)

R软件实现随机森林算法(带详细代码操作) 随机森林算法是我们经常要用到的机器学习,本文我们将使用随机森林模型,根据鲍鱼的一系列特征来预测鲍鱼是否“新鲜”。鲍鱼数据来自UCI机器学习存储库(我们将数据分为训练和测试集)。 目录如下: 1、数据准备(输入,数据已处理等) 2、数据分割(把数据分割为测试集和训练集) 3、变量选择 4、模型拟合结果及评估(混淆矩阵,ROC曲线等) 首先,我们将数据加载到R中: # 加载需要的安装包 library(caret) library(ranger) library(tidyverse) library(e1071) # 读入数据 abalone_data <- read.table("../data/abalone.data", sep = ",") # 读入变量名称 colnames(abalone_data) <- c("sex", "length", "diameter", "height", "whole.weight", "shucked.weight", "viscera.weight", "shell.weight", "age") # 对预测变量进行划分 abalone_data <- abalone_data %>% mutate(old = age > 10) %>% # remove the "age" variable select(-age) # 把数据分割成训练集合测试集 set.seed(23489) train_index <- sample(1:nrow(abalone_data), 0.9 * nrow(abalone_data)) abalone_train <- abalone_data[train_index, ] abalone_test <- abalone_data[-train_index, ] # remove the original dataset rm(abalone_data) # view the first 6 rows of the training data head(abalone_train) 可以看到,输出结果如下:

随机森林(精)

随机森林 θk);k=1,......}定义:随机森林是一个分类器,它有一系列的单株树决策器{h(X,, θk}是独立同分布的随机变量。再输入X时,每一棵树只投一票给来组成,其中{ 它认为最合适的类。在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定,构成随机森林的基础分类器称为决策树。Leo Breiman和Adele Cutler发展出推论出随机森林的算法。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans 的"Bootstrap aggregating" 想法和Ho 的"random subspace method"" 以建造决策树的集合。随机森林是一个组合分类器,构成随机森林的基础分类器是决策树。 决策树算法 决策树可以视为一个树状预测模型,它是由结点和有向边组成的层次结构。树中包含3个节点:根节点。内部节点,终节点(叶子节点)。决策树只有一个根节点,是全体训练集的结合。树中的每个内部节点都是一个分裂问题,它将到达该节点的样本按某个特定的属性进行分割,可以将数据集合分割成2块或若干块。每个终结点(叶子节点)是带有分裂标签的数据集合,从决策树的根节点到叶子节点的每一条路径都形成一个类;决策树的算法很多,例如ID3算法,CART算法等。这些算法均采用自上而下的贪婪的算法,每个内部节点选择分类效果最好的属性进行分裂节点,可以分为两个或若干个子节点,继续此过程到这可决策树能够将全部训练数据准确的分类,或所有属性都被用到为止。具体步骤如下: 1)假设T为训练样本集。 2)选择一个最能区分T中样本的一个属性。 3)创建一个数的节点,它的值是所选择的属性,创建此节点的子节点,每个子链代表所选属性的唯一值,适用子链的值进一步将样本细分为子类。 对于3)创建的三个子类 (1)如果子类的样本满足预定义的标准,或者树的这条路的剩余可选属性集为空,为沿此路径的新的样本指定类别。 (2)如果子类不满足于定义的标准,或者至少有一个属性能细分树的路径,设T为当前子类样本的集合,返回步骤2),以下简单的给出二分树的结构图示:

决策树和随机森林

前言: 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。 美国金融银行业的大数据算法:随机森林模型+综合模型 模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病,有点类似于三个臭皮匠等于一个诸葛亮的做法,虽然这几百棵决策树中的每一棵都很简单(相对于C4.5这种单决策树来说),但是他们组合起来确是很强大。 在最近几年的paper上,如iccv这种重量级的会议,iccv 09年的里面有不少的文章都是与Boosting与随机森林相关的。模型组合+决策树相关的算法有两种比较基本的形式–随机森林与GBDT((Gradient Boost Decision Tree),其他的比较新的模型组合+决策树的算法都是来自这两种算法的延伸。本文主要侧重于GBDT,对于随机森林只是大概提提,因为它相对比较简单。 在看本文之前,建议先看看机器学习与数学(3)与其中引用的论文,本文中的GBDT主要基于此,而随机森林相对比较独立。 基础内容: 这里只是准备简单谈谈基础的内容,主要参考一下别人的文章,对于随机森林与GBDT,有两个地方比较重要,首先是information gain,其次是决策树。这里特别推荐Andrew Moore大牛的Decision Trees Tutorial,与Information Gain Tutorial。Moore的Data Mining Tutorial系列非常赞,看懂了上面说的两个内容之后的文章才能继续读下去。 决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,比如说下面的决策树:

相关文档
最新文档