顶刊都在用!基于LightGBM的临床预测模型实现方法

文摘   科学   2024-07-17 20:40   湖南  

大家好,我是北游。

信息时代,社会发展很快,在大模型满天飞的大背景下,一些机器学习算法也接踵而至,那么对于我们护理或医学研究领域有什么启发?对于这个问题,笔者翻阅了不少机器学习相关的SCI文献,总结了一点点小心得:拥抱新技术,积极探索交叉领域,精准化干预离不开精准且实用的预测模型。


一、LightGBM

老实说,LightGBM并不新,只是笔者自身以前并不关注它。 但是这确实是个颇有亮点的模型框架,下面这段文字整合自LightGBM官网(见参考文献)以及网络资源,大家姑且读之。
LightGBM是一个微软开源的梯度提升框架,特别适用于处理大规模数据集。LightGBM基于决策树算法,特点包括但不限于1. 更快的训练速度2. 更高的准确率3. 更低的内存使用4. 支持并行和向量化5. 类别特征支持。]
当然是有更多优势的,这些都在官网有介绍,笔者就不搬运了。其他特点无所谓,就是这个直接支持类别特征(变量),让我有些心动,毕竟大部分机器学习算法还是要求我们对分类变量进行处理的,尤其是一些深度学习方法,最常见的编码方法是one-hot(类似于我们常见的设置哑变量)
笔者从竞赛平台kaggle获取了一份关于泰坦尼克号乘客生存情况的数据,样本量不大,几百行,比较适合用于演示各类机器学习算法,有需要的朋友可以回复关键词(泰坦尼克自动获取文件(未做预处理的)
但是大多数机器学习算法对数据格式有些要求,所以笔者对此数据做了点小小的预处理,包括因子化、分层随机拆分、填补缺失值等,当然只是简单处理,未必专业,大家肯定是用自己的数据集来训练模型,因此此数据集仅供参考。预处理步骤见xgboost那篇推文。
处理后的数据集长这样:

除了Age之外,其余全部是因子型,survived是因变量(或者说标签)。

二、训练、评价

既然说这个方法不需要事先对分类变量进行预处理,那么我们就试一试?

# lightgbm 直接支持类别特征,但不是采用one-hot编码load(file = "datasets/train.rdata")
library('lightgbm')library(Matrix)
# youtput_vector = as.numeric(newtrain$Survived)-1
# 特有格式封装一遍predata = lgb.Dataset(as.matrix(newtrain[,-1]),label = output_vector)
set.seed(123)fit = lgb.train( params = list( objective = "binary", num_leaves = 4L, learning_rate = 0.1 ), data = predata)
pp = predict(fit, as.matrix(newtrain[,-1]))ppclassy = predict(fit, as.matrix(newtrain[,-1]),type = 'class')
library(caret)confusionMatrix(as.factor(classy), as.factor(output_vector))

准确率为08426,灵敏度与特异度分别是0.8978,0.7539,只能说是过得去,这可能是因为上面的代码没有调参(采用默认参数),LightGBM的超参数与xgboost是很类似的。如果想要调整超参数,可以用caret、mlr3、tidymodels等框架来做。其余的评价指标、可视化、模型解释可以参考我们前段时间发布的xgboost那篇文章。

、手工编码分类变量

下面测试下,手动(也是用了函数)对分类数据进行编码(one-hot),看看模型的评价结果会有什么变化。


# lightgbmload(file = "datasets/train.rdata")
library('lightgbm')library(Matrix)
# 先转成数值,这里是转成了dgCMatrix格式sparse_matrix = sparse.model.matrix(Survived ~ ., data = newtrain)[,-1]head(sparse_matrix)str(sparse_matrix)
# youtput_vector = as.numeric(newtrain$Survived)-1
# 特有格式封装一遍predata = lgb.Dataset(sparse_matrix,label = output_vector)
fit = lgb.train( params = list( objective = "binary", num_leaves = 4L, learning_rate = 0.1 ), data = predata)
pp = predict(fit, sparse_matrix)classy = predict(fit, sparse_matrix,type = 'class')
library(caret)confusionMatrix(as.factor(classy),as.factor(output_vector))

好像没好到哪里去:Accuracy : 0.8501、 Sensitivity : 0.9465 Specificity : 0.6953。有些低了,有些高了。也就是说用LightGBM的话,大胆放心用不做编码的数据,只要符合LightGBM模型本身对输入输出数据的要求就行。

觉得此文有帮助的话,可以帮忙点个赞吗?谢谢


主要参考来源:

官网https://lightgbm.readthedocs.io/en/latest/

相关R包(lightgbm)的帮助文档;

https://doi.org/10.1016/j.ebiom.2024.105206

免责声明:仅供科研学习和分享,不做商业用途,如有侵权,请联系我们删除,谢谢。


护理统计随笔
专注护理科研设计和统计分析。别人不会告诉你的干货,可以来这里找!
 最新文章