软件开发价格 R讲话catboost(ROC,PR弧线,校准弧线,有计划弧线)

你的位置:软件开发价格 > 软件开发资讯 > 软件开发价格 R讲话catboost(ROC,PR弧线,校准弧线,有计划弧线)
软件开发价格 R讲话catboost(ROC,PR弧线,校准弧线,有计划弧线)
发布日期:2024-11-06 05:24    点击次数:147

图片

图片

图片

图片

图片

图片

图片

图片

CatBoost是一种基于有计划树的梯度擢升算法。它由Yandex(俄罗斯搜索巨头)征询东说念主员和工程师拓荒,用于Yandex和其他公司(包括CERN、Cloudflare、Careem出租车)的搜索、推选系统、个东说念主助理、自动驾驶汽车、天气预告和许多其他任务。它是开源的,任何东说念主齐不错使用。提供Python、R、号令行等多种版块。

CatBoost和之前先容过的XGBoost、LightGBM并称为GBDT的三大主流神器。

本文目次:

特质先容

装置

快速上手

数据准备

锤真金不怕火模子

稽查成果

交叉考证

新数据展望

模子评价

欺凌矩阵

ROC弧线

PR弧线

校准弧线

有计划弧线

锤真金不怕火集筹备

参数先容

超参数调优

模子证实

特质先容

说真话官网先容的这几个特质我合计相配诱导我!

无需超参数调优即可得到高质地成果:CatBoost默许参数得到的模子就还是满盈优秀,省去普遍调优时候不需要对分类变量重编码:多数模子齐需要在启动前对分类变量进行一些预处置,比如假造变量相通等,然则CatBoost不需要这些操作!它会自动为你处置这些分类变量支持GPU:这个没啥说的,其他算法也有更高的准确率:过拟合的可能性更小,成果准确率更高更快的速率:比比XGBoost和LightGBM更快

转头来说即是:CatBoost比XGBoost和LightGBM更准、更快、更过劲!选CatBoost就对了!

看下官方给出的模子性能比拟:

图片

再看下速率对比,快了不是小数点!

天狼星 VS 哥德堡盖斯两队近10年的交战次数为6场,天狼星2胜2平2负,赢球概率为33.3%,平局概率为33.3%,输球概率为33.3%。

图片

装置

不错奏凯用以下代码在线装置,我写这篇推文时(2024.3.25)最新的版块是1.2.5,提防版块不要写错!这个算法的更新速率连忙,github一直在更新中,这亦然我这样晚才先容这个算法的原因之一。

不同平台的装置形状略有不同,可参考官网教程:https://catboost.ai/en/docs/installation/r-installation-binary-installation

底下是windows的装置法式,在线装置对网罗有条款。

#install.packages('remotes')remotes::install_url('https://github.com/catboost/catboost/releases/download/v1.2.5/catboost-R-windows-x86_64-1.2.5.tgz', INSTALL_opts = c("--no-multiarch", "--no-test-load"))

若是你网不行,那照旧选拔把装置包下载下来,腹地装置,下载地址是:https://github.com/catboost/catboost/releases

提防选拔符合的版块:

remotes::install_local("E:/R/R包/catboost-R-windows-x86_64-1.2.5.tgz")
快速上手

最初加载数据和R包。

library(catboost)

数据就用有名的德国信用评分数据。这个数据一共有4454行,14列,其中Status是成果变量,二分类,因子型,good暗示信用评分好,bad暗示信用评分差,其余列是展望变量,展望变量既罕见值型也有分类型,分类型的齐是factor。况且这个数据有部分缺失值。

library(modeldata)data("credit_data")dim(credit_data)## [1] 4454   14str(credit_data)## 'data.frame':    4454 obs. of  14 variables:##  $ Status   : Factor w/ 2 levels "bad","good": 2 2 1 2 2 2 2 2 2 1 ...##  $ Seniority: int  9 17 10 0 0 1 29 9 0 0 ...##  $ Home     : Factor w/ 6 levels "ignore","other",..: 6 6 3 6 6 3 3 4 3 4 ...##  $ Time     : int  60 60 36 60 36 60 60 12 60 48 ...##  $ Age      : int  30 58 46 24 26 36 44 27 32 41 ...##  $ Marital  : Factor w/ 5 levels "divorced","married",..: 2 5 2 4 4 2 2 4 2 2 ...##  $ Records  : Factor w/ 2 levels "no","yes": 1 1 2 1 1 1 1 1 1 1 ...##  $ Job      : Factor w/ 4 levels "fixed","freelance",..: 2 1 2 1 1 1 1 1 2 4 ...##  $ Expenses : int  73 48 90 63 46 75 75 35 90 90 ...##  $ Income   : int  129 131 200 182 107 214 125 80 107 80 ...##  $ Assets   : int  0 0 3000 2500 0 3500 10000 0 15000 0 ...##  $ Debt     : int  0 0 0 0 0 0 0 0 0 0 ...##  $ Amount   : int  800 1000 2000 900 310 650 1600 200 1200 1200 ...##  $ Price    : int  846 1658 2985 1325 910 1645 1800 1093 1957 1468 ...

先按照7:3分散个锤真金不怕火集和测试集:

set.seed(6354)ind <- sample(1:nrow(credit_data),0.7*nrow(credit_data))train <- credit_data[ind,]test <- credit_data[-ind,]dim(train)## [1] 3117   14dim(test)## [1] 1337   14
数据准备

与XGBoost和LightGBM相同,CatBoost在使用时也需要专用的边幅,也使用专用的函数进行封装。

封装前亦然要把展望变量和成果变量单独拿出来,不可放一说念,成果变量必须用数字1和0暗示,分类变量提出使用因子型,计划时会自动进行预处置,然后使用catboost.load_pool()函数进行封装:

features <- train[,-1]labels <- ifelse(train$Status == "good",1,0)train_pool <- catboost.load_pool(data = features,label = labels)train_pool## catboost.Pool## 3117 rows, 13 columns
锤真金不怕火模子

封装好之后就不错提供给算法进行学习了,使用的函数是catboost.train():

model <- catboost.train(train_pool,  NULL,                        params = list(loss_function = 'Logloss', # 亏空函数                                      iterations = 100, # 100棵树                                      metric_period=10 # 每10棵树计划1次筹备                                      #prediction_type=c("Class","Probability")                                      )                         )## Learning rate set to 0.13828## 0:   learn: 0.6445127    total: 159ms    remaining: 15.8s## 10:  learn: 0.4703331    total: 245ms    remaining: 1.98s## 20:  learn: 0.4236971    total: 329ms    remaining: 1.24s## 30:  learn: 0.4003478    total: 415ms    remaining: 925ms## 40:  learn: 0.3891287    total: 502ms    remaining: 722ms## 50:  learn: 0.3798819    total: 594ms    remaining: 571ms## 60:  learn: 0.3711200    total: 682ms    remaining: 436ms## 70:  learn: 0.3646432    total: 770ms    remaining: 314ms## 80:  learn: 0.3577685    total: 857ms    remaining: 201ms## 90:  learn: 0.3532076    total: 943ms    remaining: 93.2ms## 99:  learn: 0.3474675    total: 1.02s    remaining: 0us
稽查成果

默许的成果,平平无奇:

model## CatBoost model (100 trees)## Loss function: Logloss## Fit to 13 feature(s)

获取变量伏击性:

catboost.get_feature_importance(model)##                [,1]## Seniority 13.704942## Home       4.409678## Time       4.220234## Age        2.819654## Marital    1.347322## Records   11.865015## Job       10.489621## Expenses   4.141522## Income    16.671911## Assets     7.982805## Debt       2.387191## Amount    13.280631## Price      6.679474

稽查模子的各式参数:

# 太长不放出来了catboost.get_model_params(model)
交叉考证

郑重使用的时候细目是要用交叉考证或者bootstrap这种重抽样法式的,此时不错用catboost.cv():

model_cv <- catboost.cv(train_pool, fold_count = 5, # 5折交叉考证                     params = list(loss_function = 'Logloss', # 亏空函数                                   iterations = 100, # 100棵树,默许是1000                                   metric_period=10 # 每10棵树计划1次筹备                                   ,verbose=0 # 减少日记输出                                   ,random_seed=1234                                   )                      )## Training on fold [0/5]## ## bestTest = 0.4371081209## bestIteration = 99## ## Training on fold [1/5]## ## bestTest = 0.4414686541## bestIteration = 99## ## Training on fold [2/5]## ## bestTest = 0.3944321369## bestIteration = 99## ## Training on fold [3/5]## ## bestTest = 0.4309943666## bestIteration = 99## ## Training on fold [4/5]## ## bestTest = 0.4337864039## bestIteration = 99

成果有11行,分别是分析集和评估集(这个看法不懂的请参考tidymodels-rsample:数据分散)的模子筹备,因为咱们建筑的是每10棵树计划1次筹备,一共有100棵树,是以有11行,若是改成每20棵树计划一次,即是有6行:

model_cv##    test.Logloss.mean test.Logloss.std train.Logloss.mean train.Logloss.std## 1          0.6776724      0.001077025          0.6769152       0.001407418## 2          0.5717982      0.005433284          0.5655896       0.002684553## 3          0.5189984      0.006360272          0.5075464       0.004846065## 4          0.4890277      0.009908884          0.4719268       0.005552004## 5          0.4681056      0.012011841          0.4474683       0.005473089## 6          0.4540802      0.012673318          0.4295447       0.005890671## 7          0.4454735      0.014272786          0.4175673       0.005970905## 8          0.4380360      0.015334895          0.4058692       0.006510348## 9          0.4329628      0.016470751          0.3966050       0.006976306## 10         0.4294426      0.017505843          0.3890955       0.007753856## 11         0.4275579      0.018925086          0.3832895       0.007536350

给你顺遂画个图,望望迭代次数(也即是树的数目)和模子性能的联系:

library(ggplot2)library(tidyr)library(dplyr)model_cv %>% mutate(iteration = (row_number()-1)*10) %>%   pivot_longer(cols = c(1,3),names_to = "sets",values_to = "Logloss.mean") %>%   ggplot(., aes(iteration,Logloss.mean))+  geom_line(aes(group=sets,color=sets),linewidth=2)

图片

树越多越准确哈,然则太多了容易过拟合。

新数据展望

这样这个模子就锤真金不怕火好了,底下就不错对新的数据进行展望了。

展望前亦然需要先用catboost.load_pool()把数据封装起来,然后使用catboost.predict()即可:

test_pool <- catboost.load_pool(test[,-1])# 展望类别概率pred_prob <- catboost.predict(model, test_pool, prediction_type = "Probability")head(pred_prob)## [1] 0.4514856 0.9225333 0.1778611 0.9073103 0.9636420 0.3190501

二分类数据支持以下展望类型:

ProbabilityClassRawFormulaValExponentLogProbabilityVirtEnsemblesTotalUncertainty

使用起来毫无难度,是不是很easy呢?

模子评价

模子评价照旧那一套,欺凌矩阵、准确率、敏锐度、特异度、ROC弧线等等。咱们需要的即是拿到模子的展望成果就好了,分类变量的成果有2种:展望类别或者展望的某种类别的概率。

有些模子只可给出其中1种,有的模子齐能给,比如catboost。

获取测试集的展望概率和类别:

# 展望类别pred_status <- catboost.predict(model, test_pool, prediction_type = "Class")# 得把1,0这种再变且归才好比拟pred_status <- ifelse(pred_status==1,"good","bad")# 再造成因子型,得和原始数据保握一致levels(test$Status)## [1] "bad"  "good"pred_status <- factor(pred_status,levels = levels(test$Status))head(pred_status)## [1] bad  good bad  good good bad ## Levels: bad good
欺凌矩阵

借助caret稽查欺凌矩阵,这个功能是当今R内部最宽广的,莫得敌手:

caret::confusionMatrix(pred_status,test$Status, mode="everything")## Confusion Matrix and Statistics## ##           Reference## Prediction bad good##       bad  180   98##       good 198  861##                                           ##                Accuracy : 0.7786          ##                  95% CI : (0.7554, 0.8006)##     No Information Rate : 0.7173          ##     P-Value [Acc > NIR] : 2.014e-07       ##                                           ##                   Kappa : 0.4066          ##                                           ##  Mcnemar's Test P-Value : 8.702e-09       ##                                           ##             Sensitivity : 0.4762          ##             Specificity : 0.8978          ##          Pos Pred Value : 0.6475          ##          Neg Pred Value : 0.8130          ##               Precision : 0.6475          ##                  Recall : 0.4762          ##                      F1 : 0.5488          ##              Prevalence : 0.2827          ##          Detection Rate : 0.1346          ##    Detection Prevalence : 0.2079          ##       Balanced Accuracy : 0.6870          ##                                           ##        'Positive' Class : bad             ## 
ROC弧线

画个ROC弧线,软件开发价格就用ROCR包吧,3步走:

library(ROCR)pred <- prediction(pred_prob,test$Status) # 展望概率,确凿类别perf <- performance(pred, "tpr","fpr")auc <- round(performance(pred, "auc")@y.values[[1]],digits = 4)#aucplot(perf,lwd=2,col="tomato")abline(0,1,lty=2)legend("bottomright", legend=paste("测试集AUC: ",auc), col="tomato", lwd=2,bty = "n")

图片

AUC是0.82以上,成果还不错,然则要提防这个是good的AUC哦。

PR弧线

顺遂再画个PR弧线吧,这个弧线很常见,然则在我之前的推文中画的不是许多,其实也很浅薄的,照旧用ROCR就不错画,横坐标是查全率(recall,也叫调回率、聪惠度、真阳性率),纵坐标是查准率(precision,又叫精准率)。

library(ROCR)pred <- prediction(pred_prob,test$Status) # 展望概率,确凿类别perf <- performance(pred, "prec","rec")auc <- round(performance(pred, "auc")@y.values[[1]],digits = 4)plot(perf,lwd=2,col="tomato")legend("bottomright", legend=paste("AUC: ",auc), col="tomato", lwd=2,bty = "n")

图片

软件开发

这个即是PR弧线,它的弧线底下积亦然AUC(area under the curve),只不外这个是PR-AUC,上头的阿谁是ROC-AUC。

校准弧线

公众号后台回应校准弧线可获取书册,稽查各式各类的校准弧线绘图,我这里给巨匠先容最新的法式(其实之前也先容过了),用probably这个包绘图:

library(probably)## Warning: package 'probably' was built under R version 4.3.3library(dplyr)test %>% select(Status) %>%   bind_cols(.pred_good = pred_prob) %>%   cal_plot_breaks(Status, .pred_good,event_level = "second",conf_level = 0.95)

图片

然则当今这个版块(1.0.3)有个bug,第3个参数estimate,必须是.pred_xxx,其中的xxx必须是确凿成果中的某一个类别,比如我这个数据Status中的类别即是good和bad,那么这个名字就必须是.pred_good或者.pred_bad,其他齐会报错(下标出界)!!

有计划弧线

顺遂再画个有计划弧线,这个有计划弧线是临床展望模子中才有的本色,其他本色基本上齐是机器学习的基础学问。公众号后台回应有计划弧线即可获取书册:

source("datasets/dca.r")# 需要确凿成果和展望概率dca_data <- data.frame(truth_status = test$Status, pred_prob = pred_prob)# 成果变量造成0,1dca_data$truth_status <- ifelse(dca_data$truth_status == "good",1,0)dc <- dca(data = dca_data, # 测试集          outcome = "truth_status",          predictors = "pred_prob",          probability = T          )

图片

太浅薄!

前几年stdca.r和dca.r这两个剧本是不错在网罗中免费下载的,然则从2022年底傍边这个网站就不提供这两段代码的下载了。因为我很早就下载好了,是以我把这两段代码放在粉丝qq群文献里,巨匠有需要的加群下载即可。天然我还先容了许多其他法式,公众号后台回应有计划弧线即可获取书册。

锤真金不怕火集筹备

有的时候写著述还需要同期写上锤真金不怕火集的各式筹备,很浅薄,把数据换成锤真金不怕火集即可得到锤真金不怕火集的成果:

pred_status <- catboost.predict(model, train_pool, # 这里写锤真金不怕火集                                prediction_type = "Class")pred_prob <- catboost.predict(model, train_pool,                              prediction_type = "Probability")pred_status <- ifelse(pred_status==1,"good","bad")pred_status <- factor(pred_status,levels = levels(train$Status))# 欺凌矩阵caret::confusionMatrix(train$Status, pred_status, mode="everything")## Confusion Matrix and Statistics## ##           Reference## Prediction  bad good##       bad   546  330##       good  138 2103##                                           ##                Accuracy : 0.8499          ##                  95% CI : (0.8368, 0.8622)##     No Information Rate : 0.7806          ##     P-Value [Acc > NIR] : < 2.2e-16       ##                                           ##                   Kappa : 0.6019          ##                                           ##  Mcnemar's Test P-Value : < 2.2e-16       ##                                           ##             Sensitivity : 0.7982          ##             Specificity : 0.8644          ##          Pos Pred Value : 0.6233          ##          Neg Pred Value : 0.9384          ##               Precision : 0.6233          ##                  Recall : 0.7982          ##                      F1 : 0.7000          ##              Prevalence : 0.2194          ##          Detection Rate : 0.1752          ##    Detection Prevalence : 0.2810          ##       Balanced Accuracy : 0.8313          ##                                           ##        'Positive' Class : bad             ## 

ROC弧线和PR弧线亦然相同的画,这里只演示下ROC:

library(ROCR)pred <- prediction(pred_prob,train$Status) # 展望概率,确凿类别perf <- performance(pred, "tpr","fpr")auc <- round(performance(pred, "auc")@y.values[[1]],digits = 4)#aucplot(perf,lwd=2,col="tomato")abline(0,1,lty=2)legend("bottomright", legend=paste("锤真金不怕火集AUC: ",auc), col="tomato", lwd=2,bty = "n")

图片

有点过拟合了,不外还不错,一般来说锤真金不怕火集细目是要比测试集高小数的,因为这种法式并不正规,你把锤真金不怕火用的数据再行给模子展望,这样属于“泄题步履”~。

参数先容

catboost.load_pool的参数没啥畸形的,主要的作用即是封装数据,巨匠不错看下匡助文档。与catboost.load_pool对应的还有个catboost.save_pool是用来保存数据的,保存的边幅亦然CatBoost支持的边幅,看名字也知说念有点雷同于R中的save()和load()。

要点说下catboost.train()的参数。catboost.train()提及来惟有3个参数:

learn_pool:用来锤真金不怕火模子的数据test_pool:测试数据,用来贯注过拟合的,默许值是NULL,即不使用params:这个才是最伏击的参数,内部是一个列表,包括了相配多的超参数

然则呢也不要发怵,因为CatBoost的上风之一即是使用默许的参数即可得回相配棒的成果,是以若是你不口舌常懂这些参数,不要璷黫改,你改的可能还不如默许的好。

另外即是这些参数天然相配多(粗鄙数了下居然有78个!),然则多数参数齐是和树模子关联的参数以及和擢升算法关联的参数,比如树的数目、树的深度等等。剩下的参数即是一些截至输出的、截至日记的、和catboost算法本人关联的等等。

巨匠使用时确凿需要调养的可能照旧亏空函数、学习率、树的数目、输的深度等这种参数软件开发价格。这小数不错和XGBoost和LightGBM对照着学习。

超参数调优 本站仅提供存储管事,所有这个词本色均由用户发布,如发现存害或侵权本色,请点击举报。