发布日期:2024-11-06 04:21 点击次数:180
💡专注R言语在🩺生物医学中的使用
设为“星标”,精彩可以过
xgboost(Extreme Gradient Boosting),极限梯度晋升,是基于梯度晋升树(gradient boosting decision tree,GBDT)达成的集成(ensemble)算法,本色上依然一种晋升(boosting)算法,然则把速率和后果晋升到最强,是以加了Extreme。XGBoost是陈天奇等东谈主开源的一个机器学习式样,CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,齐是在GBDT算法框架下的一种检阅达成。
xgboost的一些特色包括:
速率快后果高:默许会借助OpenMP进行并行绸缪中枢代码使用C++达成,速率快,易共享;正则化:可以使用正则化技能幸免过度拟合;交叉考据:里面会进行交叉考据;缺失值处置:可以处置缺失值,不需要提前插补;适用于多种任务类型:相沿纪念分类排序等,还相沿用户自界说的地方函数;对于更多它的布景常识,提出人人我方学习,咱们望望它在R言语中的达成。
本文目次:
准备数据
拟合模子
揣摸
结果输出日记
变量热切性
稽察树的信息
赛后,阿根廷队核心梅西接受了媒体采访。他表示:“这届美洲杯的比赛条件非常艰难,场地状况不佳,气温也很高。但我现在正在尽情享受自己职业生涯中的最后一届美洲杯,就像当初享受最后一届世界杯一样,这是我最后的战斗!”
[扫码下载app,中过数字彩1千万以上的专家都在这儿!]
保存加载模子
参考尊府
准备数据先用自带数据演示一下简便的使用方式。
最初是加载数据,这是一个二分类数据,其中label是末端变量,使用0和1暗示,其余是揣摸变量。
library(xgboost)rm(list = ls())# load datadata(agaricus.train, package='xgboost')data(agaricus.test, package='xgboost')train <- agaricus.traintest <- agaricus.teststr(train)## List of 2## $ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots## .. ..@ i : int [1:143286] 2 6 8 11 18 20 21 24 28 32 ...## .. ..@ p : int [1:127] 0 369 372 3306 5845 6489 6513 8380 8384 10991 ...## .. ..@ Dim : int [1:2] 6513 126## .. ..@ Dimnames:List of 2## .. .. ..$ : NULL## .. .. ..$ : chr [1:126] "cap-shape=bell" "cap-shape=conical" "cap-shape=convex" "cap-shape=flat" ...## .. ..@ x : num [1:143286] 1 1 1 1 1 1 1 1 1 1 ...## .. ..@ factors : list()## $ label: num [1:6513] 1 0 0 1 0 0 0 1 0 0 ...str(test)## List of 2## $ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots## .. ..@ i : int [1:35442] 0 2 7 11 13 16 20 22 27 31 ...## .. ..@ p : int [1:127] 0 83 84 806 1419 1603 1611 2064 2064 2701 ...## .. ..@ Dim : int [1:2] 1611 126## .. ..@ Dimnames:List of 2## .. .. ..$ : NULL## .. .. ..$ : chr [1:126] "cap-shape=bell" "cap-shape=conical" "cap-shape=convex" "cap-shape=flat" ...## .. ..@ x : num [1:35442] 1 1 1 1 1 1 1 1 1 1 ...## .. ..@ factors : list()## $ label: num [1:1611] 0 1 0 0 0 0 1 0 1 0 ...class(train$data)## [1] "dgCMatrix"## attr(,"package")## [1] "Matrix"
xgboost对数据方式是有条目的,可以看到train和test齐是列表,其中包含了揣摸变量data和末端变量label,其中label是使用0和1暗示的。data部分是稀零矩阵的样子(dgCMatrix)。
# 稽察数据维度,6513行,126列dim(train$data)## [1] 6513 126table(train$label)## ## 0 1 ## 3373 3140拟合模子
接下来即是使用考验数据拟合模子:
model <- xgboost(data = train$data, label = train$label, max.depth = 2, # 树的最大深度 eta = 1, # 学习率 nrounds = 2, nthread = 2, # 使用的CPU线程数 objective = "binary:logistic")## [1] train-logloss:0.233376 ## [2] train-logloss:0.136658
其中的参数nround在这里暗示最终模子中树的数目,objective是地方函数。
除了使用列表传入数据,也相沿R言语中的密集矩阵(matrix),比如:
model <- xgboost(data = as.matrix(train$data), label = train$label, max.depth = 2, eta = 1, nrounds = 2, nthread = 2, objective = "binary:logistic")
## [1] train-logloss:0.233376 ## [2] train-logloss:0.136658
劝诱者最推选的方式依然稀奇为xgboost设想的xgb.DMatrix方式。
# 建造xgb.DMatrixdtrain <- xgb.DMatrix(data = train$data, label = train$label)xx <- xgboost(data = dtrain, # 这么就毋庸单独传入label了 max.depth = 2, eta = 1, nrounds = 2, nthread = 2, objective = "binary:logistic" )
## [1] train-logloss:0.233376 ## [2] train-logloss:0.136658
这个方式亦然xgboost稀奇设想的,有助于更好更快的进行绸缪,还可以相沿更多的信息传入。可以通过getinfo取得其中的元素:
head(getinfo(dtrain, "label"))
## [1] 1 0 0 1 0 0揣摸
拟合模子后,就可以对新数据进行揣摸了:
# predictpred <- predict(model, test$data)head(pred)## [1] 0.28583017 0.92392391 0.28583017 0.28583017 0.05169873 0.92392391range(pred)## [1] 0.01072847 0.92392391
咱们的任务是一个二分类的,然则xgboost的揣摸末端是概率,物联网软件开发公司并不是径直的类别。咱们需要我方诊治一下,比如要领概率大于0.5即是类别1,小于等于0.5即是类别0(这其实也可以手脚念超参数诊治的)。
pred_label <- ifelse(pred > 0.5,1,0)table(pred_label)## pred_label## 0 1 ## 826 785# 混浊矩阵table(test$label, pred_label)## pred_label## 0 1## 0 813 22## 1 13 763
全对,准确率100%。
除此以外还提供一个xgb.cv()用于达成交叉考据的建模,使用方式与xgboost()一致:
cv.res <- xgb.cv(data = train$data, label = train$label, nrounds = 2, objective = "binary:logistic", nfold = 10 # 交叉考据的折数 )## [1] train-logloss:0.439723+0.000182 test-logloss:0.439976+0.000908 ## [2] train-logloss:0.299610+0.000125 test-logloss:0.299913+0.001478
min(cv.res$evaluation_log)
## [1] 0.0001254714结果输出日记
xgboost()和xgb.train()有参数verbose可以结果输出日记的若干,默许是verbose = 1,输出性能规画末端。xgboost()是xgb.train()的简便封装,xgb.train()是考验xgboost模子的高等接口。
要是是0,则是莫得任何输出:
xx <- xgboost(data = train$data, label = train$label, objective = "binary:logistic" ,nrounds = 2 ,verbose = 0 )
要是是2,会输出性能规画末端和其他信息(这里没深远):
xx <- xgboost(data = train$data, label = train$label, objective = "binary:logistic" ,nrounds = 2 ,verbose = 2 )
## [1] train-logloss:0.439409 ## [2] train-logloss:0.299260
xgb.cv()的verbose参数只消TRUE和FALSE。
变量热切性xgboost中变量的热切性是这么绸缪的:
咱们如安在xgboost中界说特色的热切性?在xgboost中,每次分割齐试图找到最好特征和分割点(splitting point)来优化地方。咱们可以绸缪每个节点上的增益,它是所选特征的孝顺。终末,咱们对统统的树进行沟通,总结每个特征的孝顺,并将其视为热切性。要是特征的数目很大,咱们也可以在绘画图之前对特征进行聚类。
稽察变量热切性:
importance_matrix <- xgb.importance(model = model)importance_matrix
## Feature Gain Cover Frequency## 1: odor=none 0.67615470 0.4978746 0.4## 2: stalk-root=club 0.17135376 0.1920543 0.2## 3: stalk-root=rooted 0.12317236 0.1638750 0.2## 4: spore-print-color=green 0.02931918 0.1461960 0.2
可视化变量热切性:
xgb.plot.importance(importance_matrix)
图片
plot of chunk unnamed-chunk-14大概ggplot2版块:
xgb.ggplot.importance(importance_matrix)
图片
稽察树的信息可以把学习好的树打印出来,稽察具体情况:
xgb.dump(model, with_stats = T)
## [1] "booster[0]" ## [2] "0:[f28<0.5] yes=1,no=2,missing=1,gain=4000.53101,cover=1628.25" ## [3] "1:[f55<0.5] yes=3,no=4,missing=3,gain=1158.21204,cover=924.5" ## [4] "3:leaf=1.71217716,cover=812" ## [5] "4:leaf=-1.70044053,cover=112.5" ## [6] "2:[f108<0.5] yes=5,no=6,missing=5,gain=198.173828,cover=703.75" ## [7] "5:leaf=-1.94070864,cover=690.5" ## [8] "6:leaf=1.85964918,cover=13.25" ## [9] "booster[1]" ## [10] "0:[f59<0.5] yes=1,no=2,missing=1,gain=832.544983,cover=788.852051"## [11] "1:[f28<0.5] yes=3,no=4,missing=3,gain=569.725098,cover=768.389709"## [12] "3:leaf=0.78471756,cover=458.936859" ## [13] "4:leaf=-0.968530357,cover=309.45282" ## [14] "2:leaf=-6.23624468,cover=20.462389"
还可以可视化树:
xgb.plot.tree(model = model)
图片
这个图展示了2棵树的分支流程,因为咱们缔造了nround=2,是以末端即是只消2棵树。
要是树的数目特别多的时刻,这么每棵树看过来并不是很直不雅,常常xgboost固然不如立时丛林需要的树多,然则几十棵老是要的,是以xgboost提供了一种能把统统的树连合在悉数展示的方式。
# 多棵树展示在悉数xgb.plot.multi.trees(model = model,fill=TRUE)
图片
app这幅图即是把上头那张图的信息整合到了悉数,人人仔细对比下图中的数字就会发现信息是雷同的哦。
除了以上方式可以检查树的信息外,还可以通过稽察树的深度来检查树的结构。
bst <- xgboost(data = train$data, label = train$label, max.depth = 15, eta = 1, nthread = 2, nround = 30, objective = "binary:logistic", min_child_weight = 50,verbose = 0)xgb.plot.deepness(model = bst)
图片
plot of chunk unnamed-chunk-19这两幅图的横坐标齐是树的深度,上头的图纵坐标是叶子的数目,展示了每层深度中的叶子数目。底下的图纵坐标是每片叶子的归一化之后的加权遮掩。
从图中可以看出树的深度在5之后,叶子的数目就很少了,这辅导咱们为了驻扎过拟合,可以把树的深度结果在5以内。
保存加载模子保存加载考验好的模子:
# 保存xgb.save(model, "xgboost.model")# 加载xgb.load("xgboost.model")aa <- predict(model, test$data)
在R言语中除了径直使用xgboost这个R包达成以外,还有好多轮廓性的R包齐可以达成xgboost算法,并相沿超参数调优等更多任务,比如caret、tidymodels、mlr3。
参考尊府官方文档:https://xgboost.readthedocs.io/en/latest/R-package/xgboostPresentation.htmlhttps://www.r-bloggers.com/2016/03/an-introduction-to-xgboost-r-package/关联咱们物联网软件开发公司,温煦咱们
免费QQ换取群1:613637742(已满)免费QQ换取群2:608720452公众号音讯界濒临于作家取得关联方式知乎、CSDN、简书同名账号哔哩哔哩:阿越即是我 本站仅提供存储做事,统统内容均由用户发布,如发现存害或侵权内容,请点击举报。