2. Basic

无论是使用R ,Python还是其他语言进行机器学习时,我们首先必须要对机器学习的整个过程有个全局概览:



R语言 heatmap R语言提取一列的列名_语言 提取列名

首先,我们得获得数据,才能开始机器学习的第一步;之后,为了防止预测的过拟合(可以理解为考试作弊,我高考的时候已经提前知道了答案),需要将数据划分为训练集和测试集;之后选择一个合适的模型(算法),根据训练集数据进行训练,让这个模型能学到东西(可以理解为确定了参数,比如感知机模型中参数:权重向量w);再之后,我们可以模型(已经学习到了知识)对测试集的数据进行预测;那么我们又该如何评价预测的好坏呢?此时我们需要根据分类还是回归选择合适的评价好坏的方法。最后的最后,由于存在随机误差,单次的好坏并不能说明最终学习的效果好,因此我们使用不同的验证集与测试集(k-fold 交叉验证)重复上述步骤。

至此,我们已经大致了解了机器学习的主要步骤。接下来我们将按照上图所示的,依次从:Task, Learner,Train and Predict, Resampling 开始介绍 mlr3中的相关用法。除了这5个部分之外,我们将还介绍 Benchmarking(比较不同模型) 和  Binary classification(特殊的分类情况,二分类) 这两个部分。

2.1 Task

在mlr3中,定义了一个 Task对象 用来处理机器学习相关的问题。

根据使用者的目的不同,Task可以大致分为几种对象:分类 (TaskClassif ), 回归( TaskRegr ), 生存分析(mlr3proba::TaskSurv),  密度估计( mlr3proba::TaskDens  ), 聚类(mlr3cluster::TaskClust ),  空间分析 (可以再划分为:分类和回归,mlr3spatiotempcv::TaskRegrSTmlr3spatiotempcv::TaskClassifST) 以及 序数回归(TaskOrdinal)。括号里的是创建对应对象的函数。

目前,我们使用最多的是 分类和回归任务,其他可以适当了解,不用过多纠结。

我们以R的内置数据集   mtcars为例,首先我们查看一下这个数据集前三列的内容有啥:

data = mtcars[, 1:3]
str(data)
## 'data.frame':    32 obs. of  3 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...

data = mtcars[, 1:3]
str(data)
## 'data.frame':    32 obs. of  3 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...

数据共有3列,分别表示的是 每加仑行使的英里数,气缸数,移位。现在我们的目的是通过 cyl 和 disp 来预测 mpg。

很显然,我们的目标变量是 mpg,而由于mpg是数值变量,因此我们的任务是回归任务。

我们使用TaskRegr 这个函数创建一个回归任务,并给这个任务随便命个名,'cars' ,如下:

library("mlr3")
task_mtcars = TaskRegr$new(id = "cars", backend = data, target = "mpg")# data是之前的数据集
print(task_mtcars)
##  (32 x 3)
## * Target: mpg
## * Properties: -
## * Features (2):
##   - dbl (2): cyl, disp

library("mlr3")
task_mtcars = TaskRegr$new(id = "cars", backend = data, target = "mpg")# data是之前的数据集
print(task_mtcars)
##  (32 x 3)
## * Target: mpg
## * Properties: -
## * Features (2):
##   - dbl (2): cyl, disp

我们从中可以看到 特征变量为 cyl 和 disp,  目标变量为 mpg.

此时的 task_mtcars是一个task对象,如果我们想要将其转换为R中的数据格式,我们可以通过以下几种方法:

data=as.data.table(task_mtcars)
data=task_mtcars$data()

data=as.data.table(task_mtcars)
data=task_mtcars$data()

得到数据data

此外,我们还可以直接在 task_mtcars上对数据进行展示,

储存,提取,展示数据。

task_iris$nrow   ## [1] 150
task_iris$ncol   ## [1] 5
task_iris$data() ##展示数据, 
as.data.table(task_iris) # 同样是展示数据,适用性更强
task_iris$data(rows = c(1, 51, 101)) #选择行
task_iris$data(rows = c(1, 51, 101), cols = "Species") #选择对应的行和列名
task_iris$feature_names #提取特征变量名称
task_iris$target_names  #提取预测变量名称
task_mtcars$col_roles   #展示所有变量名称
task_mtcars$col_roles$name = "rn" #重新命名对应的变量名称


task_iris$nrow   ## [1] 150
task_iris$ncol   ## [1] 5
task_iris$data() ##展示数据, 
as.data.table(task_iris) # 同样是展示数据,适用性更强
task_iris$data(rows = c(1, 51, 101)) #选择行
task_iris$data(rows = c(1, 51, 101), cols = "Species") #选择对应的行和列名
task_iris$feature_names #提取特征变量名称
task_iris$target_names  #提取预测变量名称
task_mtcars$col_roles   #展示所有变量名称
task_mtcars$col_roles$name = "rn" #重新命名对应的变量名称

如果我们需要对数据中的特征(列)进行筛选的话,可以通过:

task_mtcars$select(c("cyl")) # 只保留特征中的 cyl变量

task_mtcars$select(c("cyl")) # 只保留特征中的 cyl变量

如果我们需要对数据中的行进行筛选的话,可以通过:

task_mtcars$filter(1:3)# 只保留数据中的1:3行

task_mtcars$filter(1:3)# 只保留数据中的1:3行

如果我们需要在数据添加新的特征(列),可以通过:

task_mtcars$cbind(data.table(foo =sample(1:100,32,T))) # 添加新的特征列,名为foo
task_mtcars$head()

task_mtcars$cbind(data.table(foo =sample(1:100,32,T))) # 添加新的特征列,名为foo
task_mtcars$head()

在mlr3中,也内置了几个task 数据集,mlr_tasks ,可以直接用来做简单的例子

as.data.table(mlr_tasks)
##                key task_type nrow ncol lgl int dbl chr fct ord pxc
##  1: boston_housing      regr  506   19   0   3  13   0   2   0   0
##  2:  breast_cancer   classif  683   10   0   0   0   0   0   9   0
##  3:  german_credit   classif 1000   21   0   3   0   0  14   3   0
##  4:           iris   classif  150    5   0   0   4   0   0   0   0
##  5:         mtcars      regr   32   11   0   0  10   0   0   0   0
##  6:           pima   classif  768    9   0   0   8   0   0   0   0
##  7:          sonar   classif  208   61   0   0  60   0   0   0   0
##  8:           spam   classif 4601   58   0   0  57   0   0   0   0
##  9:           wine   classif  178   14   0   2  11   0   0   0   0
## 10:            zoo   classif  101   17  15   1   0   0   0   0   0
task_iris = mlr_tasks$get("iris") #提取 iris的task对象
task_iris = tsk("iris")           #提取 iris的task对象         

as.data.table(mlr_tasks)
##                key task_type nrow ncol lgl int dbl chr fct ord pxc
##  1: boston_housing      regr  506   19   0   3  13   0   2   0   0
##  2:  breast_cancer   classif  683   10   0   0   0   0   0   9   0
##  3:  german_credit   classif 1000   21   0   3   0   0  14   3   0
##  4:           iris   classif  150    5   0   0   4   0   0   0   0
##  5:         mtcars      regr   32   11   0   0  10   0   0   0   0
##  6:           pima   classif  768    9   0   0   8   0   0   0   0
##  7:          sonar   classif  208   61   0   0  60   0   0   0   0
##  8:           spam   classif 4601   58   0   0  57   0   0   0   0
##  9:           wine   classif  178   14   0   2  11   0   0   0   0
## 10:            zoo   classif  101   17  15   1   0   0   0   0   0
task_iris = mlr_tasks$get("iris") #提取 iris的task对象
task_iris = tsk("iris")           #提取 iris的task对象
2.2 Learners

mlr3中的Learner 对象提供了许多R中的机器学习算法。

mlr_learners中提供了基础的机器学习算法。如果只加载mlr3,  mlr_learners只包括5种简单的算法。

当加载 mlr3learners这个包后,  mlr_learners中就多了20多种算法,总共有28种算法。

library(`mlr3learners`)
mlr_learners
##DictionaryLearner> with 28 stored values
##Keys: classif.cv_glmnet, classif.debug, classif.featureless,
## classif.glmnet, classif.kknn, classif.lda, classif.log_reg,
## classif.multinom, classif.naive_bayes, classif.qda, classif.ranger,
## classif.rpart, classif.svm, classif.xgboost, regr.cv_glmnet,
## regr.featureless, regr.glmnet, regr.kknn, regr.km, regr.lm,
## regr.ranger, regr.rpart, regr.svm, regr.xgboost, surv.cv_glmnet,
## surv.glmnet, surv.ranger, surv.xgboost        

library(`mlr3learners`)
mlr_learners
##DictionaryLearner> with 28 stored values
##Keys: classif.cv_glmnet, classif.debug, classif.featureless,
## classif.glmnet, classif.kknn, classif.lda, classif.log_reg,
## classif.multinom, classif.naive_bayes, classif.qda, classif.ranger,
## classif.rpart, classif.svm, classif.xgboost, regr.cv_glmnet,
## regr.featureless, regr.glmnet, regr.kknn, regr.km, regr.lm,
## regr.ranger, regr.rpart, regr.svm, regr.xgboost, surv.cv_glmnet,
## surv.glmnet, surv.ranger, surv.xgboost

选择特定的算法

learner = mlr_learners$get("classif.rpart") #选择分类决策树
learner = lrn("classif.rpart")              #选择分类决策树
print(learner)
## 
## * Model: -
## * Parameters: xval=0
## * Packages: rpart
## * Predict Type: response
## * Feature types: logical, integer, numeric, factor, ordered
## * Properties: importance, missings, multiclass, selected_features,
##   twoclass, weights

learner = mlr_learners$get("classif.rpart") #选择分类决策树
learner = lrn("classif.rpart")              #选择分类决策树
print(learner)
## 
## * Model: -
## * Parameters: xval=0
## * Packages: rpart
## * Predict Type: response
## * Feature types: logical, integer, numeric, factor, ordered
## * Properties: importance, missings, multiclass, selected_features,
##   twoclass, weights

设置算法的参数

learner$param_set
## 
##                 id    class lower upper      levels        default value
##  1:       minsplit ParamInt     1   Inf                         20      
##  2:      minbucket ParamInt     1   Inf                   
##  3:             cp ParamDbl     0     1                       0.01      
##  4:     maxcompete ParamInt     0   Inf                          4      
##  5:   maxsurrogate ParamInt     0   Inf                          5      
##  6:       maxdepth ParamInt     1    30                         30      
##  7:   usesurrogate ParamInt     0     2                          2      
##  8: surrogatestyle ParamInt     0     1                          0      
##  9:           xval ParamInt     0   Inf                         10     0
## 10:     keep_model ParamLgl    NA    NA  TRUE,FALSE          FALSE

learner$param_set$values = list(cp = 0.01, xval = 0) #设置cp和xval

learner$param_set
## 
##                 id    class lower upper      levels        default value
##  1:       minsplit ParamInt     1   Inf                         20      
##  2:      minbucket ParamInt     1   Inf                   
##  3:             cp ParamDbl     0     1                       0.01      
##  4:     maxcompete ParamInt     0   Inf                          4      
##  5:   maxsurrogate ParamInt     0   Inf                          5      
##  6:       maxdepth ParamInt     1    30                         30      
##  7:   usesurrogate ParamInt     0     2                          2      
##  8: surrogatestyle ParamInt     0     1                          0      
##  9:           xval ParamInt     0   Inf                         10     0
## 10:     keep_model ParamLgl    NA    NA  TRUE,FALSE          FALSE

learner$param_set$values = list(cp = 0.01, xval = 0) #设置cp和xval

下一节,我们将继续介绍 Train and Predict, Resampling,Benchmarking 和  Binary classification

  1. mlr3book