【R機器學習:mlr3verse技術手冊】1 基礎知識
0 前言
曾經:
R
中各個機器學習算法,都是單獨的包實現,沒有統一接口,不方便使用過去:整合機器學習算法的包:
-?mlr
包
-?caret
包
現在:新一代整合機器學習算法的包,也是上面兩個的進化版:
-?mlr3verse
包(首推):面向對象
-?tidymodels
包:tidyverse
一脈相承
- 模型(工業(yè))部署:vetiver
包、plumber
包
mlr3verse
是最新、最先進的R
機器學習框架,它基于面向對象R6
語法和?data.table
底層數據流(速度超快),支持future
并行,支持搭建“圖”流學習器,理念非常先進、功能非常強大。
mlr3verse
整合了各種機器學習算法包,實現了統一、整潔的機器學習流程化操作,足以媲美Python
的scikit-learn
機器學習庫。

加載包:
幾點技術說明:
使用幫助:
?對象名字
,比如?ResampleResult
,或對象的$help()
方法,比如?learner$help()
一些對象結果并不是數據框,
as.data.table()
轉化為數據框再使用;學習器超參數的幫助,需要找到原包算法的函數幫助。
1 基礎知識
1.1 R6類:面向對象
R6
類,R
新一代面向對象語法:真正面向對象,支持繼承、引用語法。
將數據、方法綁定到一個對象,例如學習器對象:

訪問屬性:
Learner$param_set
調用方法:
Learner$train()
1.2 任務:封裝數據
任務是對表格數據的封裝,自變量稱為特征,因變量稱為目標或結果變量。
目標決定了機器學習的“任務”:
- 連續(xù)目標,就是回歸;
- 離散目標,就是分類;
- 無目標,無監(jiān)督學習(聚類、降維)
mlr3
生態(tài)下還有若干特殊任務:生存分析任務、密度估計任務、時空分析任務、有序分析任務、函數分析任務、多標簽分類任務、成本敏感分類任務、聚類任務。
創(chuàng)建任務:


屬性:$nrow, $ncol, $row_roles
($use, $holdout, $early_stopping
),?$col_roles
($feature, $target
, …),?$feature_names
(用于模型的特征), ……
方法:$data(), $set_row_roles(), $set_col_roles(), $filter()
(選擇行),?$select()
(選擇特征), ……
獲取幫助:?Task
示例:

劃分訓練集、測試集:
得到訓練集、測試集的索引(行號),分別在split$train、split$test
中。
1.3 學習器:封裝算法

機器學習有很多種算法,如決策樹、支持向量機等,往往來自不同的包,函數接口各異,不易于統一學習和使用。
mlr3
將算法封裝在學習器中,提供了統一的方便接口,算法實現整合自相應的算法包(需要安裝)。

獲取幫助:?Learner
更多的學習器,可安裝mlr3extralearners
包。

學習器$model
屬性為NULL
,用$train()
方法在訓練數據上訓練模型,模型結果將存入$model
(可取用,一般與原包函數返回值一致),再用$predict()
方法在測試數據上做預測,得到結果是Prediction
對象。


1.4 性能評估
訓練集上訓練好的模型性能如何,需要這樣來檢驗:
將模型用到測試集(不能與訓練集有交集,否則會有數據泄露)得到預測值;
選擇一種合適的性能度量指標,來度量預測值與真實值相差多少。

獲取幫助:?Measure
有二/多分類度量、回歸度量、聚類度量等,選擇一種性能度量指標,比如準確率,用預測對象的$score()
方法,計算該度量指標的得分:



1.5 重抽樣
重抽樣就是對數據集重復抽樣,得到數據集的若干副本。
機器學習傳統的數據劃分:訓練集+測試集,就是對數據的一種重抽樣:留出法("holdout")。
留出法最簡單,只得到了數據集的一個副本,所以只能做一次“擬合模型+模型預測+評估性能”。
一次考試就決定最終成績,存在偶然性顯然是不夠科學的,因此有必要從數據集抽樣出多個副本,以做多次“擬合模型+模型預測+評估性能”,取平均性能作為最終成績。
k 折交叉驗證("cv"),就是這種重抽樣的代表:

10 折交叉驗證是將數據集隨機分成 10 份,分別以其中 1 份為測試集,其余 9 份為訓練集,組成 10 組數據:訓練 10 個模型+做 10 次模型預測+評估 10 次模型性能,取平均作為最終模型性能。
k 折交叉驗證,還可以重復做 m 次(?m×k?個副本),叫做重復 k 折交叉驗證("repeated_cv")。
Bootstrap(自助)重抽樣(多用于統計學習中計算統計量),是從包含?n?個觀測的原數據集隨機可重復抽樣?n?個觀測,得到分析數據是有重復的,未被抽取到的觀測作為評估數據,也稱為“袋外”(out-of-bag)樣本。

除了上面介紹過的之外,還有:
留一交叉驗證("loo")
子抽樣("subsampling")
樣本內抽樣("insample")
自定義抽樣("custom")
自定義交叉驗證抽樣("custom_cv")
獲取幫助:?Resampling
(1) 調試用:查看重抽樣的效果
提供任務給重抽樣對象的$instantiate()
方法,則實例化重抽樣對象:
可以查看:



(2) 使用重抽樣
重抽樣是創(chuàng)建了若干個數據副本,使用它們就是分別在每個數據副本上:“擬合模型+模型預測+評估性能”,我們關心的是這些評估性能的平均性能。當然若有需要,每個數據副本上的模型和性能結果都可以保存和取用。
用resample()
函數來實現,需要提供任務、學習器、重抽樣方法,若要保存每個數據副本上的模型和性能結果,需設置參數store_models = TRUE
:
返回ResampleResult
對象已包含所有結果,有專門方法訪問和取用:





1.6 基準測試
機器學習中有一個常見的場景是,比較多個機器學習算法的性能。這在mlr3verse
框架下,叫做基準測試。
基準測試(benchmark
),用來比較不同學習器(算法)、在多個任務(數據)和/或不同重抽樣策略(多個數據副本)上的平均性能表現。
基準測試時有一個關鍵問題是,測試的公平性,即每個算法的每次測試必須在相同的重抽樣訓練集擬合模型,在相同的重抽樣測試集評估性能。這些事情benchmark()
?函數會自動幫你做好。
首先,需要用benchmark_grid()
創(chuàng)建一個基準測試的"設計",即你想執(zhí)行的設置表,是多個任務、學習器、重抽樣的所有唯一值組合。
舉例來看:
選取一個自帶的二分類任務
選取多個學習器:決策樹、
KNN
、隨機森林、支持向量機(因為要計算AUC
值,預測類型需要改為?"prob"
)創(chuàng)建基準測試“設計”(每個學習器不能只憑一次結果,采用5折交叉驗證的平均結果)
查看性能指標:準確率、
AUC
值箱線圖展示
AUC
值的對比結果

將上述基準"設計"交給benchmark()
,即執(zhí)行基準測試:



參考文獻
Marc Becker et al. mlr3book. 2022.

我正在寫一本《R機器學習:基于mlr3verse》的書,其中的mlr3verse
技術篇草稿,歡迎您的閱讀品鑒和轉發(fā)擴散(但禁止用于任何出版)!
想提前學習本書內容,也可以關注我的?2023年寒假“R機器學習(基于mlr3verse)”培訓班,邀請函鏈接:提取碼:xxul
https://pan.baidu.com/s/1_SaYPebqhnXoxDT8W9tjJA?pwd=xxul
另外,我在第15屆中國R會上做的報告,相當于是?mlr3verse
技術手冊?的整體略講:
張敬信 第15屆R會報告-R機器學習:mlr3verse核心工作流https://www.zhihu.com/zvideo/1579758441576534016
講座 PPT?以及?R機器學習:mlr3verse技術手冊,可到我的 Gitee/Github下載:
https://gitee.com/zhjx19/rconf15
https://github.com/zhjx19/RConf15