2. Basic
无论是使用R ,Python还是其他语言进行机器学习时,我们首先必须要对机器学习的整个过程有个全局概览:
首先,我们得获得数据,才能开始机器学习的第一步;之后,为了防止预测的过拟合(可以理解为考试作弊,我高考的时候已经提前知道了答案),需要将数据划分为训练集和测试集;之后选择一个合适的模型(算法),根据训练集数据进行训练,让这个模型能学到东西(可以理解为确定了参数,比如感知机模型中参数:权重向量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::TaskRegrST
和 mlr3spatiotempcv::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
- mlr3book