強大的機器學習專屬R包——mlr包

文前摘要

  • mlr包簡介

  • 運用mlr包實現美國不同收入人群數據特徵選擇

  • 運用mlr包實現美國不同收入人群分類預測

  • 相似機器學習CARET、DMwR包與MLR包比較

mlr包介紹

一直以來R都以自詡數據分析和統計建模見長,然而一直以來對機器學習中的演算法都是各個種類的包「佔山為王」,以擅長某類具體機器學習演算法遊行天下,比如運用e1071包實現貝葉斯及SVM演算法,運用rpart包實現決策樹演算法等等。而這就帶來一個無法避免的問題:需要數據俠們記住每一種演算法對應的R包,顯然這增加了對R的學習成本。同時R粉也會無比羨慕python粉,只需要一個sklearn庫就可以幾乎解決機器學習演算法所有涉及內容。但是這一切都因為mlr包的到來而悄然改變。

mlr包提供了一個一般化、清洗易用涵蓋分類、回歸、生存分析、聚類等功能的可擴展機器學習工作框架。它也提供了一個對於160多個基礎學習包的統一介面,包括了「元演算法」和模型選擇技術,並擴展了基本學習演算法的功能,比如超參數調參、特徵選擇、集成結構等。同時並行化計算也是其天然支持的一項技能。(引用於mlr:Machine Learning in R)。 看到這樣的介紹是否眼前一亮,對的,mlr包似乎有想一統江湖味道,那麼這個包如何使用,有哪些優點呢,咱們通過一個案例先來一睹為快。

mlr包基本思想

mlr包對待各種學習演算法和模型實現,有個基本的思路即:Create a Task,Make a learner,Train then.所有所有的分析都以此為基礎進行構建。

以美國不同收入人群數據為例,目的是對收集好的30萬美國人群基本資料,預測人群是否為高收入人群(>50000美元).

讀取數據和查看

我們讀取了美國人群數據,train數據集199523*41,test數據集99762*41.

通過mlr包中的summarizeColumns()及sumizeLEVELS()函數可以對數據集進行查看,可以直接瀏覽所有變數的缺失值、均值、極值等基本信息和因子水平情況等,如下圖:

summarizeColumns(train)summarizeColumns(train)[, "nlevs"]summarizeLevels(train)$income_levelunique(train$income_level)

特徵工程

mlr包進行特徵工程,如對變數重要性排序等操作,首先是通過makeClassifTask()創建一個用於分類的Task,其他回歸等目的有相應的創建函數。通過removeConstantFeatures()函數丟棄零變數,generateFilterValuesData()函數可選擇相應的method進行特徵重要性排序(這裡運用信息增益衡量),並可繪圖實現。

# 合併數據集train <- cbind(num_train, cat_train)test <- cbind(num_test, cat_train)# 創建tasktrain.task <- makeClassifTask(data = train, target = "income_level")test.task <- makeClassifTask(data = test, target = "income_level")# 丟棄零變數train.task <- removeConstantFeatures(train.task)test.task <- removeConstantFeatures(test.task)# #變數重要性排序var_imp <- generateFilterValuesData(train.task, method = "information.gain")var_imp <- generateFilterValuesData(train.task, method = c("information.gain"))plotFilterValues(var_imp, feat.type.cols = TRUE)

選擇演算法

進行完特徵工程等數據清洗工作,我們就開始建模的過程,在建立模型之前,如何快速選擇合適的學習演算法又是重中之重,那麼mlr給出了非常人性的方法。通過listLearners()可以查看所有涉及到的演算法以及相應的數據要求,可見下圖:

a <- listLearners("classif")head(a, 10)# 指定條件,選擇適用的演算法listLearners("classif", "twoclass")[c("class", "package")]

樸素貝葉斯

我們可以以貝葉斯演算法為例,運用mlr包實現機器學習演算法的構建。根據「Create a Task,Make a learner,Train」原則,在前面已經完成分類Task任務之後,我們通過makeLearner()函數構建貝葉斯模型。同時通過makeResampleDesc()進行交叉驗證.模型構建完成後,就可以通過trainLearner()函數和predict()函數實現訓練和預測功能了。最終模型結果F score為0.819

naive_learner <- makeLearner("classif.naiveBayes", predict.type = "response")naive_learner$par.vals <- list(laplace = 1)# 3folds交叉驗證folds <- makeResampleDesc("CV", iters = 3, stratify = TRUE)# 交叉驗證函數fun_cv <- function(a) { crv_val <- resample(naive_learner, a, resampling = folds, measures = list(acc, tpr, tnr, fpr, fp, fn)) crv_val$aggr}fun_cv(train.task)# 訓練和預測nB_models <- mlr::train(naive_learner, train.over)nB_model <- trainLearner(naive_learner, train.over)nB_predict <- predict(nB_models, test.task)# 模型評估nB_prediction <- nB_predict$data$response# 混淆矩陣dCM <- confusionMatrix(test$income_level, nB_prediction)# F值precision <- dCM$byClass["Pos Pred Value"]recall <- dCM$byClass["Sensitivity"]f_measure <- 2 * ((precision * recall)/(precision + recall))f_measure

相似機器學習CARET、DMwR包與MLR包比較

這是個最常見的整個機器學習的過程,而所有過程均在mlr包框架語法下實現。是不是很神奇呢。那麼再來簡單看看與CARET、DMwR包等相似機器學習演算法集成包比較,mlr有什麼優點呢!

Caret包(Kuhn,2008),DMwR(Torgo,2010)僅支持分類和回歸,CMA(Slawski et al., 2008)僅支持分類。相對功能都比較局限。MLR包的通用包裝器機制是前面所有包所不具備的。雖然Caret包和CMA包融入了數據預處理和變數選擇方法,但是MLR可以無縫同時用這些方法進行調節(Koch et al., 2012)。僅僅MLR和RMINER和CMA包支持nested cross-validation。也只有MLR包和Caret包支持內生的bagging和並行計算。

(引用於mlr:Machine Learning in R)。 綜上所示,mlr是運用R實現機器學習演算法必備的瑞士軍刀。如想了解更多,可具體可參考<mlr-org/mlr>

------------------------------------------

作者:余文華

專欄:樂享數據DataScientists的博客專欄

公眾號:樂享數據DataScientists

大家也可以加小編微信:tsbeidou (備註:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流


推薦閱讀:

Boosting

TAG:R编程语言 | 机器学习 | |