# 清空当前环境中的所有对象
rm (list = ls ())
# 设置工作目录
setwd("C:\\Users\\Administrator\\Desktop\\随机森林4")
library(randomForest) #随机森林
library(tidyverse) #数据分析和可视化
library(skimr) #生成数据摘要统计分析
library(DataExplorer) #探索性数据分析
library(caret) #分类和回归模型的函数
library(pROC) #生成ROC曲线和计算AUC
library(caTools) #数据分割和抽样
#加载数据,指定第一行包含列名(变量名)
otu <- read.table("otutable.txt", header = TRUE, sep = "\t")
#因变量分布情况
table(otu$gene)
# 创建训练集和测试集的索引
split_index <- sample.split(otu$gene, SplitRatio = 0.8)
# 根据索引划分数据
train_data <- subset(otu, split_index == TRUE)
test_data <- subset(otu, split_index == FALSE)
#拆分后因变量分布
table(train_data$gene)
table(test_data$gene)
#因变量自变量构建公式
colnames(otu) #获取列名
form_cls <- as.formula(
paste0(
"gene ~", #构建分类模型的公式
paste0(colnames(train_data)[2:554],collapse = "+")
)
)
form_cls
#构建模型
set.seed(1)
# 将 gene 列转换为因子(因为这是一个分类问题)
train_data$gene <- factor(train_data$gene)
fit_rf_cls <- randomForest(
form_cls,
data = train_data,
ntree = 500,
mtry = 23,
importance = T #是否计算变量的重要性
)
#模型概况
fit_rf_cls
#绘制 nreww 参数与误差之间的关系图
plot(fit_rf_cls, main = "ERROR & TREES")
# 添加图例
legend("top",
legend = colnames(fit_rf_cls$err.rate),
lty = 1:3,
col = 1:3,
horiz = T)
#获取变量重要性
importance(fit_rf_cls)
# 绘制变量重要性图(类型为默认值)
varImpPlot(fit_rf_cls,main = "varImpPlot")
# 绘制变量重要性图(类型为1)
varImpPlot(fit_rf_cls,main = "varImpPlot",type = 1)
# 绘制变量重要性图(类型为2)
varImpPlot(fit_rf_cls,main = "varImpPlot",type = 2)
#偏相关图
partialPlot(x=fit_rf_cls, #指定使用的模型
pred.data = train_data, #预测数据集
x.var = Ramlibacter, #要绘制偏相关图的自变量
which.class = "B73", #指定类别
ylab = "B73") #指定 y 轴标签
# 计算变量 Dyadobacter 在类别 B73 中的分布比例
prop.table(table(train_data$Ramlibacter,train_data$gene),margin = 1)
#预测
#训练集预训练概率,返回概率而不是类别
trainpredprob <- predict(fit_rf_cls, newdata = train_data , type = "prob")
# 计算 ROC 曲线
trainroc <- roc(response = train_data$gene,
predictor = trainpredprob[, 2])
#绘制训练集ROC曲线
plot(trainroc,
print.auc = TRUE, #打印 AUC(Area Under the Curve)值
auc.polygon = TRUE, #在曲线下方填充多边形,用于突出 AUC 区域
grid = T, #显示网格线
max.auc.polygon = T, #在最大 AUC 区域填充多边形
auc.polygon.col = "skyblue", #指定填充多边形的颜色
print.thres = T, #在图中标注阈值
legacy.axes = T, #使用旧版坐标轴
bty = "l" #指定绘图的边界类型
)
#约登法则,计算最佳 Youden Index 时的分类阈值
bastp <- trainroc$thresholds[
which.max(trainroc$sensitivities + trainroc$specificities - 1)
]#找到具有最大 Youden Index 的分类阈值的索引
bastp
#训练集预测分类
trainpredlab <- as.factor(
ifelse(trainpredprob[, 2] > bastp, "Mo17", "B73")
)
#训练集混淆矩阵
confusionMatrix(data = trainpredlab, #预测类别
reference = train_data$gene, #实际类别
positive = "Mo17", # 正类别标签
mode = "everything" # 显示所有评估指标
)
#测试集预测概率
testpredprob <- predict(fit_rf_cls, newdata = test_data, type = "prob")
#测试集预测分类
testpredlab <- as.factor(
ifelse(testpredprob[, 2] > bastp, "Mo17","B73")
)
# 将 test_data$gene 转换为因子
test_data$gene <- factor(test_data$gene)
#测试集混淆矩阵
confusionMatrix(data = testpredlab, #预测类别
reference = test_data$gene, #实际类别
positive = "Mo17", # 正类别标签
mode = "everything" # 显示所有评估指标
)
#测试集ROC
testroc <- roc(response = test_data$gene, #实际类别
predictor = testpredprob[, 2]) #预测概率
#训练集、测试集ROC曲线叠加
plot(trainroc,
print.auc = TRUE,
grid = c(0.1,0.2),
auc.polygon = F,
max.auc.polygon = T,
main = "随机森林--ROC",
grid.col=c("green","red"))
plot(testroc,
print.auc = TRUE,
print.auc.y = 0.4,
add = T,
col = "red")
legend("bottomright",
legend = c("train_data","test_data"),
col = c(par("fg"),"red"),
lwd = 2,
cex = 0.9)
##############################
# 生成混淆矩阵
cm <- confusionMatrix(data = testpredlab, reference = test_data$gene, positive = "Mo17", mode = "everything")
# 可视化混淆矩阵
fourfoldplot(cm$table, color = c("#CC6666", "#99CC99"), conf.level = 0, margin = 1, main = "Confusion Matrix")
标签:Mo17,library,随机,测试版,gene,data,森林 From: https://www.cnblogs.com/wzbzk/p/17912236.html