热点资讯

你的位置:物联网软件开发物联网软件多少钱 > 联系我们 > 物联网软件开发公司 xgboost生计分析和加快失效模子

物联网软件开发公司 xgboost生计分析和加快失效模子


发布日期:2024-11-06 09:11    点击次数:102


💡专注R话语在🩺生物医学中的使用

设为“星标”,精彩可以过

对于培植算法咱们一经先容过了GBM模子、Xgboost、lightGBM(Catboost暂不可用)3种,这几种行动齐是复古生计分析的,咱们之前的推文齐是以分类约略总结为例进行先容的。当今对于这几种算法进行生计分析的官方文档也很少(齐是基于Python的…)。

是以咱们今天先容下如安在R话语中使用xgboost竣事生计分析和加快失效模子。

加载R包和数据
library(xgboost)library(survival)

用1示意死亡,0示意删失:

lung$status <- ifelse(lung$status == 2,1,0)lung <- na.omit(lung) # 去掉NA

简便的分裂下数据,按照7:3分裂检会集和测试集:

set.seed(123)ind <- sample(1:nrow(lung),nrow(lung)*0.7)train_df <- lung[ind,]test_df <- lung[- ind, ]dim(train_df)## [1] 116  10dim(test_df)## [1] 51 10
生计分析

底下即是树立下xgboost的参数,夺陌生计分析objective = "survival:cox",以及eval_metric = "cox-nloglik"。

数据方法要树立为xgboost的专用方法,生计分析要耀眼因变量的树立。平直用Surv是不行的,xgboost中会把生计时间为负值确行动念是删失,是以咱们树立y时要如下树立:

# 选拔参数的值param <- list(objective = "survival:cox",              booster = "gbtree",              eval_metric = "cox-nloglik",              eta = 0.03,              max_depth = 3,              subsample = 1,              colsample_bytree = 1,              gamma = 0.5)# 准备预料变量和着力变量x <- as.matrix(train_df[, c("age","sex","ph.ecog","ph.karno","pat.karno")])# 树立y,把删失的改成负值y <- ifelse(train_df$status == 1, train_df$time, -train_df$time)# 放进专用的方法中train.mat <- xgb.DMatrix(data = x, label = y)train.mat## xgb.DMatrix  dim: 116 x 5  info: label  colnames: yes

然后就可以进行生计分析了:

set.seed(1)xgb.fit <- xgb.train(params = param,                      data = train.mat,                      nrounds = 1000,                     watchlist = list(val2 = train.mat),                     early_stopping_rounds = 50)## [1]  val2-cox-nloglik:3.869080 ## Will train until val2_cox_nloglik hasn't improved in 50 rounds.## ## [2]  val2-cox-nloglik:3.856530 ## [3]  val2-cox-nloglik:3.844888 ## [4]  val2-cox-nloglik:3.834070 ## 不祥## [222]    val2-cox-nloglik:3.367639 ## [223]    val2-cox-nloglik:3.367639 ## [224]    val2-cox-nloglik:3.367639 ## Stopping. Best iteration:## [174]    val2-cox-nloglik:3.367639xgb.fit## ##### xgb.Booster## raw: 238.9 Kb ## call:##   xgb.train(params = param, data = train.mat, nrounds = 1000, watchlist = list(val2 = train.mat), ##     early_stopping_rounds = 50)## params (as set within xgb.train):##   objective = "survival:cox", booster = "gbtree", eval_metric = "cox-nloglik", eta = "0.03", max_depth = "3", subsample = "1", colsample_bytree = "1", gamma = "0.5", validate_parameters = "TRUE"## xgb.attributes:##   best_iteration, best_msg, best_ntreelimit, best_score, niter## callbacks:##   cb.print.evaluation(period = print_every_n)##   cb.evaluation.log()##   cb.early.stop(stopping_rounds = early_stopping_rounds, maximize = maximize, ##     verbose = verbose)## # of features: 5 ## niter: 224## best_iteration : 174 ## best_ntreelimit : 174 ## best_score : 3.367639 ## best_msg : [174] val2-cox-nloglik:3.367639 ## nfeatures : 5 ## evaluation_log:##     iter val2_cox_nloglik##        1         3.869080##        2         3.856530## ---                      ##      223         3.367639##      224         3.367639

用在测试集上,谈论风险分数:

test_x <- as.matrix(test_df[, c("age","sex","ph.ecog","ph.karno","pat.karno")])risk_score <- predict(xgb.fit, newdata = test_x) # newdata如果是检会集可以获得检会集的风险分数risk_score##  [1] 0.4721478 1.8668407 3.4487274 0.5234923 0.5299142 0.2525677 0.3887208##  [8] 0.8716910 5.8021851 0.2647004 0.6711149 2.4503310 0.4688006 1.4702020## [15] 0.7774669 0.3813822 0.9095489 0.6189218 0.3667074 0.3612074 0.4357747## [22] 0.9482961 0.4830345 0.6624518 0.4522163 0.3241239 0.5598004 1.4702020## [29] 2.3615212 2.0817354 0.6228051 1.8675944 0.5460874 1.4702020 0.5198651## [36] 0.2530192 9.6702890 0.4650362 0.5829992 0.9305520 0.2432446 0.4080229## [43] 0.4403237 0.2779934 0.7739328 0.2030164 0.2839084 0.3376622 0.4515978## [50] 0.3893496 0.2779934hist(risk_score)

图片

image-20240204181610457

简便作念个生计分析望望,字据风险分数凹凸分组,然后作念K-M生计弧线:

groups <- ifelse(risk_score>median(risk_score),"high","low")library(survminer)# 字据rs_train_group建设生计函数f_train <- survfit(Surv(test_df$time, test_df$status) ~ groups)f_train## Call: survfit(formula = Surv(test_df$time, test_df$status) ~ groups)## ##              n events median 0.95LCL 0.95UCL## groups=high 25     20    291     223     460## groups=low  26     20    426     348     643ggsurvplot(f_train,           data = test_df,           surv.median.line = "hv",            #legend.title = "Risk Group",           #legend.labs = c("Low Risk", "High Risk"),           pval = TRUE,            ggtheme = theme_bw()           )

图片

image-20240204181624495

这个着力是没挑升想真谛的,然则可以看到在中间的部分,高风险组的死亡率是昭着高于低风险组的。

谈论C-index,借助Hmisc包竣事的:

library(Hmisc)rcorr.cens(as.numeric(risk_score),           Surv(test_df$time, test_df$status))##        C Index            Dxy           S.D.              n        missing ##      0.4178606     -0.1642789      0.1153034     51.0000000      0.0000000 ##     uncensored Relevant Pairs     Concordant      Uncertain ##     40.0000000   2094.0000000    875.0000000    450.0000000

brier score奈何谈论?平直改用mlr3吧,昂扬你对机器学习生计分析的扫数幻想→2024年了,高阶生计分析我激烈保举你用mlr3。

然则要耀眼,mlr3仅仅一个框架,它并不可治理你扫数问题,许多时候你可能照旧要回到这种基础R包中来。

加快失效模子

在R话语中通过xgboost竣事加快失效模子挺复杂的,物联网app开发主若是要把数据准备成它需要的方法。

其中的label(也即是因变量,生计时间)需要用一个区间示意,具体需要的款式如下所示:

图片

rm(list = ls())library(xgboost)lung$status <- ifelse(lung$status == 2,1,0)lung <- na.omit(lung) # 去掉NA

预料变量的准备莫得什么尽头的:

排列三从2004年开奖至今已开出6953期奖号了,其中第182期历史同期奖号出现19次,历年第182期分别开出号码:469、217、604、082、898、947、262、456、658、753、784、200、975、400、761、913、229、406、121。

X <- as.matrix(lung[, c("age","sex","ph.ecog","ph.karno","pat.karno")])dtrain <- xgb.DMatrix(X)

着力变量的准备很复杂,主若是字据上头的表格。如果不是删失数据,那么生计时间即是闭区间[a,a],如果是右删失即是闭区间[a,正无尽],如果是左删失即是[0,b],区间删失即是[a,b]。

app开发

底下我展示下未删失数据和右删失数据的树立行动,照旧用lung这个数据集。如果status是1,即是未删失数据,那么它的高下限就齐是生计时间;如果status是0,那即是右删失数据,那么它的高下限即是[生计时间,正无尽]。

# 树立未删结怨右删失数据的高下区间:y_lower_bound <- ifelse(lung$status == 1, lung$time, Inf)y_upper_bound <- ifelse(lung$status == 1, lung$time, Inf)

树立好之后使用setinfo函数把这个信息添加到dtrain这个对象中:

setinfo(dtrain, 'label_lower_bound', y_lower_bound)## [1] TRUEsetinfo(dtrain, 'label_upper_bound', y_upper_bound)## [1] TRUE

这么最难的一步就准备好了。接下来即是树立下参数,就可以检会了。

params <- list(objective='survival:aft', # 加快失效模子               eval_metric='aft-nloglik', # 评价谈论,不要乱选               aft_loss_distribution='normal',               aft_loss_distribution_scale=1.20,               tree_method='hist',               learning_rate=0.05,               max_depth=2)watchlist <- list(train = dtrain)bst <- xgb.train(params, dtrain, nrounds=30, watchlist)## [1]  train-aft-nloglik:20.251825 ## [2]  train-aft-nloglik:19.003819 ## [3]  train-aft-nloglik:17.959822 ## [4]  train-aft-nloglik:17.048453 ## 不祥## [29] train-aft-nloglik:14.974870 ## [30] train-aft-nloglik:15.246215

可以看到这么就可以了~后头的分析就又齐是重迭的了,我就不详确先容了。

参考尊府https://github.com/dmlc/xgboost/issues/9979https://xgboost.readthedocs.io/en/stable/tutorials/aft_survival_analysis.html

有计划咱们物联网软件开发公司,眷注咱们

免费QQ通常群1:613637742免费QQ通常群2:608720452公众号音讯界濒临于作家获得有计划方式知乎、CSDN、简书同名账号哔哩哔哩:阿越即是我 本站仅提供存储干事,扫数履行均由用户发布,如发现存害或侵权履行,请点击举报。