作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言高效数据处理指南》(《R语言数据高效处理指南》(黄天元)【摘要 书评 试读】- 京东图书)。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。
机器学习的步,就是要对问题进行定义。什么是自变量,什么是因变量,自变量是什么类型的数据(离散、连续),这些问题都很重要。根据定义任务的不同,整个学习框架也会有所差异。在mlr中,对任务的定义,要给出一个数据表(data.frame),并告诉计算机哪个是响应变量(Y),其他列默认为解释变量(X1-Xn)。比如我们要定义一个回归任务,可以这样操作:
library(pacman)
p_load(mlr,mlbench)
data(BostonHousing, package = "mlbench")
head(BostonHousing)
#> crim zn indus chas nox rm age dis rad tax ptratio b lstat
#> 1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98
#> 2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14
#> 3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03
#> 4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94
#> 5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33
#> 6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12 5.21
#> medv
#> 1 24.0
#> 2 21.6
#> 3 34.7
#> 4 33.4
#> 5 36.2
#> 6 28.7
regr.task = makeRegrTask(id = "bh", data = BostonHousing, target = "medv")
regr.task
#> Supervised task: bh
#> Type: regr
#> Target: medv
#> Observations: 506
#> Features:
#> numerics factors ordered functionals
#> 12 1 0 0
#> Missings: FALSE
#> Has weights: FALSE
#> Has blocking: FALSE
#> Has coordinates: FALSE
定义回归任务,要用makeRegrTask函数声明,data参数放入数据框,同时target参数为响应变量(字符型的变量名),改列必须为数值型。而id表示任务名称,这个可以根据个人需要随便设置。
分类任务大同小异,只是函数名称改为了makeClassifTask,而响应变量必须为因子变量(factor)。对于二分类问题而言,还可以选其中一个类别作为Positive,剩下则默认为Negative,这样有利于计算部分二分类中的指标。例子如下:
data(BreastCancer, package = "mlbench")
df = BreastCancer
df$Id = NULL # 人工去掉Id列
classif.task = makeClassifTask(id = "BreastCancer", data = df, target = "Class", positive = "malignant")
classif.task
需要特殊注意的是,针对一个多分类问题,makeMultilabelTask函数需要定义多个响应变量。也就是说,一列有多个分类,必须使用one-hot编码展开成多列,然后这些列的名称构成的字符向量,放到target中去。例子如下:
yeast = getTaskData(yeast.task)
labels = colnames(yeast)[1:14]
yeast.task = makeMultilabelTask(id = "multi", data = yeast, target = labels)
yeast.task
target参数的labels,实际是长度为14的字符向量。
除了上面提到的例子以外,mlr还支持进行生存分析预测,这里需要制定的target包括时间信息和所处的状态(生存与死亡,这里必须转化为逻辑型,即只有TRUE和FALSE)。另外,mlr还可以进行无监督的机器学习,一个例子就是聚类分析(cluster analysis),在这个任务的定义上,只需要把数据框输入即可,不需要提供额外信息。
我们所定义的任务,本质上是一个对象(Object,计算机术语)。所以定义了任务之后,可以利用对象的方法来对里面的数据进行操作,比如获取行列数量、取子集等,也可以直接对任务中的数据进行删改,如dropFeatures函数可以直接删掉任务数据的特征。关于更多的用法,让我们在实践中继续尝试。
参考链接: