机器学习中的提前停止

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何在机器学习模型中实现提前停止技术。提前停止是一种防止过拟合并提高模型性能的有效方法。

🎯 任务

在这个项目中,你将学习:

  • 理解提前停止的概念及其主要步骤
  • 实现提前停止函数以确定最佳停止轮次
  • 在示例数据集上测试提前停止函数

🏆 成果

完成这个项目后,你将能够:

  • 将数据集拆分为训练集和验证集
  • 在训练期间监控模型在验证集上的性能
  • 根据验证集损失定义停止标准
  • 使用提前停止函数优化模型的训练过程

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/DataScienceandMachineLearningGroup(["Data Science and Machine Learning"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/DataStructuresGroup -.-> python/lists("Lists") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/DataScienceandMachineLearningGroup -.-> python/machine_learning("Machine Learning") subgraph Lab Skills python/variables_data_types -.-> lab-300214{{"机器学习中的提前停止"}} python/conditional_statements -.-> lab-300214{{"机器学习中的提前停止"}} python/lists -.-> lab-300214{{"机器学习中的提前停止"}} python/function_definition -.-> lab-300214{{"机器学习中的提前停止"}} python/machine_learning -.-> lab-300214{{"机器学习中的提前停止"}} end

理解提前停止概念并实现函数

在这一步中,你将首先了解提前停止的概念及其主要步骤。

提前停止背后的基本思想是在训练期间计算模型在验证集上的性能。当模型在验证集上的性能开始下降时,停止训练以避免过拟合。主要步骤如下:

  1. 将原始训练数据集拆分为训练集和验证集。
  2. 仅在训练集上训练模型,并在每个轮次结束时计算模型在验证集上的误差。
  3. 将模型在验证集上的误差与训练历史进行比较。当比较满足停止标准时,停止训练。
  4. 使用最后一次迭代的参数作为模型的最终参数。

有许多不同的停止标准,而且它们可以非常灵活。一种常用的标准是监控验证集上的损失值。当损失值连续 n 个轮次没有进一步优化(始终大于最小损失)时,停止训练。

现在,你将在early_stop.py文件中实现early_stop函数。

该函数逐轮检查损失值。如果损失在等于patience的轮次数量内没有改善(下降),则建议停止训练。

以下是early_stop函数的代码:

def early_stop(loss: List[float], patience: int) -> Tuple[int, float]:
    """
    根据提供的损失值和耐心值确定训练应停止的轮次。

    该函数逐轮检查损失值。如果损失在等于 `patience` 的轮次数量内没有改善(下降),则建议停止训练。

    参数:
    - loss (List[float]):损失值列表,通常按训练期间记录的顺序排列。
    - patience (int):损失没有改善的轮次数量,超过这个数量后应停止训练。

    返回:
    - Tuple[int, float]:包含两个值的元组:
        1. 训练应停止的轮次编号(从 1 开始索引)。
        2. 截至该轮次记录的最小损失值。
    """

    min_loss = np.Inf
    max_patience = 0
    stop_epoch = 0
    for epoch, current_loss in enumerate(loss):
        if current_loss < min_loss:
            min_loss = current_loss
            stop_epoch = epoch
            max_patience = 0
        else:
            max_patience += 1
        if max_patience == patience:
            break
    stop_epoch += 1
    return stop_epoch, min_loss

early_stop函数中,你实现了根据提供的损失值和patience参数确定训练应停止的轮次的逻辑。

该函数应返回一个包含两个值的元组:

  1. 训练应停止的轮次编号(从 1 开始索引)。
  2. 截至该轮次记录的最小损失值。
✨ 查看解决方案并练习

测试提前停止函数

在这一步中,你将通过运行early_stop.py文件来测试early_stop函数。

early_stop.py文件中添加以下代码:

if __name__ == "__main__":
    loss = [
        1.11,
        1.01,
        0.99,
        0.89,
        0.77,
        0.69,
        0.57,
        0.44,
        0.51,
        0.43,
        0.55,
        0.61,
        0.77,
        0.89,
        0.78,
    ]
    patience = 3
    stop_epoch, min_loss = early_stop(loss, patience)
    print(f"{stop_epoch=}, {min_loss=}")

然后,在终端中运行该脚本:

python early_stop.py

输出应该是:

stop_epoch = 10, loss = 0.43

这意味着训练应在第 10 轮停止,截至该轮记录的最小损失值为 0.43。

恭喜你!你已成功实现提前停止函数。现在,你可以在机器学习项目中使用此函数来防止过拟合并提高模型性能。

✨ 查看解决方案并练习

总结

恭喜你!你已完成这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。