强大的机器学习专属R包——mlr包

浏览: 2712

文前摘要

  • 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_level
unique(train$income_level)

image.png

特征工程

   mlr包进行特征工程,如对变量重要性排序等操作,首先是通过makeClassifTask()创建一个用于分类的Task,其他回归等目的有相应的创建函数。通过removeConstantFeatures()函数丢弃零变量,generateFilterValuesData()函数可选择相应的method进行特征重要性排序(这里运用信息增益衡量),并可绘图实现。

# 合并数据集
train <- cbind(num_train, cat_train)
test <- cbind(num_test, cat_train)
# 创建task
train.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)

image.png

选择算法

   进行完特征工程等数据清洗工作,我们就开始建模的过程,在建立模型之前,如何快速选择合适的学习算法又是重中之重,那么mlr给出了非常人性的方法。通过listLearners()可以查看所有涉及到的算法以及相应的数据要求,可见下图:

a <- listLearners("classif")
head(a, 10)
# 指定条件,选择适用的算法
listLearners("classif", "twoclass")[c("class", "package")]

image.png

朴素贝叶斯

   我们可以以贝叶斯算法为例,运用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实现机器学习算法必备的瑞士军刀。如想了解更多,可具体可参考<https://github.com/mlr-org/mlr>

推荐 1
本文由 余文华 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册