在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。
Leo Breiman和Adele Cutler发展出推论出随机森林的算法。 而 “Random Forests” 是他们的商标。 这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合 Breimans 的 “Bootstrap aggregating” 想法和 Ho 的”random subspace method”” 以建造决策树的集合。
决策树是这样的一棵树:
详见决策树讲解
根据下列算法而建造每棵树:
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. 学习过程是很快速的。
function Randomfre(set,numtrees )
%利用随机森林进行训练跟预测
% by YangL
s=['rf/train_',num2str(set),'.rf'];
trainall=load(s);
[N D] =size(trainall);
train=zeros(N,D);
for i=1:D-1
for j=1:N
train(j,i)=trainall(j,i);
end
end
trainlabel=zeros(N,1);
for i=1:N
trainlabel(i,D)=train(i,D);
end
s=['rf/predict_',num2str(set),'.rf'];
testall=load(s);
[N D] =size(testall);
test=zeros(N,D);
for i=1:D-1
for j=1:N
test(j,i)=testall(j,i);
end
end
%finish loading data
m=floor(sqr(D-1));
model=regRF_train(train,trainlabel,numtrees,m);
testlabel=regRF_predict(test,model);
%finished training
s=['rf/train_',num2str(set),'.rf']
fid=fopen('rf/set',num2str(set),'.predict','w');
for i=1:N
fprintf(fid,'%d ',testlabel(i));
end
%print out
function model = classRF_train(X,Y,ntree,mtry, extra_options)
随机森林中模型的训练
X,表示输入的数据矩阵
Y输出
Ntree 设置的树的数目
Mtry的默认值为
floor(sqrt(size(X,2)),表示不超过矩阵X列数的二次开根值的整数。
extra_options 包含很多控制RF的项
extra_options.replace 取值为1或0,默认值为1,表示是否做变量替换
extra_options.classwt 表示预先知道的类,函数首先得到一个升序排列的标签然后给先前的类同样的排序。
extra_options.cutoff 只在分类器中使用的一个向量,长度等于类的数目。对类的观察值是取对cutoff投票占的的最大比例的一个。
extra_options.strata 用于分层抽样
extra_options.sampsize 样本的长度
extra_options.nodesize 表示终端节点的最小值,这个参数设置得越大会使更小的树生长,耗时更少。
extra_options.importance 判断是否需要对预测器的importance进行评估
extra_options.localImp 决定是否对casewise的重要性度量进行计算
extra_options.proximity 判别是否计算行之间的距离
extra_options.oob_prox 判断是否计算out-of-bag
extra_options.do_trace 如果设定为TRUE,当随机森林运行的时候输出更多冗长的数据。如果设置为一些整数,输出每个追踪树。
extra_options.keep_inbag 通过树的数目矩阵跟踪每个样本在树上的in-bag。
norm_votes 统计每一类的投票数
importance 对于分类器来说是一个列数等于类别数加二,第一列计算精度下降值。在ncalss+1列表示所有类平均精度减少值。最后一列表示Gini指数平均减小值。在随机森林用于回归的应用中importance表示的含义又不一样,我们只用到分类的作用,所以对回归的含义不做介绍。
importanceSD 标准差
localImp 包含importance标准化残差测量值的矩阵
ntree 生长的树的数目
mtry 在每一个分裂节点处样本预测器的个数。
Votes 一个矩阵,行表示每一个输入数据点,列表示每一类,记录投票数。
Proximity 如果proximity=TRUE表示随机森林被调用。
Combine 把树结合起来
getTree(rfobj, k=1, labelVar=FALSE),这个函数的作用是从随机森林中提取树的结构,rfob表示对应的随机森林,k表示要提取的那棵树,, labelVar表示是否是最好的标签用于变量分离和类的预测。在分类器预测中分裂点用整数表示,比如预测器如果有四个参数,分裂点是十三,就表示成(1.0.1.1)因为
if labelVar=TRUE) 一个列数为六,行数等于树中节点总数的矩阵。六列分别为:left daughter,如果是末端左子女节点取值为0。right daughter,如果这个右子节点是末端节点则取值为零。
split var表示哪个变量用来分裂节点,如果是末端节点则取零。split point 表示最佳分裂的位置。
Status 是否是终端节点-1/1. Prediction 对节点的预测 用0表示还没有到达终端节点。
grow(x, how.many, …) 给现有的树的群体增加新的额外的树。X表示随机森林的类,how.many表示增加到随机森林x中的树的个数。
importance(x, type=NULL, class=NULL, scale=TRUE, …) x表示随机森林中的类,type表示测量的类型,取值为1的时候表示不准确度,取值为2的时候表示节点不纯度测量。Class 返回值表示哪一个具体的类被测量了。Scale 对测量值进行变换,求他们的标准差。对于分类器来说,节点不纯度是通过Gini系数求解的。返回值为一个矩阵,行表示每个预测变量,列表示不同的importance测量值。
margin(x, …) 从随机森林分类器中计算或绘制预测器的边缘。
MDSplot(rf, fac, k=2, palette=NULL, pch=20, …) 随机森林中相似矩阵的多维测量。rf 表示包含近邻成分的随机森林的类。Fac 训练rf的一个响应值。k表示伸缩坐标的维数。Palette用颜色要区分不同的类。
outlier(x, cls=NULL, …) 基于相似矩阵计算无关测量值。x指的是相似矩阵。Cls表示相似矩阵所在的行属于的类。如果没有给出,则默认为所有数据来自同一个类。
partialPlot(x, pred.data, x.var, which.class, w, plot = TRUE, add = FALSE, n.pt = min(length(unique(pred.data[, xname])), 51), rug = TRUE, xlab=deparse(substitute(x.var)), ylab=”“, main=paste(“Partial Dependence on”, deparse(substitute(x.var))), …)
用图表描述局部的一个变量对类的概率的边缘效应。
plot(x, type=”l”, main=deparse(substitute(x)), …)计算错误率
predict(object, newdata, type=”response”,norm.votes=TRUE, predict.all=FALSE, proximity=FALSE, nodes=FALSE,cutoff, …) 用随机森林预测测试数据。Object表示随机森林类的对象,由随机森林函数创建。Newdata表示包含新数据的数据帧或者矩阵。可表示响应,概率,票数,指输出的类型。Nodes判断是否是终点。Proximity判断是否需要进行近邻测量。predict.all判断是否保留所有的预测器。
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)) 5 else 1, 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, …)
data是一个可选的数据帧,包含模型中的变量。Subset是一个指示量表示哪一行应该被使用。
Xtest测试集,
ytest表示对测试集的输出,
Cutoff 是一个长度等于类的数目的向量。被预测的类是投票给cutoff投票率最高的一个类。
treesize(x, terminal=TRUE)表示数的宽度。