#自己的一些记录。 提供参考吧。
#可以直接复制到R运行
#加载包
library(randomForest)
#加载数据
data=read.csv("L6_filter.csv",row.names = 1,header=T)
#设置随机种子数,确保以后再执行代码时可以得到一样的结果
set.seed(123456789)
#数据随机采样设置70%数据用作训练集 30%用作测试集
train_sub = sample(nrow(data),7/10*nrow(data))
train_data = data[train_sub,]
test_data = data[-train_sub,]
#数据预处理 factor的作用是打上标签或者类别
train_data$zq101 = as.factor(train_data$zq101) #zq101是我的分组信息
test_data$zq101 = as.factor(test_data$zq101)
#筛选mtry个数
n<-length(names(train_data))
set.seed(123456789) #一些网友说每次随机森林前面都要跑一下
for(i in 1: (n-1)){
mtry_fit<-randomForest(zq101~. ,data=train_data,mtry=i)
err<-mean(mtry_fit$err.rate)
print(err)
}
##试验性训练模型,使用训练集构建随机森林
#ntree和mytry分布根据后面的步骤确定 决策树的数量,默认是500,
#mtry每个分组中随机的变量数一般是变量数开根,每棵树使用的特征个数
#mtry指定节点中用于二叉树的变量个数 ??randomForest
set.seed(123456789) #一些网友说每次随机森林前面都要跑一下
train_randomforest <- randomForest(zq101 ~ .,data = train_data,
ntree =500, mtry=8, importance=TRUE ,
proximity=TRUE)
#判断树的数量,树的数量大于?的时候就基本稳定了
plot(train_randomforest)
#查看变量的重要性
train_randomforest$importance
#对于变量重要性的判断,也可以通过画图的方式直观显现:
varImpPlot(train_randomforest, main = "variable importance",
n.var = 25) #var代表显示前?个变量
#对测试集进行预测??predict
pre_ran <- predict(train_randomforest,newdata=test_data)
#将真实值和预测值整合到一起
obs_p_ran = data.frame(prob=pre_ran,obs=test_data$zq101)
#输出混淆矩阵
table(test_data$zq101,pre_ran,dnn=c("真实值","预测值"))
#ROC曲线和AUC值??ROC
library(pROC)
ran_roc <- roc(test_data$zq101,as.numeric(pre_ran),ci=TRUE)
ran_roc
plot(ran_roc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
grid.col=c("green", "red"), max.auc.polygon=TRUE,
auc.polygon.col="skyblue", print.thres=TRUE,
main='随机森林模型ROC曲线,mtry=3,ntree=500')
#随机森林连续型变量 ??predict #对比下上一个也有加颜色的,type可以选择3个参数
fitted.prob<-predict(train_randomforest,newdata=test_data,type="prob")
roc_prob<-roc(as.ordered(test_data$zq101),fitted.prob[,2],ci=T) #计算ROC
auc(roc_prob)
roc_prob$ci
#??plot.roc
plot.roc(roc_prob,col="mediumblue",legacy.axes=TRUE)
roc_prob$ci
#导出图片 pdf 6*8
#交叉验证
set.seed(1264759)
data$zq101 = as.factor(data$zq101)
data1 <-data[,2:53]
#交叉验证中添加随机数的训练集、分组、交叉验证的次数
#step是样本改变的倍数(输出的x轴) #step可以改变看下结果,其实是一次变量数
result <- rfcv(data1, data$zq101, cv.fold=5,scale="log", step=0.99)
# 绘制错误率曲线,观察错误率与使用Markers数量的变化
with(result, plot(n.var, error.cv, log="x", type="o", lwd=2))
result$error.cv
##使用replicate多次交叉验证??replicate
result <- replicate(10, rfcv(data1, data$zq101, cv.fold=5,scale="log", step=0.99),
simplify=FALSE)
error.cv <- sapply(result, "[[", "error.cv")
matplot(result[[1]]$n.var, cbind(rowMeans(error.cv), error.cv), type="l",
lwd=c(2, rep(1, ncol(error.cv))), col=1, lty=1, log="x",
xlab="Number of variables", ylab="CV Error")
#显示误差行均值
row_mean = apply(error.cv,1,mean)
min(row_mean)
提取绘制折线图
a=data.frame(result[[1]][["error.cv"]])
b=data.frame(result[[2]][["error.cv"]])
c=data.frame(result[[3]][["error.cv"]])
d=data.frame(result[[4]][["error.cv"]])
e=data.frame(result[[5]][["error.cv"]])
f=data.frame(result[[6]][["error.cv"]])
g=data.frame(result[[7]][["error.cv"]])
h=data.frame(result[[8]][["error.cv"]])
i=data.frame(result[[9]][["error.cv"]])
j=data.frame(result[[10]][["error.cv"]])
#合并并删除
error_cbing=cbind(a,b,c,d,e,f,g,h,i,j)
rm(a,b,c,d,e,f,g,h,i,j)
#均数+标准差
row_mean = apply(error_cbing,1,mean)
row_mean2=data.frame(row_mean)
row_sd= apply(error_cbing,1,sd)
row_sd=data.frame(row_sd)
row_mean_sd=cbind(row_mean2,row_sd)
#改下名字
names(row_mean_sd)[1]="mean"
names(row_mean_sd)[2]="sd"
xa=rownames(row_mean_sd)
xxa=data.frame(xa)
row_mean_sd2=cbind(xxa,row_mean_sd)
#error_sum$xa = factor(error_sum$xa,ordered=TRUE)
#str(error_sum)
#先把数据导出,手动变成因子化
#删掉一部分折线点 #xmin=lowSD, xmax=highSD
row_mean_sd2$lowSD=row_mean_sd2$mean-row_mean_sd2$sd
row_mean_sd2$highSD=row_mean_sd2$mean+row_mean_sd2$sd
write.table(row_mean_sd2,"折线图.csv",sep=",",row.names=TRUE,col.names=TRUE)
#数据可视化,散点图 分组情况
MDSplot(train_randomforest,train_data$zq101,palette = rep((2:8),2),cex=0.5)
#然后看一下样本之间的距离
#看做每个样本映射到2维空间中的坐标,每一维空间是一个分类特征,
#但是不是最原始的4个特征,而是由4个特征衍生得到的新的分类特征,
#根据这个坐标,可以画一张散点图,得到每个样本基于两个分类变量的分组情况
data.mds <- cmdscale(1 -train_data$proximity, eig=TRUE)
plot(data.mds$points, col = rep(c("red", "blue", "green"), each = 50))
#一些想法 或原理学习
#random forest结果是有随机性的,因为每次训练单个数都是通过Bootstrap随机取样
#所以每次结果不同是正常的。
#每次运行结果都是随机初始值的
#所以你在运行前加一个代码:set.seed(100)括号里面的数字是可以自己设定的,
#相当于固定下来那个随机值,每次运行都设定相同的值结果就会一样了
#OOB estimate of error rate 表明了分类器的错误率为4%
Gini指数绘图(后续提供)
误差折线图 (后续提供)