【R语言机器学习】十分钟读懂Logistic回归、决策树、随机森林、SVM、神经网络、XGBoost、lightGBM七种模型

文摘   2024-12-17 09:05   山东  


机器学习

机器学习是人工智能的一个重要分支,近年来在数据分析、图像识别、自然语言处理等领域发挥的作用越来越重要。机器学习的基本概念围绕着如何让计算机利用数据来进行学习和预测。而R语言,作为一种统计分析和图形表示的强大工具,因其丰富的包和灵活的数据处理能力,在机器学习领域中占有一席之地。今天我们开始R语言机器学习的第一篇,数据准备与包的批量安装。



机器学习的定义与工作原理

机器学习是一门研究如何使计算机系统从数据中学习和改进性能的学科。它通过训练模型来识别模式、预测趋势和做出决策从而实现对数据的自动处理和分析。

机器学习算法通过对大量数据进行学习,提取出有用的特征并建立模型来预测新数据。这些模型可以不断优化,以适应不同类型的数据和任务。常见的机器学习算法包括KNN、决策树、随机森林、贝叶斯等。




我们先打开Rstudio,对于单个包的安装与加载想必大家都已经很熟悉:

rm(list=ls()) #移除所有变量数据

install.packages() #安装包

library() #加载包

然后读取和写入Excel的包需要用到readxl和writexl:

#读取Excel数据

install.packages("readxl")

library(readxl) #加载包

data <- read_excel("路径/示例数据.xlsx")

#写入Excel数据导出

install.packages("writexl")

library(writexl) #加载包

write_xlsx(data.all, "路径/总表.xlsx")

我们今天用到的示例数据是一个1000个个案的

数据库,我们用readxl读取进Rstudio进行处理。

















我们可以

#定义要加载机器学习所需要的包列表,检查每个包是否已经安装,如果没有安装,则进行安装并加载

packages<-c("readxl","ggplot2","caret","lattice","gmodels",

    "glmnet","Matrix","pROC","Hmisc","rms",

    "tidyverse","Boruta","car","carData",

    "rmda","dplyr","rpart","rattle","tibble","bitops",

    "probably","tidymodels","fastshap",

    "shapviz","e1071")

for(pkg in packages) {

  if (!require(pkg, quietly = TRUE)) {

    install.packages(pkg, dependencies = TRUE)

    library(pkg, character.only = TRUE)

  }

}

# 使用library()函数一次性加载多个包

lapply(packages,library,character.only = TRUE)







或者可以

#直接定义并批量安装包

packages<-c("readxl","ggplot2","caret",

  "lattice","gmodels","glmnet","Matrix","pROC",

  "Hmisc","rms","tidyverse","Boruta","car",

  "carData","rmda","dplyr","rpart","rattle","tibble",

  "bitops","probably","tidymodels","fastshap",

  "shapviz","e1071")

install.packages(c("readxl","ggplot2","caret",

  "lattice","gmodels","glmnet","Matrix","pROC",

  "Hmisc","rms","tidyverse","Boruta","car","carData",

  "rmda","dplyr","rpart","rattle","tibble","bitops",          "probably","tidymodels","fastshap",

  "shapviz","e1071"))

install.packages(packages)

# 使用library()函数一次性加载多个包

lapply(packages,library,character.only = TRUE)







进一步我们可以进行简单分析:

#独立样本t检验

t.test(data$指标1 ~ 结局, data = data, var.equal = TRUE)

t.test(data$指标2 ~ 结局, data = data, var.equal = TRUE)

t.test(data$指标3 ~ 结局, data = data, var.equal = TRUE)













#卡方检验

CrossTable(data$结局,data$指标8,expected = T,chisq = T,fisher = T, mcnemar = T, format = "SPSS")













#logistic回归

data$Group<-as.factor(data$结局)

model1 <- glm(Group ~ 指标1, data = data, family = "binomial")

summary(model1)

model2 <- glm(Group ~ 指标1+指标2, data = data, family = "binomial")

summary(model2)

model3 <- glm(Group ~ 指标1+指标2+指标3, data = data, family = "binomial")

summary(model3)













#ROC曲线

roc1 <- roc(data$结局,data$指标1);roc1  

roc2 <- roc(data$结局,data$指标2);roc2 

roc3 <- roc(data$结局,data$指标3);roc3

plot(roc1,

     max.auc.polygon=FALSE,  # 填充整个图像

     smooth=F, # 绘制不平滑曲线

     main="Comparison of ROC curves", # 添加标题

     col="red",  # 曲线颜色

     legacy.axes=TRUE)   # 使横轴从0到1,表示为1-特异度

plot.roc(roc2,

         add=T,  # 增加曲线

         col="orange", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线

plot.roc(roc3,

         add=T,  # 增加曲线

         col="yellow", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线











#列线图

dd<-datadist(data) 

options(datadist="dd")

data$Group<-as.factor(data$结局)

f_lrm<-lrm(Group~指标1+指标2+指标3+指标4+指标5+指标6+指标7+指标8,data=data)

summary(f_lrm)

par(mgp=c(1.6,0.6,0),mar=c(5,5,3,1))

nomogram <- nomogram(f_lrm,fun=function(x)1/(1+exp(-x)),

                     fun.at=c(0.01,0.05,0.2,0.5,0.8,0.95,1),

                     funlabel ="Prob of 结局", 

                     conf.int = F,

                     abbrev = F )

plot(nomogram)











训练集和测试集

训练集和测试集是深度学习技术中经常使用的一种数据划分方式。它可以将数据自动划分为训练集和测试集,用于模型开发的评估。

训练集是为训练模型而准备的一组数据,它通常是人类标记过的,表明它们拥有特定方面的属性。通常情况下,为了训练有效的模型,训练集的采样大小最好是足够大的,而且应该有足够的多样性,可以代表它们的数据集中的所有可能的情况

测试集是一组样本,用于测试训练好的模型,通过测试集检验训练好的模型,从而测试模型的正确率和准确性。它本质上是一组未知的数据样本,用于测试模型性能的时候,而不受训练集采样的偏向,可以更可靠的评估模型的性能。

那么怎么划分测试集与训练集呢?






#分层抽样划分训练集和测试集

set.seed(123)

train <- sample(1:nrow(data),nrow(data)*7/10) #取70%做训练集、其余30%为测试集

#数据读取拆分与组合

Train <- data[train,] #定义训练集数据

Test <- data[-train,] #定义测试集数据

All <- rbind(Train, Test)  #将拆分数据合并










#写入Excel数据导出

install.packages("writexl")

library(writexl) #加载包

write_xlsx(Train, "C:/Users/L/Desktop/Train.xlsx")

write_xlsx(Test, "C:/Users/L/Desktop/Test.xlsx")

write_xlsx(All, "C:/Users/L/Desktop/All.xlsx")







Logistic Regression

逻辑回归(Logistic Regression)是一种广泛使用的统计方法,用于预测一个二分类结果发生的概率。

Logistic Regression是一种广泛使用的分类算法,它的主要思想是将输入变量的线性组合映射到0到1之间的概率,用于预测二元输出变量的概率。

逻辑回归模型,是一种广义的线性回归分析模型。日常工作生活中我们会遇到很多的1,0分类问题,比如考试通过还是不通过、是否患某种疾病等等这样的问题都可以使用逻辑回归来解决。

尽管它被称为“回归”,但它实际上是用于分类问题的。逻辑回归的核心是使用逻辑函数(也称为sigmoid函数)来模拟因变量与自变量之间的关系。





我们还是使用上一期的示例数据










我们先用最常见的SPSS进行logistic回归演示,先用SPSS打开数据进行预览:










依次点击“分析”-“回归”-“二元logistic回归”










将结局变量选入“因变量”数据框,将需要分析的自变量选入“协变量”数据框,点击“保存”,预测值点击“概率”。










可以在输出中看到模型系数的omnibus检验结果、模型摘要、变量分类表、以及方程中的变量。

在数据视图也可以看到已经输出的预测概率值。











我们对输出的预测概率值进行下一步分析,继续在数据编辑器点击“分析”-“分类”-“ROC曲线”,状态变量选入“结局”,检验变量选入“预测概率”,显示ROC曲线、带对角参考线、标准误差和置信区间,可以选择ROC曲线的坐标点计算敏感度、特异度、最佳截断值。















我们继续在数据编辑器点击“分析”-“分类”-“ROC分析”,检验变量仍选入预测变量,状态变量选入结局,状态变量值为1,点击“显示”,图选择ROC曲线、精确率召回率曲线、总体模型质量等。然后可以看到ROC分析的结果输出














然后我们用Rstudio打开示例数据,批量安装并加载机器学习所需要的一系列包。












使用glm()函数进行logistic回归的运算,以及选择输出P值、coef值、95%置信区间的下限与上限。

logit.model <- glm(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data=Train, family=binomial(link="logit))

logit.result<- as.data.frame(summary(logit.model)$coefficients[, c(1, 4)])

logit.result<- cbind(logit.result, confint(logit.model))

colnames(logit.result) <- c(Coef", "p", "CI_lower", "CI_upper")

logit.result

可以看到输出结果如下:









模型的检验我们可以继续用ROC曲线:

logit.pred.prob <- predict(logit.model, newdata=Test, type="response")

par(las=1, cex.axis=.8)

logit.roc <- roc(

  y ~ pred,

  data=data.frame(y=Test$结局, pred=logit.pred.prob),

  plot=T, ci=T, main="ROC Curve of Logistic Regression",

  print.auc=T, print.auc.cex=.8,

  print.thres=T, print.thres.cex=.8,

  auc.polygon=T, max.auc.polygon=T, grid=T)










绘制列线图:

library(rms)

library(Hmisc)

Train$Group<-as.factor(Train$结局)

Test$Group<-as.factor(Test$结局)

ddist <- datadist(Train); options(datadist='ddist')

f <- lrm(Group ~ 指标1+指标2+指标3+指标4+指标5+指标6, data=Train)

par(family="Prob of 结局")

plot(nomogram(f))










亦可以对logistic回归模型绘制DCA曲线:

#DCA参数运算

model1 <- decision_curve(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6, 

                         family=binomial(link='logit'),

                         data = Train,

                         thresholds = seq(0, .8, by = .05),

                         bootstraps = 10) 

#绘制DCA曲线

plot_decision_curve(model1,

                    curve.names = "Model1",

                    col = c("red"),

                    confidence.intervals=T #不显示置信区间

)








决策树(Decision Tree)模型

在复杂的决策情况中,往往需要多层次或多阶段的决策。当一个阶段决策完成后,可能有m种新的不同自然状态发生;每种自然状态下,都有m个新的策略可选择,选择后产生不同的结果并再次面临新的自然状态,继续产生一系列的决策过程,这种决策被称为序列决策或多级决策。

此时,如果继续遵循上述的决策准则或采用效益矩阵分析问题,就容易使相应的表格关系十分复杂。决策树是一种能帮助决策者进行序列决策分析的有效工具,其方法是将问题中有关策略、自然状态、概率及收益值等通过线条和图形用类似于树状的形式表示出来。

决策树模型就是由决策点、策略点(事件点)及结果构成的树形图,一般应用于序列决策中,通常以最大收益期望值或最低期望成本作为决策准则,通过图解方式求解在不同条件下各类方案的效益值,然后通过比较,做出决策。





决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。

决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

分类树(决策树)是一种十分常用的分类方法。它是一种监督学习,所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。这样的机器学习就被称之为监督学习。

我们以示例数据为例,演示一下在SPSS和R语言中决策树模型的分析过程。













在SPSS中进行数据决策树分析主要包括以下几个步骤:导入数据、选择决策树模型、设置参数、运行模型、解释结果。导入数据是第一步,需要确保数据格式正确且无缺失值。选择决策树模型时,SPSS提供了多种算法如CART和CHAID。设置参数阶段需要调整模型参数以优化结果。运行模型后,生成的决策树图和相关统计信息可以帮助解释结果。以下是详细的操作步骤和注意事项。

我们先用SPSS打开示例数据:










我们依次点击“分析”-“分类”-“决策树”,点击“确定”。










在模型参数选择中,因变量选入“结局”,自变量选入各自变量,生长法可选择“CHAID”、“穷举CHAID”、“CRT”、"QUEST"等。










在决策树输出中选择显示的方向、节点内容、标度等。在统计-模型中选择摘要、风险、分类表、成本、先验概率、得分和利润值等,节点性能摘要、目标分类等。












保存变量:终端节点数、预测值、预测概率,也可以根据预测概率绘制ROC曲线,进行ROC分析。然后得到决策树相关结果。














在R语言中,需要使用rpart包里的rpart()函数进行分析,我们先用Rstudio打开示例数据,并安装所需要的包:

install.packages(rpart) #安装包  

install.packages("rattle") #安装包  

install.packages("tibble") #安装包  

install.packages("bitops") #安装包

library(rpart)

library(rattle)

library(tibble)

library(bitops)

library(pROC)










使用rpart()函数进行决策树模型拟合并绘图:

dt.model1 <- rpart(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6+指标7+指标8,

                  data=Train, method="class")

par(las=1, cex=1, family="Songti SC")

fancyRpartPlot(dt.model1, caption=NULL)










使用rpart()函数进行决策树模型拟合并绘图:

dt.model2 <- rpart(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,

                  data=Train, method="class")

par(las=1, cex=1, family="Songti SC")

fancyRpartPlot(dt.model2, caption=NULL)










使用rpart()函数进行决策树模型拟合并绘图:

dt.model3 <- rpart(结局 ~ 指标1+指标2+指标3+指标4,

                   data=Train, method="class")

par(las=1, cex=1, family="Songti SC")

fancyRpartPlot(dt.model3, caption=NULL)










对决策树模型进行评价,可用ROC曲线、混淆矩阵、DCA曲线等。

dt.pred.prob <- predict(dt.model, newdata=Test)[,2]

par(las=1, cex.axis=.8)

dt.roc <- roc(

  y ~ pred,

  data=data.frame(y=Test$结局, pred=dt.pred.prob),

  plot=T, ci=T, main="ROC Curve of Decision Tree",

  print.auc=T, print.auc.cex=.8,

  print.thres=T, print.thres.cex=.8,

  auc.polygon=T, max.auc.polygon=T, grid=T)









‌随机森林模型

‌随机森林模型‌是一种集成学习方法,主要用于分类和回归任务。它由多个决策树组成,通过集成这些决策树的预测结果来提高模型的准确性和稳定性‌。



随机森林的工作原理

随机森林使用名为“bagging”的技术,通过数据集和特征的随机自助抽样样本并行构建完整的决策树。每棵树在称为自助聚集的过程中随机对训练数据子集进行抽样,模型适合这些较小的数据集,并汇总预测结果。通过有放回抽样,可以重复使用同一数据的几个实例,结果就是,这些树不仅基于不同的数据集进行训练,而且还使用不同的特征做出决策‌。




随机森林的特点

随机性‌:随机森林通过数据随机和特征随机来减少模型的偏差和过拟合问题。数据随机通过有放回抽样构成不同的样本数据集,特征随机则从所有特征中随机选择一部分特征用于每棵树的训练‌

泛化能力‌:由于每棵树都是基于不同的数据集和特征训练的,整体模型具有较好的泛化能力,能够适应不同的数据集‌。

‌运算速度快‌:随机森林在处理大数据时表现优异,运算速度较快‌。

总之,随机森林模型通过集成多个决策树的预测结果,提高了模型的准确性和稳定性,适用于多种机器学习任务。











我们仍以示例数据为例:










首先使用Rstudio打开示例数据:










首先使用caret包演示:

library(caret)

set.seed(1234)

rf.model <- train(

  结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,

  data=Train, method="rf",

  preProcess=c(center", "scale),

  trControl=trainControl(method="cv", number=10, classProbs=T))

print(rf.model)

plot(rf.model)












也可以使用randomForest包

library(randomForest)

modelFit <- randomForest(结局 ~ 指标1+指标2+指标3+指标4+指标5, data = Train, keep.forest = TRUE, 

                         predict.all = TRUE, type = "prob")

print(modelFit)

plot(modelFit)












使用Train数据得到的模型预测test数据(caret包):
rf.pred.prob <- predict(rf.model, newdata=Test)

并绘制ROC曲线检验效果

par(las=1, cex.axis=.8)

rf.roc <- roc(

  y ~ pred,

  data=data.frame(y=Test$结局, pred=rf.pred.prob),

  plot=T, ci=T, main="ROC Curve of Random Forest",

  print.auc=T, print.auc.cex=.8,

  print.thres=T, print.thres.cex=.8,

  auc.polygon=T, max.auc.polygon=T, grid=T)










使用Train数据得到的模型预测test数据(randomForest包):

rf.pred.prob <- predict(modelFit, newdata=Test)

并绘制ROC曲线检验效果:

par(las=1, cex.axis=.8)

rf.roc <- roc(

  y ~ pred,

  data=data.frame(y=Test$结局, pred=rf.pred.prob),

  plot=T, ci=T, main="ROC Curve of Random Forest",

  print.auc=T, print.auc.cex=.8,

  print.thres=T, print.thres.cex=.8,

  auc.polygon=T, max.auc.polygon=T, grid=T)










对随机森林进行可视化

library(fastshap)

library(shapviz)

pfun <- function(model, newdata){

  predict(model, newdata=newdata)

}

set.seed(1234)

rf.shap <- explain(rf.model, X=Test, pred_wrapper=pfun, shap_only=F,

                   feature_names=c("指标1", "指标2", "指标3", "指标4", "指标5", "指标6"))

sv_importance(shapviz(rf.shap), kind="beeswarm") +

  theme_bw() +

  theme(axis.text.y=element_text(family="Songti SC"),

        panel.grid=element_blank())







支持向量机(‌SVM)

支持向量机(‌SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。SVM通过‌铰链损失函数计算经验风险,并在求解系统中加入了‌正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器。SVM可以支持线性分类和非线性分类,通过核方法将数据映射到高维空间来实现非线性分类。







模型原理

SVM的基本原理是通过找到一个超平面,将不同类别的数据分开。对于线性可分的数据,SVM寻找一个最优的超平面,使得不同类别的数据点距离这个超平面的距离最大化。对于非线性数据,SVM通过核函数将数据映射到高维空间,使其线性可分,然后再寻找最优超平面。




核函数

SVM通过核函数实现非线性分类。常用的核函数包括:

‌线性核函数‌:适用于线性可分的数据,计算速度快。

‌‌高斯径向基核函数(RBF)‌:适用于各种类型的数据,应用广泛。

‌‌多项式核函数‌:适用于需要高阶映射的情况,但参数多,计算复杂。

‌‌Sigmoid核函数‌:实现一种多层神经网络的效果。

选择核函数时,可以通过交叉验证或网格搜索等方法来选择效果最好的核函数。






我们还是以Excel里示例数据为例,先用Rstudio打开数据:












安装并加载所需要的包:

install.packages(e1071) #安装包 

install.packages("kernlab") #安装包 

install.packages("visreg") #安装包 

install.packages("GGally") #安装包 

library(e1071) 

library(kernlab)

library(visreg) #模型可视化

library(GGally) 

library(RColorBrewer)





#绘制所有数据概览图

GGally::ggpairs(Train)










# 设置随机种子以保证结果可复现

set.seed(1234)

# 训练SVM模型

svm.model <- train(

  结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6, 

  data = Train,

  method = "svmRadial",  # 使用径向基核函数

  preProcess = c("center", "scale"),  # 数据标准化

  trControl = trainControl(method = "cv", number = 10, classProbs = TRUE)  # 10折交叉验证

)

print(svm.model)

plot(svm.model)












# 使用测试集进行预测

svm.pred.prob <- predict(svm.model, newdata = Test)

summary(svm.pred.prob)

print(svm.pred.prob)










set.seed(1234) # radial核SVM分类器

seedsvm <- svm(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data = Train,kernel ="radial")

summary(seedsvm)

plot(seedsvm)

## 在二维空间可视化SVM分类器的分类面

visreg(seedsvm, "指标1", gg = TRUE, ylab = "指标1")#单个变量

par(mfrow = c(2, 3))  ##六个变量一起看

visreg(seedsvm)












set.seed(1234) # radial核SVM分类器

seedsvm2 <- svm(结局 ~ 指标1+指标2+指标3+指标4,data = Train,kernel ="radial")

summary(seedsvm2)

## 在二维空间可视化SVM分类器的分类面

par(mfrow = c(2, 2))  ##四个变量一起看

visreg(seedsvm2)












# 绘制ROC曲线

par(las = 1, cex.axis = .8)

par(mfrow = c(1, 1))

svm.roc <- roc(Test$结局 ~ svm.pred.prob, plot = TRUE, ci = TRUE, 

               main = "ROC Curve of SVM", 

               print.auc = TRUE, print.auc.cex = .8, 

               print.thres = TRUE, print.thres.cex = .8, 

               auc.polygon = TRUE, max.auc.polygon = TRUE, grid = TRUE)










# 计算Brier得分

brier <- function(data, reference) {

  o <- as.numeric(reference) - 1

  mean((data - o)^2)

}

brier_score <- brier(data = svm.pred.prob, reference = Test$结局)

print(brier_score)






神经网络模型‌

神经网络模型‌是一种模拟人类神经系统的数学模型,广泛应用于人工智能、机器学习和深度学习领域。神经网络由大量的简单处理单元(称为神经元)广泛连接而成,反映了人脑的基本功能特征。神经网络具有自学习、自适应和并行处理的能力,特别适合处理复杂和不精确的信息‌。


神经网络的基本组成

神经网络通常由三个主要部分组成:输入层、隐藏层和输出层。每个神经元通过加权连接与其他神经元相连,每个连接都有一个权重,这些权重在训练过程中通过学习算法进行调整。此外,每个神经元还有一个偏置项,用于避免输出为零的情况‌。

神经网络的基本类型

前馈神经网络‌:信息从输入层向前传播,经过隐藏层,最终到达输出层,没有反馈连接。常见的前馈神经网络包括卷积神经网络(CNN)、全连接神经网络(FCN)和生成对抗网络(GAN)等‌。

‌反馈神经网络‌:神经元不仅可以接收其他神经元的信号,还可以接收自己的反馈信号,具有记忆功能。常见的反馈神经网络包括循环神经网络(RNN)、长短期记忆网络(LSTM)等‌。

神经网络的应用领域

神经网络在多个领域都有广泛应用,包括:

‌系统辨识‌:用于识别系统的动态特性。

‌模式识别‌:如图像和语音识别。

‌智能控制‌:用于自适应控制系统。

‌组合优化‌、金融预测与管理、通信、机器人技术和专家系统等领域‌。






我们仍以Excel示例数据为例,初步展示一下神经网络模型的初步做法,我们先用Rstudio打开示例数据。












‌R语言中的train函数位于caret包中‌。caret包是一个用于构建、训练和评估机器学习模型的R包,提供了丰富的功能来帮助用户进行模型训练和参数调优。train函数是caret包的核心功能之一,用于训练模型,支持多种算法和模型类型‌。我们先用train函数拟合神经网络模型。

set.seed(1234)

nn.model <- train(

  结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data = Train,

  method="nnet",

  preProcess=c(center", "scale),

  trControl=trainControl(method="cv", number=10, classProbs=T),

  tuneGrid=expand.grid(size = c(1, 5, 10), decay = c(0, 0.1, 0.01)))

print(nn.model)

plot(nn.model)












neuralnet包

#加载neuralnet包

install.packages("neuralnet") #安装包 

# 加载Rattle图形库

install.packages("RGtk2")

install.packages("rattle")

library(neuralnet)

library(rattle)

rattle_gui()

#拟合并可视化神经网络模型

nnfit <- neuralnet(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data = Train, hidden = 10, threshold = 0.01)

print(nnfit)

plot(nnfit)

summary(nnfit)












#安装并加载nnet包

install.packages("nnet")

library(nnet)

#使用nnet包拟合神经网络模型

nnmodel <- nnet(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data = Train,

                size = 10, decay = 0.01, maxit = 100)

# 输出模型摘要

summary(nnmodel)

plot(nnmodel)












#使用神经网络模型预测测试数据并绘制ROC曲线

nn.pred.prob <- predict(nn.model, newdata=Test)

par(las=1, cex.axis=.8)

nn.roc <- roc(

  y ~ pred,

  data=data.frame(y=Test$结局, pred=nn.pred.prob),

  plot=T, ci=T, main="ROC Curve of Neural Network",

  print.auc=T, print.auc.cex=.8,

  print.thres=T, print.thres.cex=.8,

  auc.polygon=T, max.auc.polygon=T, grid=T)

#计算brier评分

brier(data=nn.pred.prob, reference=Test$结局)










XGBoost模型

XGBoost是一种强大的机器学习算法,它在许多领域都取得了广泛的应用,包括临床医学。本文将介绍XGBoost模型的原理和概念,并通过一些具体的临床医学实例来展示其在这个领域的应用。


原理和概念

XGBoost全称为eXtreme Gradient Boosting,是一种基于梯度提升决策树(Gradient Boosting Decision Tree)的集成学习算法。它在GBDT的基础上进行了改进,引入了正则化项和二阶导数信息,提高了模型的性能和泛化能力。

XGBoost模型的核心思想是将多个弱分类器(决策树)组合成一个强分类器。每个决策树都在前一棵树的残差基础上进行训练,通过不断迭代优化损失函数来逐步减小残差。同时,模型通过控制树的复杂度和正则化项来减少过拟合风险。




XGBoost在临床医学中的应用

XGBoost算法在临床医学中有着广泛的应用:

疾病诊断:XGBoost模型可以使用患者的临床特征和医学检查结果来预测某种疾病的发生概率。例如,可以利用患者的年龄、性别、血液指标等特征,建立一个XGBoost模型来预测心脏病的风险。

药物响应预测:XGBoost可以通过分析患者的基因信息以及其他关键特征,来预测某种药物对患者的治疗效果。这可以帮助医生选择最适合患者的治疗方案,提高治疗成功率。

生存分析:在肿瘤学中,XGBoost模型可以通过分析患者的临床特征和病理学信息,来预测患者的生存期或复发风险。这有助于医生为患者制定个性化的治疗方案。

医疗资源优化:XGBoost模型可以通过分析大量的临床数据,预测患者的住院时间、手术风险等信息,帮助医疗机构进行资源分配和管理。 






我们今天简要介绍一下使用xgboost包和tidymodels包进行XGBoost模型相关分析及可视化的方法。我们仍以Excel示例数据为例,先用Rstudio打开示例数据。












#安装并加载包

install.packages(DALEXtra)

install.packages("auditor")

install.packages("vivo")

library(xgboost)

library(tidymodels)

将结局变量转换为因子,使用as.factor()函数

Train$结局<-as.factor(Train$结局)





#XGBoost模型拟合

xgb_fit <- boost_tree() %>% 

  set_engine("xgboost") %>% 

  set_mode("classification") %>% 

  fit(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data=Train)

summary(xgb_fit)

print(xgb_fit)










#构建解释器

library(DALEXtra)

xgb_exp <- explain_tidymodels(xgb_fit,

                              data = Train[,-1],

                              y=Train$结局,

                              label = "xgboost")

summary(xgb_exp)

print(xgb_exp)











#模型解释Breakdown

xgb_bd <- predict_parts(xgb_exp,

                        new_observation=Train[2,])

plot(xgb_bd)











#模型解释SHAP值

xgb_shap <- predict_parts(xgb_exp,

                          type = "shap",

                          new_observation=Train[2,])


plot(xgb_shap,show_boxplots=FALSE)










#模型解释绘制ROC曲线

library(auditor)

plot(model_evaluation(xgb_exp))











#模型解释部分依赖图(PDP)

xgb_profiles <- model_profile(xgb_exp)

plot(xgb_profiles)










#模型解释变量重要性

library(vivo)

xgb_vp <- global_variable_importance(xgb_profiles)

plot(xgb_vp)










#模型解释CP图

xgb_cp <- predict_profile(xgb_exp,

                          new_observation = Train[2,])

plot(xgb_cp)







LightGBM模型

LightGBM(Light Gradient Boosting Machine)是一种基于‌决策树的梯度提升框架,主要用于分类、回归和排序等多种机器学习任务。其核心原理是利用‌基分类器(决策树)进行训练,通过集成学习得到最优模型。LightGBM相比其他模型如‌XGBoost,在处理大规模数据集时具有更高的计算效率和可扩展性。



LightGBM模型的主要优化方法

直方图算法‌:LightGBM使用直方图算法来加速决策树的构建过程。它将连续的特征值离散化为k个整数,形成直方图,从而减少计算复杂度。

单边梯度采样算法(GOSS)‌:GOSS通过采样保留梯度大的样本并随机采样一些梯度小的样本,以减少计算复杂度,同时保持数据分布的准确性。

互斥特征捆绑算法(‌EFB)‌:EFB通过将互斥特征捆绑在一起,减少特征数量,进一步加速训练过程。

并行学习‌:LightGBM支持特征并行和数据并行,通过分散规则和直方图加速训练,减少通信和计算开销。

支持‌类别特征l‌ightGBM可以直接处理类别特征,无需转换为one-hot编码,大大提高了处理速度。

LightGBM模型的应用场景和优势

LightGBM以其高效率和准确性在多个领域得到广泛应用。由于其能够处理大规模数据集,适合于实时预测和大规模在线学习。此外,LightGBM在处理稀疏数据时表现出色,能够有效地减少特征维度,提高训练速度。






LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。

今天我们仍以Excel示例数据为例,简单演示一下LightGBM模型的基础操作。我们先用Rstudio打开示例数据。












#加载包

install.packages(lightgbm)

install.packages("Graphviz")

library(lightgbm)

library(Graphviz)








#准备数据 

Train$结局 <- as.factor(Train$结局)

Train.matrix<-as.matrix(Train[,-ncol(Train)])

Test.matrix<-as.matrix(Test[,-ncol(Test)])

Train.labels<-as.numeric(Train$结局)

lgb.Train<-lgb.Dataset(data=Train.matrix,label=Train.labels-1) #LightGBM需要0和1标签 






#设置LightGBM参数 

params <- list(

  objective="binary",

  num_leaves=31,

  learning_rate=0.1,

  nrounds=1000)

#训练模型

lgb.model<-lgb.train(params=params,data=lgb.Train,

               nrounds=params[['nrounds']],verbose=-1) 

summary(lgb.model)







#预测测试集 

pred <- predict(lgb.model, as.matrix(Test[, -ncol(Test)])) 

head(pred)

pred










#绘制ROC曲线

library(pROC)

roc.curve<-roc(Test$结局,pred)

plot(roc.curve,legacy.axes=TRUE,main="ROC Curve for Clinical Data") 

summary(roc.curve)










#真实值与预测值散点图

library(dplyr)

library(ggplot2)

library(tune)

# 整合预测值和真实值

lgb.res <- bind_cols(truevalue=Test$结局,estimator=pred)

ggplot(lgb.res,mapping=aes(truevalue,estimator))+

  geom_point(alpha=0.3,size=2)+

  geom_abline(intercept=0,slope=1,col="red")+

  labs(x = "observed", y = "predicted") +

  coord_obs_pred()










#模型解释

library(DALEX)

library(DALEXtra)

# 构建模型解释器

exp <- DALEXtra::explain_tidymodels(lgb.model,

                                    Test.matrix,

                                    y=Test.matrix,

                                    label = "LightGBM")

#变量重要性

lgb_mp <- model_parts(exp)          

plot(lgb_mp)










#模型诊断

plot(model_diagnostics(exp))










#waterfall图

library(shapviz)

shap <- shapviz(lgb.model,X_pred=Test.matrix)

# 每个变量对预测的贡献

sv_waterfall(shap,row_id = 1)










#基于SHAP值的变量重要性

sv_importance(shap,kind = "beeswarm")






机器学习

机器学习是人工智能的一个重要分支,近年来在数据分析、图像识别、自然语言处理等领域发挥的作用越来越重要。机器学习的基本概念围绕着如何让计算机利用数据来进行学习和预测。而R语言,作为一种统计分析和图形表示的强大工具,因其丰富的包和灵活的数据处理能力,在机器学习领域中占有一席之地。今天我们开始R语言机器学习的第一篇,数据准备与包的批量安装。


机器学习的定义与工作原理

机器学习是一门研究如何使计算机系统从数据中学习和改进性能的学科。它通过训练模型来识别模式、预测趋势和做出决策从而实现对数据的自动处理和分析。

机器学习算法通过对大量数据进行学习,提取出有用的特征并建立模型来预测新数据。这些模型可以不断优化,以适应不同类型的数据和任务。常见的机器学习算法包括KNN、决策树、随机森林、贝叶斯等。

今天我们分享一下Logistic回归、决策树、随机森林、支持向量机(SVM)、神经网络、XGBoost、lightGBM七种模型预测效果的ROC曲线综合评价方法。


ROC曲线

ROC曲线(Receiver Operating Characteristic Curve)和AUC(Area Under the Curve)是评估二分类模型性能的常用工具。‌

ROC曲线描绘了在不同阈值下真正例率(TPR,也称为召回率)和假正例率(FPR)之间的关系。真正例率定义为真正例数与所有实际正例数的比例,假正例率定义为假正例数与所有实际负例数的比例。ROC曲线上的每个点对应于模型在不同阈值下的性能,曲线越向左上角凸起,表示模型性能越好‌。

AUC(Area Under the Curve)是ROC曲线下的面积,用于量化模型性能的综合指标。AUC的取值范围在0到1之间,越接近1表示模型性能越好,0.5表示随机性能。一个完全随机的分类器的AUC为0.5,而一个完美分类器的AUC为1。


实际应用场景

ROC曲线和AUC值在机器学习领域有着广泛的应用。它们常用于评估二分类模型的性能,特别是在医疗诊断、欺诈检测、图像识别等领域。通过观察ROC曲线和AUC值,可以直观地了解模型在不同阈值下的表现,从而选择最优的模型参数‌。

综上所述,ROC曲线和AUC值是评估二分类模型性能的重要工具,通过观察ROC曲线和计算AUC值,可以有效地评估和选择最优的机器学习模型。




在前期的分享中,我们以示例数据为例,分别进行了Logistic回归、决策树、随机森林、支持向量机(SVM)、神经网络、XGBoost、lightGBM七种模型的训练及测试集数据拟合。








分别绘制了模型效果评价的ROC曲线:









我们今天继续分享一下这其中模型综合评价的方法中,ROC曲线及曲线下面积AUC组合绘制的方法。我们先找到各个模型的pred.prob预测概率。








我们先用代码找出pred.prob预测概率,并一测试集数据的因变量(结局)进行ROC曲线组合绘制的组装:

#七种模型ROC曲线组合绘图

roc01 <- roc(Test$结局,logit.pred.prob);roc01  

roc02 <- roc(Test$结局,dt.pred.prob);roc02  

roc03 <- roc(Test$结局,rf.pred.prob);roc03

roc04 <- roc(Test$结局,svm.pred.prob);roc04

roc05 <- roc(Test$结局,nn.pred.prob);roc05

roc06 <- roc(Test$结局,xg.pred.prob);roc06

roc07 <- roc(Test$结局,lt.pred);roc07








然后直接绘图:

plot(roc01,

     max.auc.polygon=FALSE,  # 填充整个图像

     smooth=F, # 绘制不平滑曲线

     main="Comparison of ROC curves", # 添加标题

     col="red",  # 曲线颜色

     legacy.axes=TRUE)   # 使横轴从0到1,表示为1-特异度

plot.roc(roc02,

         add=T,  # 增加曲线

         col="orange", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线

plot.roc(roc03,

         add=T,  # 增加曲线

         col="yellow", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线

plot.roc(roc04,

         add=T,  # 增加曲线

         col="green", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线

plot.roc(roc05,

         add=T,  # 增加曲线

         col="skyblue", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线

plot.roc(roc06,

         add=T,  # 增加曲线

         col="blue", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线

plot.roc(roc07,

         add=T,  # 增加曲线

         col="purple", # 曲线颜色为红色

         smooth = F)  # 绘制不平滑曲线








在图例部分,可以标明各个模型的AUC值,注意图例部分曲线颜色与前边画的曲线颜色一致:

legend("bottomright", 

       legend = c("Logistic回归模型AUC=0.9705", 

                  "决策树模型AUC=0.8995",

                  "随机森林模型AUC=0.9016",

                  "SVM模型AUC=0.9837",

                  "神经网络模型AUC=0.9787",

                  " XGBoost模型AUC=0.9629",

                  "lightGBM模型AUC=0.999"),

       col = c("red", "orange","yellow","green",

               "skyblue","blue","purple"), 

       lwd = 1.5, cex = 0.75) 








医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!





医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!
 最新文章