随机森林
使用代码
library( "randomForest" ) data(iris) set.seed(100) ind<-sample(2,nrow(iris),replace=TRUE,prob=c(0.8,0.2)) iris.rf<randomForest(Species~.,iris[ind==1,],ntree=50,nPerm=1 0,mtry=3,proximity=TRUE,importance=TRUE) print(iris.rf) iris.pred<-predict( iris.rf,iris[ind==2,] ) table(observed=iris[ind==2,"Species"],predicted=iris.pred )
I(s1,s2,……,sm)越小, s1,s2,……,sm就越有序(越 纯),分类效果就越好。
A为属性,具有V个不同的取值, S被A 划分为V 个子 集s1,s2,……,sv,sij是子集sj中类Ci的样本数。 E(A)= ∑(s1j+ ……+smj)/s * I(s1j,……,smj) 信息增益:Gain(A)= I(s1,s2,……,sm) - E(A)
决策树的定义
决策树是这样的一颗树:
每个内部节点上选用一个属性进行分割 每个分叉对应一个属性值 每个叶子结点代表一个分类
A1 a11 A2 a21 c1 a22 c2 a13 A3 a31 c2 a32 c1
a12 c1
决策树框架
决策树生成算法分成两个步骤
树的生成
开始,数据都在根节点 递归的进行数据分片 防止过拟合
树的剪枝
决策树使用: 对未知数据进行分割
按照决策树上采用的分割属性逐层往下,直到 一个叶子节点
随机森林算法
随机选取训练样本集:使用Bagging方法形 成每颗树的训练集 随机选取分裂属性集:假设共有M个属 性,指定一个属性数F≤M,在每个内部结 点,从M个属性中随机抽取F个属性作分裂 属性集,以这F个属性上最好的分裂方式对 结点进行分裂(在整个森林的生长过程 中, F的值一般维持不变) 每颗树任其生长,不进行剪枝
决策树续2—分裂属性的选择度量
原则:分类效果最好的(或分类最纯的, 或能使树的路径最短)的属性 常用度量
信息增益——Information gain (ID3/C4.5) • 所有属性假设都是取离散值的字段(ID3) • 经过修改之后可以适用于连续值字段 (C4.5) 基尼指数——Gini index (Classification and
随机森林的特点
两个随机性的引入,使得随机森林不容易陷入过 拟合 两个随机性的引入,使得随机森林具有很好的抗 噪声能力 对数据集的适应能力强:既能处理离散型数据, 也能处理连续型数据,数据集无需规范化。 可生成一个Proximities=(pij)矩阵,用于度量样 本之间的相似性: pij=aij/N, aij表示样本i和j出现在 随机森林中同一个叶子结点的次数,N随机森林 中树的颗数。 可以得到变量重要性排序(两种:基于OOB误分 率的增加量和基于分裂时的分类节点纯度下降 量)
两个重要的代码
randomForest Predict
主要参数是ntree,mtry
第一步,随机森林的安装
随机森林是基于R语言运行,安装过程分两步: 1.ubuntu系统下首先安装R语言包。 用一行代码。 sudo apt-get install R 然后ubuntu系统就自动的帮你安装完R。 2.安装random forest 意想不到的简单。 打开终端 ,输入R,就算进入到了R语言的编码界面。 在大于号后面入 “install.packages("randomForest")“ 然后你选择一个距离你比较近的数据源就可以了。
随机ห้องสมุดไป่ตู้林
随机森林的定义
随机森林是一个树型分类器,构建的没有剪 枝的分类回归决策树;输入的是一个二维 的矩阵,决定了单颗树的生长过程;森林 的输出采用简单多数投票法(针对分类) 或单颗树输出结果的简单平均(针对回 归)得到。
妹子分类问题
计算机看不到妹子的长 相,只能得到一些属性 (Attributes)描述,包 括:身高、体重、头部 面积、头部形状、眼睛 面积、头发长度、胸
Regression Tress,CART,Breiman,1984)
• 能够适用于离散和连续值字段
信息增益
任意样本分类的期望信息:
I(s1,s2,……,sm)=-∑Pi log2(pi)
(i=1..m)
其中,数据集为S,m为S的分类数目, Pi≈|Si/|S| Ci为某分类标号,Pi为任意样本属于Ci的概率, si为分类Ci 上的样本数
由属性A划分为子集的熵:
分裂属性选择规则:选择具有最大信息增益的属 性为分裂属性
OOB
估计
计算1(以树为单位,错误):对每颗树,利用未 被该树选中的训练样本点,统计该树的误分率; 将所有树的误分率取平均得到随机森林的OOB误 分率 计算2(以样本为单位,正确):对每个样本, 计算它作为OOB样本的树对它的分类情况(约 1/3的树);然后以简单多数投票作为该样本的分 类结果;最后用误分个数占样本总数的比率作为 随机森林的OOB误分率 OOB误分率是随机森林的泛化误差的一个无偏估 计 OOB估计是高效的,其结果近似于需要大量计算 的k折交叉验证。
打开R界面
我的代码
library(randomForest) for (i in 1:5) { set.seed(i) setwd("/home/ubuntu/desktop/RNA/randomForest/train_all") name<-paste("set",i,".txt",sep="") name1<-paste("tree1",i,sep="") name2<-paste("random",i,sep="") train1<-read.table(name,header=T) train<-train1[,2:dim(train1)[2]] hot.rf=randomForest(binding ~ ., data=train, ntree=500, mtry=18, importance=TRUE) setwd("/home/ubuntu/desktop/RNA/randomForest/query_all") test1<-read.table(name,header=T) test<-test1[,2:dim(test1)[2]] pre_1<-predict(hot.rf,test) #table(observed = test["binding"], predicted = iris.pred) setwd("/home/ubuntu/desktop/RNA/randomForest/out") write.table(getTree(hot.rf,1),name1) write(hot.rf,name2) write.table(pre_1,name) }