R语言机器学习笔记(二):mlr任务定义

作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(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函数可以直接删掉任务数据的特征。关于更多的用法,让我们在实践中继续尝试。


参考链接:

mlr.mlr-org.com/article

编辑于 07-11

文章被以下专栏收录