首页 > 其他分享 >R : 随机森林(测试版1)

R : 随机森林(测试版1)

时间:2023-12-18 21:03:05浏览次数:23  
标签:Mo17 library 随机 测试版 gene data 森林

# 清空当前环境中的所有对象
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

相关文章

  • R :随机森林(测试版2)
    #清空当前环境中的所有对象rm(list=ls())#设置工作目录setwd("C:\\Users\\Administrator\\Desktop\\随机森林4")library(randomForest)library(tidyverse)library(pROC)library(caret)#加载数据,指定第一行包含列名(变量名)otu<-read.table("otutable.txt",hea......
  • R :随机森林(测试版3)
    #清空当前环境中的所有对象rm(list=ls())#设置工作目录setwd("C:\\Users\\Administrator\\Desktop\\随机森林4")library(randomForest)library(tidyverse)library(pROC)library(caret)#加载数据,指定第一行包含列名(变量名)otu<-read.table("otutable.txt",hea......
  • 新增“失窃设备保护”:苹果发布iOS 17.3测试版本
    12月13日消息,在昨天发布iOS17.2正式版之后,今天苹果向开发者推送了iOS17.3Beta版本更新,新增了“失窃设备保护”功能。iOS17.3首个Beta版本更新引入了“设备被盗保护”(StolenDeviceProtection)功能,可以在小偷或其他攻击者知道用户的私人密码时保护用户信息。当此功能开启后,如......
  • [LeetCode138-链表-中等] 复制带有随机指针的链表
    这道题是这样的,就是说有一个链表LindedNode,通常我们链表包含2个属性,一个是它的值val,另一个是它指向的下一个结点nextNode,但是这个题目中的链表还有一个属性,就是它还有个随机指针,这个随机指针可能指向链表中的任意结点(包括链表的结尾null结点,或者是自己)也就是说这个链表Lin......
  • 随机选择算法
    在一个无序数组中求第k大或者第k小的问题,要求时间复杂度是O(N),那么对于这两个问题只要解决一个另一个就解决了。因为求第一大可以转换成求第n小。那么对于一个有100个元素的数组来说,我们要求第57小的数,那么它就是在求这个数组排好序之后下标在56的值,因为如果数组的元素没有重复......
  • 随机快速排序
    快速排序是一个经典的算法,它是基于比较排序中最快的算法之一,时间复杂度是O(N*logN)的,时间复杂度证明可以用master公式证明。但经典的快速排序会存在最坏的情况,会使得快速排序的时间复杂度退化到O(N2),这样快速排序也就失去了意义。因此我们为了避免出现最坏的情况,来引入随机一行......
  • 可视化森林:探索自然资源的奥秘
    随着全球经济的发展和人口的增加,自然资源的利用和保护变得越来越重要。森林作为地球上最重要的生态系统之一,不仅是地球生态系统的重要组成部分,还承担着调节气候、维护生态平衡等重要的生态功能。但是,随着人类活动的增加,森林面积逐渐减少,生态系统受到了破坏,保护森林成为了全球的共......
  • shell补-特殊玩法-生成随机字符串
    shell补-特殊玩法-生成随机字符串方法1:md5sum方法2:tr+/dev/urandom方法3:内置变量RANDOM;#方法1[root@localhostser]#opensslrand-base64108/54arQpCmQ12Q==[root@localhostser]##方法2必备[root@localhostser]#date+%N|md5sum###给日期加密;可以写其......
  • 记录--js小练习(弹幕、 电梯导航、 倒计时、 随机点名、 购物放大镜)
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助DOM小练习弹幕电梯导航倒计时随机点名购物放大镜1.弹幕效果预览功能:输入弹幕内容,按下回车显示一条弹幕(弹幕颜色、字体随机生成)思路:设置按钮抬起事件,在事件中判断如果按下的是回车键则将输入框中替换掉......
  • 逛森林
    这是一道模板题首先,对任意时刻,\(u\)->\(v\)这条路径上的点都是不会变动的(就是说,比如,如果某时刻从\(1\)到\(4\)的路径为\(1\)->\(3\)->\(4\),那么对之后的任意时刻,这条路径都是这个,既不会改变顺序,也不会新增节点,更不会删除已有节点),所以我们可以把所有有效的操作一存起来最后再建边......