参考用书:数据挖掘:R语言实战      黄文 王正林  编著

 

随机森林基于决策树的分类器集成算法,其中每一棵树都依赖于一个随机向量,森林中的所有向量都是独立分布的。
通过自主法重采样技术,从原始训练样本集N中有放回地重复随机抽取k个严格不能生成新的训练集样本集合,
然后根据自主样本生成k个决策树组成的随机森林,新数据的分类结果按决策树投票多少形成的分数而定。
1.首先我们用N来表示原始训练集样本的个数,用M来表示变量的数目。
2.其次我们需要确定一个定值m,该值被用来决定当在一个节点上做决定时会使用到多少个变量。确定是需要注意m应小于M。
3.应用bootstrap法有放回地随机抽取k个新的自主样本集,并由此构建k个新的自主样本集,并由此构建k颗决策树,每次未被抽到的样本组成了k个袋外数据,即out——of——bag,简称OOB。
4.每个自助样本集生长为单棵决策树。在数的每个节点处从M个特征中随机挑选m个特征,按照节点不纯度最小的原则从这m个特征进行分支生长。这棵决策树进行了充分生长,使每个节点
的不纯度达到最小,不进行通常的剪枝操作。
5.根据生成的多个决策树分类器对需要进行预测的数据进行预测,根据每棵巨册书的投票取最高的一个类别。
森林中单颗树的分类强度越强大,即每棵树枝叶茂盛,则整体随机森林的分类性能越好。
森林中数之间的相关度越大,即树与树之间的枝叶互相穿插越多,则随机森林的分类性能越差。
树节点预选的变量个数,决定了单棵决策树的情况,
随机森林中树的个数决定了整片随机森林的总体规模
1.importance()函数提取模型中各个变量的重要性度量结果
importance(x, type=NULL, class=NULL, scale=TRUE, ...)
x指代的随机森林模型
class主要针对随机森林中的分类问题
type纸袋变量重要值的度量标准,1为采用精度平均较少值作为度量标准,2节点不纯度的平均减少值作为度量标准
scale是否对变量重要值进行标准化
2.MDSplot()函数对于随机森林模型进行可视化分析
MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)
参数rf随机森林模型
fac所使用到一个因子向量
k决定所绘制图像中所包含经过缩放的维度,默认值为2
palette决定各个类别点的颜色
pch决定所绘制图像中各个类别点的形状
3.rfImpute利用临近矩阵来对将要进行模型建立的预测数据中存在
的缺失值进行插值,不断迭代,得到最优样本拟合值
rfImpute(x, y, iter=5, ntree=300, ...)
rfImpute(x, data, ..., subset)
x含有一些缺失值的预测数据集,也可以为一个公式
y在这里为响应变量向量
iter为插值过程中的迭代次数
ntree为每次迭代生成的随机森林模型中的决策树数量
subest决定了将采用的样本集
4.treesize()函数查看每一个树所具有的节点个数
treesize(x, terminal=TRUE)
x为模型,terminal主要用于决定节点的计数方式,T计算最终根节点数目,F将所有节点全部计数
5.randomForest(0函数主要用来建立随机森林模型中的分类模型和回归模型

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)) 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, ...)


第一类使用格式中,formula代表是函数的形式,data代表模型中包含有变量的一组可选格式数据
subset主要用于抽取样本数据中的部分样本作训练集,
na.action主要设置缺失值的处理方式,na.fail不能出现缺失值,na.omit即忽略缺失值的样本
第二类使用格式中,x为一个矩阵或者一个格式化的数据集,y是响应变量,如果y是一个字符向量,
则所构建的随机森林为判别模型,如果y是一个数量向量,则所构建的随机森林为回归模型,如果不设定y的取值,则所构建的随机森林模型为一个无监督模型

xtest是一个格式数据或者矩阵,用来进行预测的测试集的预测指标
 ytest是参数xtest据诶的那个的测试集的真实分类情况
 ntree指代森林中的树的数目,mtry决定在决策树每次分支是所选择的变量个数
 replace决定随机抽样的方式,T有放回的随机抽样,F无放回的随机抽样
 strata是一个因子向量,主要用于决定分层抽样
 sampsize决定抽样的规模的,nodesize决定决策树的最少节点数,默认值判别模型中为1,回归模型中为5
 maxnodes用来决定随机森林中决策树的最大节点数,
 importance用来决定是否计算各个变量在模型中的重要值,
 proximmity用来决定是否计算模型的临近矩阵的install.packages("randomForest")
 library(randomForest)
 set.seed(4)#设定产生随机数的初始值
 data(mtcars)
 mtcars.rf=randomForest(mpg~.,data=mtcars,ntree=1000,importance=T)#基于数据集mtcars建立随机森林模型
 importance(mtcars.rf)#提取随机森林模型中的重要值
set.seed(1)
data(iris)
iris.rf=randomForest(Species~.,iris,proximity=T)
MDSplot(iris.rf,iris$Species,palette=rep(1,3),pch=as.numeric(iris$Species))
iris.na=iris
iris.na[75,2]=NA;iris.na[125,3]=NA;
set.seed(111)
iris.imputed=rfImpute(Species~.,data=iris.na)
list("real"=iris[c(75,125),1:4],"have-NA"=iris.na[c(75,125),1:4],
     "disposed"=round(iris.imputed[c(75,125),2:5],1))
iris.rf<-randomForest(Species~.,iris)
hist(treesize(iris.rf))
data(airquality)
set.seed(131)
ozone.rf=randomForest(Ozone~.,data=airquality,mtry=3,importance=T,
                      na.action=na.omit)
plot(ozone.rf)
setwd("C:\\Users\\Administrator\\Desktop\\数据分析")#使用UCI数据库中白酒品质数据集
wine=read.table("C:\\Users\\Administrator\\Desktop\\数据分析\\winequality-white.txt",header=T,sep=";",na.strings="null")
str(wine[1])
summary(wine)
cha=0#设置中间变量对处理后的向量进行临时存储
for(i in 1:4898)#只对每一个样本进行调整
{ 
  if(wine[i,12]>6)cha[i]="good"
  else if(wine[i,12]>5)cha[i]="mid"
  elsecha[i]="bad"
  }  
wine[,12]=factor(cha)#将字符型变量转化为含有因子的变量赋值给数据集wine
summary(wine$quality)
set.seed(71)#设置随机数生成器初始值
samp=sample(1:4898,3000)
set.seed(111)
wine.rf=randomForest(quality~.,data=wine,importance=TRUE,proximity=TRUE,ntree=500,subest=samp)#构建决策树为500棵的随机森林模型
x=subset(wine,select=-quality)#除quality以外的数据为自变量
y=wine$quality#提取quality为响应变量
set.seed(71)
samp=sample(1:4898,3000)
xr=x[samp,];yr=y[samp]
set.seed(111)
wine.rf=randomForest(xr,yr,importance=TRUE,proximity=TRUE,ntree=500)
print(wine.rf)#输出模型
importance(wine.rf)#对模型提取重要值列表
n=ncol(wine)-1#计算数据集自变量个数
rate=1#设置模型误判率向量初始值
for(i in 8:8)#依次增加节点所选变练个数
{
  set.seed(222)
  model=randomForest(quality~.,data=wine,mtry=i,importance=T,ntree=1000)
  rate[i]=mean(model$err.rate)#计算机与OOB数据的模型误判率均值
  print(model)
}
rate#展示所有模型误判率的均值
set.seed(222)
model=randomForest(qualitys~.,data=wine,mtry=1,importance=T,ntree=1000)
plot(model,col=1:1)#绘制模型误差与决策树数量关系图
legend(800,0.215,"mid",cex=0.9,bty="n")#为图像添加图例
legend(800,0.28,"bad",cex=0.9,bty="n")
legend(800,0.37,"good",cex=0.9,bty="n")
legend(800,0.245,"total",cex=0.9,bty="n")
set.seed(222)
model=randomForest(qualitys~.,data=wine,mtry=1,importance=T,ntree=400)
print(mode1)
hist(treesize(model))#展示随机森林中每棵树决策树的节点数
MDSplot(model,wine$quality,palette=rep(1,3),pch=as.numeric(wine$quality))#数据在二维情况下个类别的具体分情况