往期回顾
REVIEWS
4)机器学习|第4期. 特征工程干货及R实战(一)
5)机器学习|第5期. 特征工程干货及R实战(二)
上一期我们带大家学习了机器学习预测模型入门与R实战(一),分享了机器学习建模与可视化的重要内容,现继续分享机器学习预测模型入门与R实战(二)。
MASCU
•
✦
机器学习
✦
•
01
机器学习预测模型R实战(二)
####加载必要的包
library(dplyr) #未安装的话,记得install.packages("R包名")
library(caret)
library(pROC)
library(rms)
library(ROCR)
library(stats)
library(xgboost)
library(Boruta)
if(!require("compareGroups"))install.packages("compareGroups");library("compareGroups")
if (!require("openxlsx")) {
install.packages("openxlsx")}
library(openxlsx)
####读取数据
data <- read.xlsx("machine learning.xlsx") ###如果使用自身数据,需注意变量名更换
####其他代码见上期
####模型构建与评估(大于胎龄儿为分类任务,使用上述7种机器学习分类算法)
models <- c("glm", "rf", "xgbTree","rpart", "svmLinear", "knn", "nb")
results <- lapply(models, function(modelName) {
# 设置控制参数
control <- trainControl(method = "cv", number = 5)
# 构建模型
model <- train(LGA~ .,
data = train,
method = modelName,
trControl = control,
preProcess = c("center", "scale"))
# 使用测试集评估模型
pred <- predict(model, newdata = test)
confusionMatrix(pred, test$LGA)
})
# 输出每个模型的结果
names(results) <- models
lapply(names(results), function(name) {
print(paste(name, "Confusion Matrix and Statistics:"))
print(results[[name]])
})
results
####输出的结果如下图所示
#(注意:上述结果图展示了每个算法获得的准确率accuracy及其95%CI,Kappa值,灵敏度Sensitivity,特异度Specificity,Pos Pred Value阳性预测值,Neg Pred Value阴性预测值等。)
####ROC曲线下面积
test$LGA <- as.numeric(factor(test$LGA)) - 1 # 转换为0和1
models <- c("glm", "rf", "xgbTree","rpart", "svmLinear", "knn", "nb")
# 存储模型
trained_models <- list()
# 训练模型并存储
for (modelName in models) {
# 设置控制参数
control <- trainControl(method = "cv", number = 5)
# 构建模型
model <- train(LGA ~ .,
data = train,
method = modelName,
trControl = control,
preProcess = c("center", "scale"))
trained_models[[modelName]] <- model
}
# 定义用于绘制的函数
draw_roc_curves <- function(dataSet, title) {
plot_colors <- c("black", "red", "blue", "green", "orange","yellow", "purple")
pdf(paste0(title, ".pdf")) # 保存为PDF文件
# 初始化第一个模型的ROC曲线
first_model <- trained_models[[models[1]]]
pred_probs <- tryCatch({
predict(first_model, newdata = test, type = "prob")[,2]
}, warning = function(w) NULL)
if (!is.null(pred_probs)) {
roc_obj <- tryCatch({
roc(test$LGA, pred_probs)
}, error = function(e) NULL)
if (!is.null(roc_obj)) {
# 绘制第一个模型的ROC曲线
plot(roc_obj, col = plot_colors[1], main = title,
print.auc = TRUE, print.auc.x = 0.8, print.auc.y = 0.2,
print.auc.cex = 0.8, print.auc.col = plot_colors[1])
}
}
for (i in 2:length(models)) {
modelName <- models[i]
model <- trained_models[[modelName]]
# 使用模型进行预测
pred_probs <- tryCatch({
predict(model, newdata = test, type = "prob")[,2]
}, warning = function(w) NULL)
if (!is.null(pred_probs)) {
# 计算ROC曲线
roc_obj <- tryCatch({
roc(test$LGA, pred_probs)
}, error = function(e) NULL)
if (!is.null(roc_obj)) {
# 绘制ROC曲线
# 使用lines添加剩余模型的ROC曲线
lines(roc_obj, col = plot_colors[i], print.auc = FALSE)
}
}
}
# 添加图例
legend("bottomright", legend = models, col = plot_colors, lty = 1)
dev.off() # 关闭PDF设备
}
# 在训练集上绘制ROC曲线
draw_roc_curves(train, "Train2Set ROC Curves")
# 在测试集上绘制ROC曲线
draw_roc_curves(test, "Test2Set ROC Curves")
####输出结果如下图
今天的分享到这里就结束啦,你学会了吗?大家对于推送内容有任何问题或建议可以在公众号菜单栏“更多--读者的话” 栏目中提出,我们会尽快回复!
期待已久~临床科研交流群来啦!
如果大家对分享医学科研知识感兴趣,特别欢迎加入我们,期待与您的相遇相识相知,也非常欢迎大家自主投稿,如果您有需要分享的内容或对我们有任何建议,可通过后台留言、公众号菜单栏“更多—读者的话”栏目(进一步了解)或发送邮件至mascu_forever@163.com与我们交流并留下个人联系方式,我们会及时与您联系。
图文:心观
审核:美观
编辑:云观
编审:直观