当前位置:

首页 > 业界资讯 > 机器学习中训练和验证指标曲线图能告诉我们什么?

机器学习中训练和验证指标曲线图能告诉我们什么?

在本文中将对训练和验证可能产生的情况进行总结并介绍这些图表到底能为我们提供什么样的信息。让我们从一些简单的代码开始以下代码建立了一个基本的训练流程框架。fromsklearn.model_selectionimporttrain_test_splitfromsklearn.datasetsimportmake_classificationimporttorchfromtorch.utils.dataimportDataset,DataLoaderimporttorch.optim

本文目录

    在本文中将对训练和验证可能产生的情况进行总结并介绍这些图表到底能为我们提供什么样的信息。

    机器学习中训练和验证指标曲线图能告诉我们什么?

    让我们从一些简单的代码开始以下代码建立了一个基本的训练流程框架。

    from sklearn.model_selection import train_test_split
    from sklearn.datasets import make_classification
    import torch
    from torch.utils.data import Dataset, DataLoader
    import torch.optim as torch_optim
    import torch.nn as nn
    import torch.nn.functional as F
    import numpy as np
    import matplotlib.pyplot as pltclass MyCustomDataset(Dataset):
    def __init__(self, X, Y, scale=False):
    self.X = torch.from_numpy(X.astype(np.float32))
    self.y = torch.from_numpy(Y.astype(np.int64))

    def __len__(self):
    return len(self.y)

    def __getitem__(self, idx):
    return self.X[idx], self.y[idx]def get_optimizer(model, lr=0.001, wd=0.0):
    parameters = filter(lambda p: p.requires_grad, model.parameters())
    optim = torch_optim.Adam(parameters, lr=lr, weight_decay=wd)
    return optimdef train_model(model, optim, train_dl, loss_func):
    # Ensure the model is in Training mode
    model.train()
    total = 0
    sum_loss = 0
    for x, y in train_dl:
    batch = y.shape[0]
    # Train the model for this batch worth of data
    logits = model(x)
    # Run the loss function. We will decide what this will be when we call our Training Loop
    loss = loss_func(logits, y)
    # The next 3 lines do all the PyTorch back propagation goodness
    optim.zero_grad()
    loss.backward()
    optim.step()
    # Keep a running check of our total number of samples in this epoch
    total += batch
    # And keep a running total of our loss
    sum_loss += batch*(loss.item())
    return sum_loss/total
    def train_loop(model, train_dl, valid_dl, epochs, loss_func, lr=0.1, wd=0):
    optim = get_optimizer(model, lr=lr, wd=wd)
    train_loss_list = []
    val_loss_list = []
    acc_list = []
    for i in range(epochs):
    loss = train_model(model, optim, train_dl, loss_func)
    # After training this epoch, keep a list of progress of
    # the loss of each epoch
    train_loss_list.append(loss)
    val, acc = val_loss(model, valid_dl, loss_func)
    # Likewise for the validation loss and accuracy
    val_loss_list.append(val)
    acc_list.append(acc)
    print("training loss: %.5f valid loss: %.5f accuracy: %.5f" % (loss, val, acc))

    return train_loss_list, val_loss_list, acc_list
    def val_loss(model, valid_dl, loss_func):
    # Put the model into evaluation mode, not training mode
    model.eval()
    total = 0
    sum_loss = 0
    correct = 0
    batch_count = 0
    for x, y in valid_dl:
    batch_count += 1
    current_batch_size = y.shape[0]
    logits = model(x)
    loss = loss_func(logits, y)
    sum_loss += current_batch_size*(loss.item())
    total += current_batch_size
    # All of the code above is the same, in essence, to
    # Training, so see the comments there
    # Find out which of the returned predictions is the loudest
    # of them all, and that's our prediction(s)
    preds = logits.sigmoid().argmax(1)
    # See if our predictions are right
    correct += (preds == y).float().mean().item()
    return sum_loss/total, correct/batch_count
    def view_results(train_loss_list, val_loss_list, acc_list):
    plt.rcParams["figure.figsize"] = (15, 5)
    plt.figure()
    epochs = np.arange(0, len(train_loss_list)) plt.subplot(1, 2, 1)
    plt.plot(epochs-0.5, train_loss_list)
    plt.plot(epochs, val_loss_list)
    plt.title('model loss')
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.legend(['train', 'val', 'acc'], loc = 'upper left')

    plt.subplot(1, 2, 2)
    plt.plot(acc_list)
    plt.title('accuracy')
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    plt.legend(['train', 'val', 'acc'], loc = 'upper left')
    plt.show()

    def get_data_train_and_show(model, batch_size=128, n_samples=10000, n_classes=2, n_features=30, val_size=0.2, epochs=20, lr=0.1, wd=0, break_it=False):
    # We'll make a fictitious dataset, assuming all relevant
    # EDA / Feature Engineering has been done and this is our
    # resultant data
    X, y = make_classification(n_samples=n_samples, n_classes=n_classes, n_features=n_features, n_informative=n_features, n_redundant=0, random_state=1972)

    if break_it: # Specifically mess up the data
    X = np.random.rand(n_samples,n_features)
    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=val_size, random_state=1972) train_ds = MyCustomDataset(X_train, y_train)
    valid_ds = MyCustomDataset(X_val, y_val)
    train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True)
    valid_dl = DataLoader(valid_ds, batch_size=batch_size, shuffle=True) train_loss_list, val_loss_list, acc_list = train_loop(model, train_dl, valid_dl, epochs=epochs, loss_func=F.cross_entropy, lr=lr, wd=wd)
    view_results(train_loss_list, val_loss_list, acc_list)

    以上的代码很简单,就是获取数据,训练,验证这样一个基本的流程,下面我们开始进入正题。

    场景 1 - 模型似乎可以学习,但在验证或准确性方面表现不佳

    无论超参数如何,模型 Train loss 都会缓慢下降,但 Val loss 不会下降,并且其 Accuracy 并不表明它正在学习任何东西。

    比如在这种情况下,二进制分类的准确率徘徊在 50% 左右。

    class Scenario_1_Model_1(nn.Module):
    def __init__(self, in_features=30, out_features=2):
    super().__init__()
    self.lin1 = nn.Linear(in_features, out_features)
    def forward(self, x):
    x = self.lin1(x)
    return x
    get_data_train_and_show(Scenario_1_Model_1(), lr=0.001, break_it=True)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    数据中没有足够的信息来允许‘学习’,训练数据可能没有包含足够的信息来让模型“学习”。

    在这种情况下(代码中训练数据时随机数据),这意味着它无法学习任何实质内容。

    数据必须有足够的信息可以从中学习。 EDA 和特征工程是关键! 模型学习可以学到的东西,而不是不是编造不存在的东西。

    场景 2 — 训练、验证和准确度曲线都非常不稳

    例如下面代码: lr=0.1,bs=128

    class Scenario_2_Model_1(nn.Module):
    def __init__(self, in_features=30, out_features=2):
    super().__init__()
    self.lin1 = nn.Linear(in_features, out_features)
    def forward(self, x):
    x = self.lin1(x)
    return x
    get_data_train_and_show(Scenario_2_Model_1(), lr=0.1)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    “学习率太高”或“批量太小”可以尝试将学习率从 0.1 降低到 0.001,这意味着它不会“反弹”,而是会平稳地降低。

    get_data_train_and_show(Scenario_1_Model_1(), lr=0.001)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    除了降低学习率外,增加批量大小也会使其更平滑。

    get_data_train_and_show(Scenario_1_Model_1(), lr=0.001, batch_size=256)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    场景 3——训练损失接近于零,准确率看起来还不错,但验证 并没有下降,并且还上升了

    class Scenario_3_Model_1(nn.Module):
    def __init__(self, in_features=30, out_features=2):
    super().__init__()
    self.lin1 = nn.Linear(in_features, 50)
    self.lin2 = nn.Linear(50, 150)
    self.lin3 = nn.Linear(150, 50)
    self.lin4 = nn.Linear(50, out_features)
    def forward(self, x):
    x = F.relu(self.lin1(x))
    x = F.relu(self.lin2(x))
    x = F.relu(self.lin3(x))
    x = self.lin4(x)
    return x
    get_data_train_and_show(Scenario_3_Model_1(), lr=0.001)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    这肯定是过拟合了:训练损失低和准确率高,而验证损失和训练损失越来越大,都是经典的过拟合指标。

    从根本上说,你的模型学习能力太强了。 它对训练数据的记忆太好,这意味着它也不能泛化到新数据。

    我们可以尝试的第一件事是降低模型的复杂性。

    class Scenario_3_Model_2(nn.Module):
    def __init__(self, in_features=30, out_features=2):
    super().__init__()
    self.lin1 = nn.Linear(in_features, 50)
    self.lin2 = nn.Linear(50, out_features)
    def forward(self, x):
    x = F.relu(self.lin1(x))
    x = self.lin2(x)
    return x
    get_data_train_and_show(Scenario_3_Model_2(), lr=0.001)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    这让它变得更好了,还可以引入 L2 权重衰减正则化,让它再次变得更好(适用于较浅的模型)。

    get_data_train_and_show(Scenario_3_Model_2(), lr=0.001, wd=0.02)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    如果我们想保持模型的深度和大小,可以尝试使用 dropout(适用于更深的模型)。

    class Scenario_3_Model_3(nn.Module):
    def __init__(self, in_features=30, out_features=2):
    super().__init__()
    self.lin1 = nn.Linear(in_features, 50)
    self.lin2 = nn.Linear(50, 150)
    self.lin3 = nn.Linear(150, 50)
    self.lin4 = nn.Linear(50, out_features)
    self.drops = nn.Dropout(0.4)
    def forward(self, x):
    x = F.relu(self.lin1(x))
    x = self.drops(x)
    x = F.relu(self.lin2(x))
    x = self.drops(x)
    x = F.relu(self.lin3(x))
    x = self.drops(x)
    x = self.lin4(x)
    return x
    get_data_train_and_show(Scenario_3_Model_3(), lr=0.001)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    场景 4 - 训练和验证表现良好,但准确度没有提高

    lr = 0.001,bs = 128(默认,分类类别= 5

    class Scenario_4_Model_1(nn.Module):
    def __init__(self, in_features=30, out_features=2):
    super().__init__()
    self.lin1 = nn.Linear(in_features, 2)
    self.lin2 = nn.Linear(2, out_features)
    def forward(self, x):
    x = F.relu(self.lin1(x))
    x = self.lin2(x)
    return x
    get_data_train_and_show(Scenario_4_Model_1(out_features=5), lr=0.001, n_classes=5)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    没有足够的学习能力:模型中的其中一层的参数少于模型可能输出中的类。 在这种情况下,当有 5 个可能的输出类时,中间的参数只有 2 个。

    这意味着模型会丢失信息,因为它不得不通过一个较小的层来填充它,因此一旦层的参数再次扩大,就很难恢复这些信息。

    所以需要记录层的参数永远不要小于模型的输出大小。

    class Scenario_4_Model_2(nn.Module):
    def __init__(self, in_features=30, out_features=2):
    super().__init__()
    self.lin1 = nn.Linear(in_features, 50)
    self.lin2 = nn.Linear(50, out_features)
    def forward(self, x):
    x = F.relu(self.lin1(x))
    x = self.lin2(x)
    return x
    get_data_train_and_show(Scenario_4_Model_2(out_features=5), lr=0.001, n_classes=5)

    机器学习中训练和验证指标曲线图能告诉我们什么?

    总结

    以上就是一些常见的训练、验证时的曲线的示例,希望你在遇到相同情况时可以快速定位并且改进。


    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    业界资讯 机器学习
    相关文章 更多
    机器学习之父MichaelJordan:AGl是炒作,AI的下一个战场是经济学
    机器学习之父MichaelJordan:AGl是炒作,AI的下一个战场是经济学

    机器学习奠基人MichaelJordan认为AGI是公关炒作,AI的真正挑战在于让系统学会协调。他主张机器学习必须与经济学结合,关注不确定性、激励机制和数据流动等社会系统性问题,而非单纯追求模型能力。

    手写线程池,对照学习ThreadPoolExecutor线程池实现原理!
    手写线程池,对照学习ThreadPoolExecutor线程池实现原理!

    持续坚持原创输出,点击蓝字关注我吧 ❝ 沉淀、分享、成长,让自己和他人都能有所收获! ❞ 目录 一、前言二、面试题三、线程池讲解1. 先看个例子2. 手写一个线程池3. 线程池源码分析四、总结五、系列推荐一、前言人看手机,机器学习!正好是2020年,看到这张图还是蛮有意思的。以前小时候总会看到一些科

    deepseek-智能助手入口
    deepseek-智能助手入口

    当前数字时代,deepseek入口智能助手凭借前沿技术架构为用户带来革新体验 在如今这个数字浪潮翻涌的时代,deepseek入口智能助手凭借其前沿的技术架构,为用户带来了真正意义上的革新体验。这个平台巧妙融合了自然语言处理与知识图谱技术,能够精准解析那些看似复杂的语义需求,已然成为提升工作效率的智能

    用相关性分析消除“冗余特征”
    用相关性分析消除“冗余特征”

    刚开始学机器学习时,我也像大部分人 一样,有个很朴素的想法:特征越多,模型能学到的信息就越多,效果自然越好。 所以每次拿到数据,我就拼命往模型里塞特征——能算出来的统计量全加上,能衍生出来的比率全拼上。 一个原本 20 列的数据集,经常被我搞到七八十列。 然后我就发现事情不太对劲了: 训练时间明显变

    用方差阈值过滤掉“惰性特征”
    用方差阈值过滤掉“惰性特征”

    机器学习实战中,大家往往把精力花在调参和选模型上,却忽略了一个更基础的问题:喂给模型的数据里,有多少特征是真正有用的? 刚开始学机器学习那会儿,很多人特别喜欢堆特征——不管有用没用先一股脑全塞进去,总觉得特征越多模型越聪明。直到有一次跑练习数据集,X_train.shape 直接干到了 (50000

    超细空气颗粒物每年致约199万人早亡
    超细空气颗粒物每年致约199万人早亡

    空气中直径小于100纳米的超细颗粒物每年导致约199万人早逝,其中近半因心血管疾病。该颗粒物主要来自化石燃料,可通过呼吸进入血液,引发氧化应激和内皮功能紊乱,是未被充分认识的心血管危险因素。若年均浓度控制在每立方厘米5000个以下,全球超额死亡率可降低约45%。

    当我们用错误的尺子量对了东西,会发生什么?
    当我们用错误的尺子量对了东西,会发生什么?

    这项研究来自Ezgi Korkmaz,论文以预印本形式发布于2026年7月8日,编号为arXiv:2607.07769,发表于cs.LG(机器学习)领域,并将出版于2026年人工智能促进协会(AAAI)会议论文集。有兴趣深入了解的读者可以通过arXiv编号2607.07769查询完整论文。 深度强化

    学少儿编程还是机器人编程
    学少儿编程还是机器人编程

    机器人编程侧重硬件组装与程序驱动,编程受限于特定机器人;少儿编程系统化教授编程知识,从Scratch启蒙延伸至Python、C++等高级语言。两者各有侧重,选择取决于希望孩子提升的能力方向。

    少儿编程分类全解析:软件编程 VS 硬件编程,孩子该怎么选?
    少儿编程分类全解析:软件编程 VS 硬件编程,孩子该怎么选?

    少儿编程分为软件与硬件两大方向。软件编程侧重逻辑与代码能力,含图形化、Python、C++,适配学业竞赛;硬件编程侧重动手与工程实践,含乐高搭建与机器人。选择应基于孩子兴趣与年龄。

    Python 基础(一):入门必备知识
    Python 基础(一):入门必备知识

    学习Python,从基础语法开始是最稳妥的路径。这篇文章整理了Python入门阶段必须掌握的核心概念,包括标识符、关键字、引号、编码、输入输出、缩进、多行、注释、数据类型以及运算符等,后面还整理了基础进阶、爬虫、自动化、数据分析、小游戏、趣味项目以及自学路线等系列内容,方便你按需查阅。 目录 1 标

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。