任务一:超参数调优与模型评估

  1. lrn("regr.ranger") 模型在 tsk("mtcars") 数据集上的 mtrysample.fractionnum.trees 超参数进行调优。采用简单的随机搜索方法进行 50 次评估,利用三折交叉验证和均方根误差(RMSE)来评估模型性能。通过边际效应图可视化每个超参数对模型性能的影响,展现单个超参数与交叉验证均方误差(MSE)之间的关系。

调优 lrn("regr.ranger") 模型时,使用随机搜索方法对 mtrysample.fractionnum.trees 进行参数选择,确保能够有效评估模型性能。

以下代码片段展示了如何使用 mlr3 框架进行超参数调优的具体步骤。接下来对每行代码进行详细解析,尤其是在建模过程中需要关注的 instance 和调优器的用法与区别。

set.seed(1234)
  • 设置随机数种子以确保结果可复现。
mytask1 <- tsk("mtcars")
  • 创建任务 mytask1,使用 mtcars 数据集,该数据集用于回归分析(预测连续变量,如汽车的燃油效率)。
learner1 <- lrn("regr.ranger",                  mtry = to_tune(1, 10),                  sample.fraction = to_tune(0.5, 1),                  num.trees = to_tune(100, 500))
  • 定义回归模型 learner1,使用随机森林回归器 regr.ranger(Ranger 库)。
  • 设置 mtrysample.fractionnum.trees 作为超参数,并定义其调优范围:
    • mtry: 在每棵树的节点分裂时随机选择的变量数量,调整范围为 1 到 10。
    • sample.fraction: 每棵树的样本比例,调整范围为 0.5 到 1(即从 50% 到 100% 的样本用于训练每棵树)。
    • num.trees: 森林中的树木数量,调整范围为 100 到 500。
learner1$param_set
  • 显示 learner1 的参数集合,包含所有可调节参数及其当前值和调优范围。
instance <- ti(    learner = learner1,    task = mytask1,    resampling = rsmp("cv", folds = 3),    measure = msr("regr.rmse"),    terminator = trm("evals", n_evals = 50)  )
  • 创建调优实例 instance,定义模型调优的各个方面:
    • learner = learner1: 要调优的学习器是 learner1(随机森林)。
    • task = mytask1: 任务是回归任务 mtcars 数据集。
    • resampling = rsmp("cv", folds = 3): 使用三折交叉验证评估模型性能。
    • measure = msr("regr.rmse"): 评估指标是回归均方根误差(RMSE),目标是最小化此值。
    • terminator = trm("evals", n_evals = 50): 定义调优的停止条件,最多进行 50 次评估。
tuner <- tnr("random_search", batch_size = 10)
  • 定义调优器 tuner,采用随机搜索策略(random_search),每次评估 10 个超参数组合。
tuner$optimize(instance)
  • 运行调优过程,通过随机搜索优化 instance 中的模型超参数。根据设置的停止条件,最多进行 50 次评估。
as.data.table(instance$archive)
  • 以数据表形式显示调优历史结果,包含每次调优的超参数组合及对应的评估性能(如 RMSE)。
instance$result
图片
  • 返回调优的最终结果,包含最佳超参数组合及其性能。
autoplot(instance, type = "incumbent")
  • 绘制调优过程中最佳模型(incumbent)的性能变化图,展示当前最佳模型在调优过程中的演变。
autoplot(instance, type = "marginal")
  • 绘制每个单一超参数的边际效应图(marginal),展示超参数值如何影响模型的性能(例如 RMSE)。

注意事项:

  1. 任务与学习器选择:任务 (task) 和学习器 (learner) 的选择必须与问题相符。这里使用 regr.ranger 回归器进行回归任务,符合 mtcars 数据的性质。
  2. 超参数调优范围:调优范围选择要合理,既不能过宽(耗时较长,且可能导致过拟合),也不能过窄(可能错失最佳参数)。此处 mtrysample.fractionnum.trees 的范围定义适中。
  3. 交叉验证:使用交叉验证避免过拟合,确保模型的泛化能力。三折交叉验证是合理的选择,折数可根据数据集大小进行调整。
  4. 终止条件:调优过程需设定适当的终止条件。这里通过 n_evals = 50 限制最多 50 次评估,避免因搜索空间过大导致的时间过长问题。

instance 的定义

instance 是调优实例,包含整个调优过程所需的所有信息和设置。它定义了要优化的模型、数据集、评估指标、重采样方法、超参数搜索空间和终止条件。instance 是模型调优过程中的核心对象。

ti()tnr() 的用法与区别

  • ti()TuningInstance): 用于定义调优实例,包含学习器、任务、超参数搜索空间、评估指标和终止条件等。它负责收集调优过程中所有的重要信息,并最终输出调优结果。
  • tnr()Tuner): 调优器,用于执行调优过程的具体方法。不同的调优器(如 random_searchgrid_search)使用不同的搜索策略来优化超参数组合。tnr() 定义了调优策略,主要职责是探索调优实例中的搜索空间。

简而言之,ti() 定义了调优任务的框架,而 tnr() 是实际执行调优过程的工具。

任务二:利用嵌套重抽样评估模型性能

  1. 使用嵌套重抽样评估在第一任务中创建的模型的性能。内部重抽样采用留出法,外部重抽样采用三折交叉验证。

以下是使用嵌套重抽样的方法:

set.seed(1234)  # 设置随机数种子,确保结果可复现。​task = tsk("mtcars")  # 创建任务 `task`,数据集为 `mtcars`,任务类型是回归。​learner = lrn("regr.ranger",  mtry = to_tune(1, 10),  # 定义超参数 `mtry` 的调优范围,从 1 到 10。  sample.fraction = to_tune(0.5, 1),  # 定义超参数 `sample.fraction` 的调优范围,从 0.5 到 1。  num.trees = to_tune(100, 500)  # 定义超参数 `num.trees` 的调优范围,从 100 到 500。)​at = auto_tuner(  tuner = tnr("random_search", batch_size = 50),  # 使用随机搜索作为调优器,每次批量评估 50 组超参数组合。  learner = learner,  # 使用之前定义的学习器 `learner`。  resampling = rsmp("holdout"),  # 使用持出法(Holdout)进行模型评估。  measure = msr("regr.rmse"),  # 评估指标为均方根误差(RMSE),目标是最小化该值。  terminator = trm("evals", n_evals = 50)  # 设置调优的终止条件为最多评估 50 次超参数组合。)​rr = resample(task, at, rsmp("cv", folds = 3))  # 使用三折交叉验证对 `auto_tuner` 实例 `at` 进行重采样,评估模型性能。​rr$aggregate(msr("regr.rmse"))  # 聚合交叉验证的结果,计算均方根误差(RMSE)的平均值,得到模型的最终评估指标。
图片

任务三:XGBoost模型与逻辑回归的性能比较

  1. 对比调优后的 XGBoost 模型与未经调优的逻辑回归模型,确定哪一个模型具有最佳的 Brier 评分。使用 mlr3tuningspaces 和嵌套重抽样,选择适当的内部和外部重采样策略,以平衡计算效率与结果的稳定性。

以下是实现步骤:

set.seed(1234)  # 设置随机数种子,确保结果可复现。​mytask2 <- tsk("sonar")  # 创建任务 `mytask2`,数据集为 `sonar`,任务类型是分类。​# 定义逻辑回归模型lrn_log_reg <- lrn("classif.log_reg", predict_type = "prob")  # 创建逻辑回归学习器并指定预测类型为概率。​# 定义 XGBoost 模型lrn_xgboost = lrn("classif.xgboost", predict_type = "prob")  # 创建 XGBoost 分类学习器并指定预测类型为概率。​# 获取 XGBoost 的默认调优空间lrn_xgboostspace = lts("regr.xgboost.default")  # 获取 XGBoost 回归模型的默认调优空间(可能需要调整为分类任务的调优空间)。​# 查看 XGBoost 调优空间的详细信息,确认超参数范围。lrn_xgboostspace ​# 定义 XGBoost 自动调优器at_xgboost <- auto_tuner(  tuner = tnr("random_search", batch_size = 20),  # 使用随机搜索作为调优器,每次批量评估 20 组超参数组合。  learner = lrn_xgboost,  # 使用之前定义的 XGBoost 学习器。  resampling = rsmp("cv", folds = 3),  # 使用三折交叉验证进行模型评估。  measure = msr("classif.bbrier"),  # 评估指标为 Brier 评分(适用于分类问题),目标是最小化该值。  search_space = lrn_xgboostspace,  # 设置超参数调优空间。  terminator = trm("evals", n_evals = 50)  # 设置调优终止条件为最多评估 50 次超参数组合。)​# 定义基准测试设计design <- benchmark_grid(  tasks = mytask2,  # 使用 `mytask2` 任务。  learners = list(lrn_log_reg, at_xgboost),  # 列出要测试的学习器,包括逻辑回归和自动调优后的 XGBoost。  resamplings = rsmp("cv", folds = 5)  # 使用五折交叉验证进行评估。)​bmr <- benchmark(design)  # 执行基准测试,根据设计对学习器进行评估。​bmr$aggregate(msr("classif.bbrier"))  # 聚合基准测试结果,计算 Brier 评分的平均值,评估模型性能。​autoplot(bmr, type = "roc")  # 绘制 ROC 曲线图,比较不同模型的分类性能。
最后修改日期: 2024年9月15日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。