R機(jī)器學(xué)習(xí)mlr3:基礎(chǔ)使用

本文首發(fā)于公眾號:醫(yī)學(xué)和生信筆記

醫(yī)學(xué)和生信筆記崔泵,專注R語言在臨床醫(yī)學(xué)中的使用秒赤,R語言數(shù)據(jù)分析和可視化。主要分享R語言做醫(yī)學(xué)統(tǒng)計學(xué)憎瘸、meta分析入篮、網(wǎng)絡(luò)藥理學(xué)、臨床預(yù)測模型幌甘、機(jī)器學(xué)習(xí)潮售、生物信息學(xué)等。

一個簡單的機(jī)器學(xué)習(xí)流程在mlr3中可被分解為以下幾個部分:

  • 創(chuàng)建任務(wù)
    比如回歸锅风、分裂酥诽、生存分析、降維皱埠、密度任務(wù)等等
  • 挑選學(xué)習(xí)器(算法/模型)
    比如隨機(jī)森林肮帐、決策樹、SVM边器、KNN等等
  • 訓(xùn)練和預(yù)測

創(chuàng)建任務(wù)

本次示例將使用mtcars數(shù)據(jù)集創(chuàng)建一個回歸任務(wù)训枢,結(jié)果變量(或者叫因變量等等)是mpg

# 首先加載數(shù)據(jù)
data("mtcars",package = "datasets")
data <- mtcars[,1:3]
str(data)
## 'data.frame':    32 obs. of  3 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...

使用as_task_regr()創(chuàng)建回歸任務(wù)忘巧,as_task_classif()可創(chuàng)建分類任務(wù)恒界。

library(mlr3)

task_mtcars <- as_task_regr(data,target = "mpg",id="cars") # id是隨便起一個名字
print(task_mtcars)
## <TaskRegr:cars> (32 x 3)
## * Target: mpg
## * Properties: -
## * Features (2):
##   - dbl (2): cyl, disp

可以看到數(shù)據(jù)以供32行,3列砚嘴,target是mpg十酣,feature是cyl和disp,都是bdl類型际长。

在創(chuàng)建模型前先探索數(shù)據(jù):

library("mlr3viz") # 使用此包可視化數(shù)據(jù)
autoplot(task_mtcars, type = "pairs") # 基于GGally婆誓,我之前介紹過
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
image.png

如果你覺得每次加載1個R包很煩,可以直接使用library(mlr3verse)加載所有基礎(chǔ)包也颤!

如果你想使用自帶數(shù)據(jù)集進(jìn)行學(xué)習(xí)洋幻,此包也自帶了很多流行的機(jī)器學(xué)習(xí)數(shù)據(jù)集。

查看內(nèi)置數(shù)據(jù)集:

as.data.table(mlr_tasks)
##                key task_type nrow ncol properties lgl int dbl chr fct ord pxc
##  1: boston_housing      regr  506   19              0   3  13   0   2   0   0
##  2:  breast_cancer   classif  683   10   twoclass   0   0   0   0   0   9   0
##  3:  german_credit   classif 1000   21   twoclass   0   3   0   0  14   3   0
##  4:           iris   classif  150    5 multiclass   0   0   4   0   0   0   0
##  5:         mtcars      regr   32   11              0   0  10   0   0   0   0
##  6:       penguins   classif  344    8 multiclass   0   3   2   0   2   0   0
##  7:           pima   classif  768    9   twoclass   0   0   8   0   0   0   0
##  8:          sonar   classif  208   61   twoclass   0   0  60   0   0   0   0
##  9:           spam   classif 4601   58   twoclass   0   0  57   0   0   0   0
## 10:           wine   classif  178   14 multiclass   0   2  11   0   0   0   0
## 11:            zoo   classif  101   17 multiclass  15   1   0   0   0   0   0

結(jié)果很詳細(xì)翅娶,給出了任務(wù)類型文留,行列數(shù),變量類型等竭沫。

如果想要使用內(nèi)置數(shù)據(jù)集燥翅,可使用以下代碼:

task_penguin <- tsk("penguins")
print(task_penguin)
## <TaskClassif:penguins> (344 x 8)
## * Target: species
## * Properties: multiclass
## * Features (7):
##   - int (3): body_mass, flipper_length, year
##   - dbl (2): bill_depth, bill_length
##   - fct (2): island, sex

可以非常方便的取子集查看:

library("mlr3verse")
as.data.table(mlr_tasks)[, 1:4]
##                key task_type  nrow ncol
##  1:           actg      surv  1151   13
##  2:   bike_sharing      regr 17379   14
##  3: boston_housing      regr   506   19
##  4:  breast_cancer   classif   683   10
##  5:       faithful      dens   272    1
##  6:           gbcs      surv   686   10
##  7:  german_credit   classif  1000   21
##  8:          grace      surv  1000    8
##  9:           ilpd   classif   583   11
## 10:           iris   classif   150    5
## 11:     kc_housing      regr 21613   20
## 12:           lung      surv   228   10
## 13:      moneyball      regr  1232   15
## 14:         mtcars      regr    32   11
## 15:      optdigits   classif  5620   65
## 16:       penguins   classif   344    8
## 17:           pima   classif   768    9
## 18:         precip      dens    70    1
## 19:           rats      surv   300    5
## 20:          sonar   classif   208   61
## 21:           spam   classif  4601   58
## 22:        titanic   classif  1309   11
## 23:   unemployment      surv  3343    6
## 24:      usarrests     clust    50    4
## 25:           whas      surv   481   11
## 26:           wine   classif   178   14
## 27:            zoo   classif   101   17
##                key task_type  nrow ncol

支持非常多探索數(shù)據(jù)的操作:

task_penguin$ncol
## [1] 8
task_penguin$nrow
## [1] 344
task_penguin$feature_names
## [1] "bill_depth"     "bill_length"    "body_mass"      "flipper_length"
## [5] "island"         "sex"            "year"
task_penguin$feature_types
##                id    type
## 1:     bill_depth numeric
## 2:    bill_length numeric
## 3:      body_mass integer
## 4: flipper_length integer
## 5:         island  factor
## 6:            sex  factor
## 7:           year integer
task_penguin$target_names
## [1] "species"
task_penguin$task_type
## [1] "classif"
task_penguin$data()
##        species bill_depth bill_length body_mass flipper_length    island    sex
##   1:    Adelie       18.7        39.1      3750            181 Torgersen   male
##   2:    Adelie       17.4        39.5      3800            186 Torgersen female
##   3:    Adelie       18.0        40.3      3250            195 Torgersen female
##   4:    Adelie         NA          NA        NA             NA Torgersen   <NA>
##   5:    Adelie       19.3        36.7      3450            193 Torgersen female
##  ---                                                                           
## 340: Chinstrap       19.8        55.8      4000            207     Dream   male
## 341: Chinstrap       18.1        43.5      3400            202     Dream female
## 342: Chinstrap       18.2        49.6      3775            193     Dream   male
## 343: Chinstrap       19.0        50.8      4100            210     Dream   male
## 344: Chinstrap       18.7        50.2      3775            198     Dream female
##      year
##   1: 2007
##   2: 2007
##   3: 2007
##   4: 2007
##   5: 2007
##  ---     
## 340: 2009
## 341: 2009
## 342: 2009
## 343: 2009
## 344: 2009
task_penguin$head(3)
##    species bill_depth bill_length body_mass flipper_length    island    sex
## 1:  Adelie       18.7        39.1      3750            181 Torgersen   male
## 2:  Adelie       17.4        39.5      3800            186 Torgersen female
## 3:  Adelie       18.0        40.3      3250            195 Torgersen female
##    year
## 1: 2007
## 2: 2007
## 3: 2007
# 還有很多行列選擇操作、改變變量的id(比如某個變量不參與模型訓(xùn)練)等多種操作

可視化數(shù)據(jù):很多都是基于GGally包蜕提,可以看我之前的介紹

autoplot(task_penguin)
image.png
autoplot(task_penguin, type = "pairs")
image.png

創(chuàng)建learner

所有的學(xué)習(xí)器都通過以下2個步驟工作:


image.png

mlr3verse只支持常見的學(xué)習(xí)器森书,比如隨機(jī)森林、決策樹、SVM凛膏、KNN等杨名,如果想要查看所有的學(xué)習(xí)器,可以安裝mlr3extralearners猖毫。

查看所有的支持的learner: All learners

# 加載R包台谍,常見的算法
library("mlr3verse")
mlr_learners
## <DictionaryLearner> with 53 stored values
## Keys: classif.cv_glmnet, classif.debug, classif.featureless,
##   classif.glmnet, classif.kknn, classif.lda, classif.log_reg,
##   classif.multinom, classif.naive_bayes, classif.nnet, classif.qda,
##   classif.ranger, classif.rpart, classif.svm, classif.xgboost,
##   clust.agnes, clust.ap, clust.cmeans, clust.cobweb, clust.dbscan,
##   clust.diana, clust.em, clust.fanny, clust.featureless, clust.ff,
##   clust.hclust, clust.kkmeans, clust.kmeans, clust.MBatchKMeans,
##   clust.meanshift, clust.pam, clust.SimpleKMeans, clust.xmeans,
##   dens.hist, dens.kde, regr.cv_glmnet, regr.debug, regr.featureless,
##   regr.glmnet, regr.kknn, regr.km, regr.lm, regr.ranger, regr.rpart,
##   regr.svm, regr.xgboost, surv.coxph, surv.cv_glmnet, surv.glmnet,
##   surv.kaplan, surv.ranger, surv.rpart, surv.xgboost

創(chuàng)建learner

# 決策樹
learner = lrn("classif.rpart")
print(learner)
## <LearnerClassifRpart:classif.rpart>
## * Model: -
## * Parameters: xval=0
## * Packages: mlr3, rpart
## * Predict Type: response
## * Feature types: logical, integer, numeric, factor, ordered
## * Properties: importance, missings, multiclass, selected_features,
##   twoclass, weights

查看支持的超參數(shù)

learner$param_set
## <ParamSet>
##                 id    class lower upper nlevels        default value
##  1:             cp ParamDbl     0     1     Inf           0.01      
##  2:     keep_model ParamLgl    NA    NA       2          FALSE      
##  3:     maxcompete ParamInt     0   Inf     Inf              4      
##  4:       maxdepth ParamInt     1    30      30             30      
##  5:   maxsurrogate ParamInt     0   Inf     Inf              5      
##  6:      minbucket ParamInt     1   Inf     Inf <NoDefault[3]>      
##  7:       minsplit ParamInt     1   Inf     Inf             20      
##  8: surrogatestyle ParamInt     0     1       2              0      
##  9:   usesurrogate ParamInt     0     2       3              2      
## 10:           xval ParamInt     0   Inf     Inf             10     0

一目了然,方便使用吁断,記不住了可以看看趁蕊,畢竟太多了,這一點比tidymodels貼心仔役。

設(shè)定超參數(shù)的值

learner$param_set$values = list(cp = 0.01, xval = 0)
learner
## <LearnerClassifRpart:classif.rpart>
## * Model: -
## * Parameters: cp=0.01, xval=0
## * Packages: mlr3, rpart
## * Predict Type: response
## * Feature types: logical, integer, numeric, factor, ordered
## * Properties: importance, missings, multiclass, selected_features,
##   twoclass, weights

也可以在指定learner時設(shè)定

learner = lrn("classif.rpart", xval=0, cp = 0.001)
learner$param_set$values
## $xval
## [1] 0
## 
## $cp
## [1] 0.001

訓(xùn)練掷伙、預(yù)測和性能評價

創(chuàng)建任務(wù),選擇模型

library("mlr3verse")

task = tsk("penguins") # 使用內(nèi)置數(shù)據(jù)集
learner = lrn("classif.rpart") #決策樹分類

劃分訓(xùn)練集和測試集

spilt <- partition(task,ratio = 0.6, stratify = T)
spilt$train
##   [1]   2   3   4   5   7   8  10  11  12  14  15  16  17  19  23  25  26  27
##  [19]  28  30  31  33  34  36  37  40  42  45  46  48  50  51  53  56  59  60
##  [37]  61  62  64  66  67  68  69  71  73  75  78  82  83  84  88  89  91  94
##  [55]  96  97  99 100 101 102 104 107 108 113 114 115 118 120 121 123 125 126
##  [73] 127 128 129 130 131 132 133 135 136 137 138 139 142 143 145 149 150 151
##  [91] 152 154 156 157 159 160 163 169 170 171 172 173 175 176 179 180 181 182
## [109] 183 186 187 188 189 193 194 197 199 200 201 203 206 208 210 211 212 213
## [127] 214 215 216 218 219 220 222 223 224 225 226 228 229 230 233 236 237 239
## [145] 240 241 242 243 247 248 249 252 253 254 255 256 257 259 260 262 266 271
## [163] 272 273 274 277 279 280 285 288 290 291 293 294 295 296 297 299 300 301
## [181] 302 304 305 306 309 310 312 313 317 319 321 322 323 324 325 328 330 331
## [199] 332 334 337 338 339 340 341 342

訓(xùn)練模型

learner$train(task, row_ids = spilt$train)
print(learner$model)
## n= 206 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
## 1) root 206 115 Adelie (0.44174757 0.19902913 0.35922330)  
##   2) flipper_length< 207.5 128  39 Adelie (0.69531250 0.30468750 0.00000000)  
##     4) bill_length< 42.35 86   0 Adelie (1.00000000 0.00000000 0.00000000) *
##     5) bill_length>=42.35 42   3 Chinstrap (0.07142857 0.92857143 0.00000000) *
##   3) flipper_length>=207.5 78   4 Gentoo (0.02564103 0.02564103 0.94871795) *

預(yù)測

prediction <- learner$predict(task, row_ids = spilt$test)
print(prediction)
## <PredictionClassif> for 138 observations:
##     row_ids     truth  response
##           1    Adelie    Adelie
##           6    Adelie    Adelie
##           9    Adelie    Adelie
## ---                            
##         336 Chinstrap Chinstrap
##         343 Chinstrap    Gentoo
##         344 Chinstrap Chinstrap

混淆矩陣

prediction$confusion
##            truth
## response    Adelie Chinstrap Gentoo
##   Adelie        53         1      0
##   Chinstrap      8        24      2
##   Gentoo         0         2     48

可視化

autoplot(prediction)
image.png

模型評價

先查看下支持的評價指標(biāo)

mlr_measures
## <DictionaryMeasure> with 87 stored values
## Keys: aic, bic, classif.acc, classif.auc, classif.bacc, classif.bbrier,
##   classif.ce, classif.costs, classif.dor, classif.fbeta, classif.fdr,
##   classif.fn, classif.fnr, classif.fomr, classif.fp, classif.fpr,
##   classif.logloss, classif.mbrier, classif.mcc, classif.npv,
##   classif.ppv, classif.prauc, classif.precision, classif.recall,
##   classif.sensitivity, classif.specificity, classif.tn, classif.tnr,
##   classif.tp, classif.tpr, clust.ch, clust.db, clust.dunn,
##   clust.silhouette, clust.wss, debug, dens.logloss, oob_error,
##   regr.bias, regr.ktau, regr.mae, regr.mape, regr.maxae, regr.medae,
##   regr.medse, regr.mse, regr.msle, regr.pbias, regr.rae, regr.rmse,
##   regr.rmsle, regr.rrse, regr.rse, regr.rsq, regr.sae, regr.smape,
##   regr.srho, regr.sse, selected_features, sim.jaccard, sim.phi,
##   surv.brier, surv.calib_alpha, surv.calib_beta, surv.chambless_auc,
##   surv.cindex, surv.dcalib, surv.graf, surv.hung_auc, surv.intlogloss,
##   surv.logloss, surv.mae, surv.mse, surv.nagelk_r2, surv.oquigley_r2,
##   surv.rmse, surv.schmid, surv.song_auc, surv.song_tnr, surv.song_tpr,
##   surv.uno_auc, surv.uno_tnr, surv.uno_tpr, surv.xu_r2, time_both,
##   time_predict, time_train

這里我們選擇accuracy

measure <- msr("classif.acc")
prediction$score(measure)
## classif.acc 
##   0.9057971

選擇多個指標(biāo):

measures <- msrs(c("classif.acc","classif.auc","classif.ce"))
prediction$score(measures)
## classif.acc classif.auc  classif.ce 
##   0.9057971         NaN   0.0942029

對于簡單的機(jī)器學(xué)習(xí)任務(wù)來說又兵,mlr3真的是太方便了炎咖!4行代碼即可搞定一個基本的流程!

本文首發(fā)于公眾號:醫(yī)學(xué)和生信筆記

醫(yī)學(xué)和生信筆記寒波,專注R語言在臨床醫(yī)學(xué)中的使用乘盼,R語言數(shù)據(jù)分析和可視化。主要分享R語言做醫(yī)學(xué)統(tǒng)計學(xué)俄烁、meta分析绸栅、網(wǎng)絡(luò)藥理學(xué)、臨床預(yù)測模型页屠、機(jī)器學(xué)習(xí)粹胯、生物信息學(xué)等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辰企,一起剝皮案震驚了整個濱河市风纠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牢贸,老刑警劉巖竹观,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潜索,居然都是意外死亡臭增,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門竹习,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誊抛,“玉大人,你說我怎么就攤上這事整陌∞智裕” “怎么了瞎领?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長随夸。 經(jīng)常有香客問我九默,道長,這世上最難降的妖魔是什么逃魄? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任荤西,我火速辦了婚禮澜搅,結(jié)果婚禮上伍俘,老公的妹妹穿的比我還像新娘。我一直安慰自己勉躺,他們只是感情好癌瘾,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饵溅,像睡著了一般妨退。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜕企,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天咬荷,我揣著相機(jī)與錄音,去河邊找鬼轻掩。 笑死幸乒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唇牧。 我是一名探鬼主播罕扎,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丐重!你這毒婦竟也來了腔召?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扮惦,失蹤者是張志新(化名)和其女友劉穎臀蛛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崖蜜,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掺栅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纳猪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氧卧。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氏堤,靈堂內(nèi)的尸體忽然破棺而出沙绝,到底是詐尸還是另有隱情搏明,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布闪檬,位于F島的核電站星著,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粗悯。R本人自食惡果不足惜虚循,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望样傍。 院中可真熱鬧横缔,春花似錦、人聲如沸衫哥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撤逢。三九已至膛锭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚊荣,已是汗流浹背初狰。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留互例,地道東北人奢入。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像敲霍,于是被迫代替她去往敵國和親俊马。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容