mlr案例:回归
原英文地址:https://mlr.mlr-org.com/articles/tutorial/usecase_regression.html
目录
- 定义任务
- 调整
- 基准测试
- 性能
我们使用著名的mlbench::BostonHousing()
数据集进行回归。
首先,让我们看一下数据:
data(BostonHousing, package = "mlbench")
summary(BostonHousing)
## crim zn indus chas
## Min. : 0.00632 Min. : 0.00 Min. : 0.46 0:471
## 1st Qu.: 0.08204 1st Qu.: 0.00 1st Qu.: 5.19 1: 35
## Median : 0.25651 Median : 0.00 Median : 9.69
## Mean : 3.61352 Mean : 11.36 Mean :11.14
## 3rd Qu.: 3.67708 3rd Qu.: 12.50 3rd Qu.:18.10
## Max. :88.97620 Max. :100.00 Max. :27.74
## nox rm age dis
## Min. :0.3850 Min. :3.561 Min. : 2.90 Min. : 1.130
## 1st Qu.:0.4490 1st Qu.:5.886 1st Qu.: 45.02 1st Qu.: 2.100
## Median :0.5380 Median :6.208 Median : 77.50 Median : 3.207
## Mean :0.5547 Mean :6.285 Mean : 68.57 Mean : 3.795
## 3rd Qu.:0.6240 3rd Qu.:6.623 3rd Qu.: 94.08 3rd Qu.: 5.188
## Max. :0.8710 Max. :8.780 Max. :100.00 Max. :12.127
## rad tax ptratio b
## Min. : 1.000 Min. :187.0 Min. :12.60 Min. : 0.32
## 1st Qu.: 4.000 1st Qu.:279.0 1st Qu.:17.40 1st Qu.:375.38
## Median : 5.000 Median :330.0 Median :19.05 Median :391.44
## Mean : 9.549 Mean :408.2 Mean :18.46 Mean :356.67
## 3rd Qu.:24.000 3rd Qu.:666.0 3rd Qu.:20.20 3rd Qu.:396.23
## Max. :24.000 Max. :711.0 Max. :22.00 Max. :396.90
## lstat medv
## Min. : 1.73 Min. : 5.00
## 1st Qu.: 6.95 1st Qu.:17.02
## Median :11.36 Median :21.20
## Mean :12.65 Mean :22.53
## 3rd Qu.:16.95 3rd Qu.:25.00
## Max. :37.97 Max. :50.00
这个数据集涉及波士顿郊区的房价。用于回归训练的目标向量是medv
——是以1000美元为单位的房价中位数值。关于其他13个变量的描述可以通过`mlbench::BostonHousing()获取。
定义一个任务
现在,让我们定义一个回归任务。
# Make a task
regr.task = makeRegrTask(data = BostonHousing, target = "medv")
regr.task
## Supervised task: BostonHousing
## 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
为了得到一个特征类型的概览,我们打印了regr.task
。结果显示数据集中有12个数值变量和1个因子变量。
调整
输入listLearners("regr")
我们可以看到可以用于回归任务的学习器有哪些。
存在如此多的学习器,因此我们难以为该任务选择一个最优的,因此我们会选择其中的一些,并且比较它们的结果。这个分析使用经典的线性回归模型(regr.lm
)、带径向基核(regr.ksvm
)的SVM(kernlab::ksvm()
)和来自ranger包(ranger::ranger()
)的随机森林。
为了快速浏览所有学习器特异的可调整参数,你可以使用getLearnerParamSet()
或者他的别名ParamHelpers::getParamSet()
,它会列出学习器的超参数和其他属性。
在设定一个基准实验之前,我们可以指定将要调整的超参数。mlr
包提供的强大的调整算法,比如iterated F-racing (irace::irace()
), CMA Evolution Strategy (cmaes::cma_es()
), model-based / Bayesian optimization (mlrMBO::mbo()
) and generalized simulated annealing (GenSA::GenSA()
)。
对每个模型都有一个超参数将会调整,即SVM模型中的参数和随机森林中树的数目。我们先指定这些参数的搜索空间。通过
makeTuneControlCMAES()
,我们设定调整方法为CMA Evolution Strategy (cmaes::cma_es()
)。随后我们使用重采样策略中的5折交叉验证,并以均方根误差(rmse
)作为优化标准。
set.seed(1234)
# Define a search space for each learner'S parameter
ps_ksvm = makeParamSet(
makeNumericParam("sigma", lower = -12, upper = 12, trafo = function(x) 2^x)
)
ps_rf = makeParamSet(
makeIntegerParam("num.trees", lower = 1L, upper = 200L)
)
# Choose a resampling strategy
rdesc = makeResampleDesc("CV", iters = 5L)
# Choose a performance measure
meas = rmse
# Choose a tuning method
ctrl = makeTuneControlCMAES(budget = 100L)
# Make tuning wrappers
tuned.ksvm = makeTuneWrapper(learner = "regr.ksvm", resampling = rdesc, measures = meas,
par.set = ps_ksvm, control = ctrl, show.info = FALSE)
tuned.rf = makeTuneWrapper(learner = "regr.ranger", resampling = rdesc, measures = meas,
par.set = ps_rf, control = ctrl, show.info = FALSE)
基准实验
为了指导基准实验,必须选择一个评估方法。我们使用前面设定的重采样策略和性能度量并将其包装为参数传入benchmark()
函数。
# Four learners to be compared
lrns = list(makeLearner("regr.lm"), tuned.ksvm, tuned.rf)
# Conduct the benchmark experiment
bmr = benchmark(learners = lrns, tasks = regr.task, resamplings = rdesc, measures = rmse,
show.info = FALSE)
性能
现在我们来评估结果:
getBMRAggrPerformances(bmr)
## $BostonHousing
## $BostonHousing$regr.lm
## rmse.test.rmse
## 4.901218
##
## $BostonHousing$regr.ksvm.tuned
## rmse.test.rmse
## 3.643597
##
## $BostonHousing$regr.ranger.tuned
## rmse.test.rmse
## 3.425189
箱线图显示了RF在这个任务中优于其他学习器。尽管之前进行了调整,但线性和套索回归的基准实验产生了类似但不良的结果。
plotBMRBoxplots(bmr)
![](https://img.haomeiwen.com/i3884693/d6dba481b55e8760.png)
文章有些细节部分我现在也不是很理解,感兴趣的朋友不妨读读原文。