R機(jī)器學(xué)習(xí)的Tidymodel流水線編程

Tidymodels: tidy machine learning in R

在處理數(shù)據(jù)時(shí)蛤高,有簡(jiǎn)潔的工具包,tidyverse應(yīng)運(yùn)而生,極大地簡(jiǎn)化數(shù)據(jù)處理流程钓株,讓數(shù)據(jù)處理變得簡(jiǎn)潔,清晰陌僵。
但是在處理完數(shù)據(jù)后轴合,需要對(duì)數(shù)據(jù)進(jìn)行建模分析,預(yù)測(cè)與擬合碗短,這個(gè)過(guò)程隨著模型的不同而變的多元化受葛,尤其是機(jī)器學(xué)習(xí)應(yīng)用。加速了模型構(gòu)建的流程化與簡(jiǎn)潔化豪椿。
Caret的出現(xiàn)奔坟,讓此項(xiàng)工作變得簡(jiǎn)潔明了。但是還是有些缺點(diǎn)搭盾。


image.png

上圖基于Wickham和Grolemund撰寫(xiě)的《 R for Data Science》一書(shū)咳秉。
本文中的版本詳細(xì)解釋了tidymodels每個(gè)程序包涵蓋的步驟。在模型構(gòu)建及預(yù)測(cè)過(guò)程中鸯隅,tidymodels的流暢與簡(jiǎn)潔澜建,讓你體驗(yàn)縱享絲滑般的感受。

在模型構(gòu)建過(guò)程中蝌以,需要涉及的數(shù)據(jù)預(yù)處理及模型參數(shù)調(diào)整炕舵,這些步驟都含括在以下程序包中:

  • rsample - 數(shù)據(jù)分離重采樣
  • recipes - 數(shù)據(jù)轉(zhuǎn)換處理
  • parnip - 模型構(gòu)建框架
  • yardstick - 模型效果評(píng)估

下圖說(shuō)明了tidymodels建模步驟:


image.png

數(shù)據(jù)iris

下面我們將通過(guò)iris數(shù)據(jù)來(lái)舉例說(shuō)明。
首先跟畅,我們將iris數(shù)據(jù)分成訓(xùn)練和測(cè)試集咽筋,通過(guò)initial_split()函數(shù)實(shí)現(xiàn)數(shù)據(jù)拆分,可以根據(jù)prop參數(shù)徊件,指定分離比例奸攻。分離數(shù)據(jù)后,我們可以通過(guò)training() 與testing() 函數(shù)虱痕,獲取訓(xùn)練集和測(cè)試集的數(shù)據(jù)睹耐。

library(tidymodels)

# split
iris_split <- initial_split(iris, prop = 0.6)
iris_split

# get training data
iris_split %>%
  training() %>%
  glimpse()

## Observations: 90
## Variables: 5
## $ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.9, 5.4, 4…
## $ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 3.1, 3.7, 3…
## $ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.5, 1.5, 1…
## $ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.1, 0.2, 0…
## $ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, set…

數(shù)據(jù)預(yù)處理

recipes 包提供了多種函數(shù),可以對(duì)數(shù)據(jù)進(jìn)行預(yù)處理部翘。包括數(shù)據(jù)的標(biāo)準(zhǔn)化硝训,數(shù)據(jù)的相關(guān)性重復(fù),變成亞分類變量等。

  • step_corr() - 消除相關(guān)性較高的影響
  • step_center() - 以0為中心標(biāo)準(zhǔn)化
  • step_scale() - 以1為中心標(biāo)準(zhǔn)化

recipe還有一個(gè)好處就是窖梁,在指定數(shù)據(jù)處理時(shí)赘风,可以用all_predictors()來(lái)指定對(duì)所有協(xié)變量進(jìn)行歸一化。然后all_outcomes()可以指定y窄绒。
可以打印recipe的詳細(xì)信息贝次。里面記錄了驟刪除了Petal.Length變量。

在處理完train數(shù)據(jù)后彰导,test數(shù)據(jù)可以用bake函數(shù)進(jìn)行相似的處理蛔翅。然后輸出為dataframe。train數(shù)據(jù)從iris_recipe輸出為dataframe位谋,可以用juice()山析。

# train data
iris_recipe <- training(iris_split) %>%
  recipe(Species ~.) %>%
  step_corr(all_predictors()) %>%
  step_center(all_predictors(), -all_outcomes()) %>%
  step_scale(all_predictors(), -all_outcomes()) %>%
  prep()
  
iris_recipe
## Data Recipe
## 
## Inputs:
## 
##       role #variables
##    outcome          1
##  predictor          4
## 
## Training data contained 90 data points and no missing data.
## 
## Operations:
## 
## Correlation filter removed Petal.Length [trained]
## Centering for Sepal.Length, Sepal.Width, Petal.Width [trained]
## Scaling for Sepal.Length, Sepal.Width, Petal.Width [trained]

# test data
iris_testing <- iris_recipe %>%
  bake(testing(iris_split)) 

glimpse(iris_testing)
## Observations: 60
## Variables: 4
## $ Sepal.Length <dbl> -1.597601746, -1.138960096, 0.007644027, -0.7949788…
## $ Sepal.Width  <dbl> -0.41010139, 0.71517681, 2.06551064, 1.61539936, 0.…
## $ Petal.Width  <dbl> -1.2085003, -1.2085003, -1.2085003, -1.0796318, -1.…
## $ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, set…

數(shù)據(jù)建模

在R里面,有很多關(guān)于機(jī)器學(xué)習(xí)的包掏父,ranger笋轨,randomForest都有針對(duì)各自包的定義的參數(shù)及說(shuō)明,很不方便赊淑,沒(méi)有統(tǒng)一標(biāo)準(zhǔn)爵政。
tidymodels的出現(xiàn),將這些機(jī)器學(xué)習(xí)的包整合到一在接口陶缺,而不是重新開(kāi)發(fā)機(jī)器學(xué)習(xí)的包钾挟。更準(zhǔn)確的說(shuō),tidymodels提供了一組用于定義模型的函數(shù)和參數(shù)饱岸。然后根據(jù)請(qǐng)求的建模包對(duì)模型進(jìn)行擬合掺出。
現(xiàn)在我們準(zhǔn)備根據(jù)我們的數(shù)據(jù),建一個(gè)隨機(jī)森林模型苫费。rand_forest()函數(shù)來(lái)定義汤锨,我們的模型然后mode參數(shù)定義分類還是回歸問(wèn)題。mode = "classification"因?yàn)楸狙芯渴欠诸悊?wèn)題百框。trees可以設(shè)定節(jié)點(diǎn)的數(shù)闲礼。然后set_engine()很重要,可以指定我們運(yùn)行的模型的引擎铐维,可以是glm柬泽、rf等。然后用fit()函數(shù)方椎,加載我們要擬合的數(shù)據(jù)聂抢。

# ranger
iris_ranger <- rand_forest(trees = 100, mode = "classification") %>%
  set_engine("ranger") %>%
  fit(Species ~ ., data = iris_training)

# randomForest
iris_rf <-  rand_forest(trees = 100, mode = "classification") %>%
  set_engine("randomForest") %>%
  fit(Species ~ ., data = iris_training)

總的來(lái)說(shuō)钧嘶,模型構(gòu)建的步驟分為三部棠众,選定模型, set_engine 然后 fit數(shù)據(jù)。流水線式操作闸拿。

預(yù)測(cè)

針對(duì)arsnip的predict()函數(shù)空盼,可以返回tibble數(shù)據(jù)格式。默認(rèn)情況下新荤,預(yù)測(cè)變量稱為.pred_class揽趾。在示例中,test的數(shù)據(jù)是bake以后的--數(shù)據(jù)預(yù)處理后的testing data苛骨。然后我們將其合并入test數(shù)據(jù)集中篱瞎。

predict(iris_ranger, iris_testing)

iris_ranger %>%
  predict(iris_testing) %>%
  bind_cols(iris_testing)
 
iris_ranger

## Observations: 60
## Variables: 5
## $ .pred_class  <fct> setosa, setosa, setosa, setosa, setosa, setosa, set…
## $ Sepal.Length <dbl> -1.597601746, -1.138960096, 0.007644027, -0.7949788…
## $ Sepal.Width  <dbl> -0.41010139, 0.71517681, 2.06551064, 1.61539936, 0.…
## $ Petal.Width  <dbl> -1.2085003, -1.2085003, -1.2085003, -1.0796318, -1.…
## $ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, set…


iris_ranger %>%
  predict(iris_testing, type = "prob") %>%
  glimpse()
  
## Observations: 60
## Variables: 3
## $ .pred_setosa     <dbl> 0.677480159, 0.978293651, 0.783250000, 0.983972…
## $ .pred_versicolor <dbl> 0.295507937, 0.011706349, 0.150833333, 0.001111…
## $ .pred_virginica  <dbl> 0.02701190, 0.01000000, 0.06591667, 0.01491667,…

該模型預(yù)測(cè)的結(jié)果為分類變量,當(dāng)然有時(shí)候會(huì)根據(jù)需要痒芝,預(yù)測(cè)每個(gè)類別的概率俐筋,所以可以通過(guò)predict函數(shù)中的 type參數(shù)來(lái)輸出為概率。

模型評(píng)估

使用metrics()函數(shù)來(lái)衡量模型的性能严衬。它將自動(dòng)選擇適合給定模型類型的指標(biāo)澄者。
該函數(shù)需要一個(gè)包含實(shí)際結(jié)果(真相)和模型預(yù)測(cè)值(估計(jì)值)的tibble數(shù)據(jù)。

iris_ranger %>%
  predict(iris_testing) %>%
  bind_cols(iris_testing) %>%
  metrics(truth = Species, estimate = .pred_class)

  
## # A tibble: 2 x 3
##   .metric  .estimator .estimate
##   <chr>    <chr>          <dbl>
## 1 accuracy multiclass     0.917
## 2 kap      multiclass     0.874

iris_rf %>%
  predict(iris_testing) %>%
  bind_cols(iris_testing) %>%
  metrics(truth = Species, estimate = .pred_class)
  
## # A tibble: 2 x 3
##   .metric  .estimator .estimate
##   <chr>    <chr>          <dbl>
## 1 accuracy multiclass     0.883
## 2 kap      multiclass     0.824

繪制分類結(jié)果的圖

iris_probs%>%
  gain_curve(Species, .pred_setosa:.pred_virginica) %>%
  autoplot()

iris_probs%>%
  roc_curve(Species, .pred_setosa:.pred_virginica) %>%
  autoplot()

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末请琳,一起剝皮案震驚了整個(gè)濱河市粱挡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俄精,老刑警劉巖询筏,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嘀倒,居然都是意外死亡屈留,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門测蘑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灌危,“玉大人,你說(shuō)我怎么就攤上這事碳胳∮买” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵挨约,是天一觀的道長(zhǎng)味混。 經(jīng)常有香客問(wèn)我,道長(zhǎng)诫惭,這世上最難降的妖魔是什么翁锡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮夕土,結(jié)果婚禮上馆衔,老公的妹妹穿的比我還像新娘瘟判。我一直安慰自己,他們只是感情好角溃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布拷获。 她就那樣靜靜地躺著,像睡著了一般减细。 火紅的嫁衣襯著肌膚如雪匆瓜。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天未蝌,我揣著相機(jī)與錄音驮吱,去河邊找鬼。 笑死萧吠,一個(gè)胖子當(dāng)著我的面吹牛糠馆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怎憋,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼又碌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绊袋?” 一聲冷哼從身側(cè)響起毕匀,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎癌别,沒(méi)想到半個(gè)月后皂岔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡展姐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年躁垛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圾笨。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盗舰,死狀恐怖钝满,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤尸曼,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布替蔬,位于F島的核電站坯辩,受9級(jí)特大地震影響覆履,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俭令,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一后德、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抄腔,春花似錦瓢湃、人聲如沸窟赏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至棍掐,卻和暖如春藏雏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背作煌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工掘殴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粟誓。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓奏寨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鹰服。 傳聞我的和親對(duì)象是個(gè)殘疾皇子病瞳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345