【人工智能概论】 K折交叉验证

这篇具有很好参考价值的文章主要介绍了【人工智能概论】 K折交叉验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【人工智能概论】 K折交叉验证


一. 简单验证及其缺点

1.1 简单验证简介

  • 简单验证: 将原始数据集随机划分成训练集和验证集两部分,例,将数据按照7:3的比例分成两部分,70%的样本用于训练模型;30%的样本用于模型验证,如下图。

k折交叉验证,【人工智能概论】,人工智能,深度学习,机器学习

1.2 简单验证的缺点

  • 数据都只被用了一次;
  • 验证集上计算出来的评估指标与原始分组有很大关系;
  • 对于时序序列,要保存时序信息,往往不能打乱数据的顺序对数据进行随机截取,这就带来了问题,比如总用春、夏、秋的数据做训练,用冬的数据做测试,这显然是有问题的,是不能容忍的。

二. K折交叉验证

  • 为了解决简单交叉验证的不足,引出K折交叉验证,其既可以解决数据集的数据量不够大的问题,也可以解决参数调优的问题。。

2.1 K折交叉验证的思路

  1. 首先,将全部样本划分成k个大小相等的样本子集;
  2. 依次遍历这k个子集,每次把当前子集作为验证集,其余所有样本作为训练集,进行模型的训练和评估;
  3. 最后把k次评估指标的平均值作为最终的评估指标。在实际实验中,k通常取10,如下图。

k折交叉验证,【人工智能概论】,人工智能,深度学习,机器学习文章来源地址https://www.toymoban.com/news/detail-720070.html

2.2 小细节

  • K折交叉验证中有这样一个细节,下一折的训练不是在上一折的基础上进行的,即每训练新的一折都要重新初始化模型参数。
  • K折交叉验证只能做验证使用,因此不能根据它的结果做为模型参数的保存判断依据,但可以基于它做超参组合的确定与模型结构的调整,然后再重新初始化模型,进行训练得到较好的模型参数。
  • 对于有时序信息的数据,要看看不同折之间性能表现会不会有明显差距。

2.3 K折交叉验证的缺点

  • 因为K折交叉验证执行一次训练的总轮数是每一折的训练轮数(epochs)与总折数(K)的乘积,因此训练的成本会翻倍。

2.4 K折交叉验证的代码

import torch
import random
from torch.utils.data import DataLoader, TensorDataset
from Model.ReconsModel.Recoder import ReconsModel, Loss_function
from Model.ModelConfig import ModelConfig

# 返回第 i+1 折(i取 0 ~ k-1)的训练集(train)与验证集(valid)
def get_Kfold_data(k, i, x):  # k是折数,取第i+1折,x是特征数据
    fold_size = x.size(0) // k  # 计算每一折中的数据数量
    val_start = i * fold_size  # 第 i+1折 数据的测试集初始数据编号
    if i != k - 1:  # 不是最后一折的话,数据的分配策略
        val_end = (i + 1) * fold_size  # 验证集的结束
        valid_data = x[val_start: val_end]
        train_data = torch.cat((x[0: val_start], x[val_end:]), dim=0)
    else:  # 如果是最后一折,数据的分配策略,主要涉及到不能K整除时,多出的数据如何处理
        valid_data = x[val_start:]  # 实际上,多出来的样本,都放在最后一折里了
        train_data = x[0: val_start]

    return train_data, valid_data


# k折交叉验证,某一折的训练
def train(model, train_data, valid_data, batch_size, lr,epochs):
    # 数据准备
    train_loader = DataLoader(TensorDataset(train_data), batch_size, shuffle=True)
    valid_loader = DataLoader(TensorDataset(valid_data), batch_size, shuffle=True)

    # 损失函数,优化函数的准备
    criterion = Loss_function()
    optimizer = torch.optim.Adam(params=model.parameters(), lr=lr)

    # 记录每一个epoch的平均损失
    train_loss = []
    valid_loss = []


    for epoch in range(epochs):
        tra_loss = 0
        val_loss = 0
        for i , data in enumerate(train_loader):

            # 假设数据的处理 此时的data是list类型的数据,转化成Tensor,并且把多出来的第0维去掉
            data = torch.stack(data)
            data = data.squeeze(0)


            optimizer.zero_grad()  # 梯度清零
            recon, mu, log_std = model(data, if_train=True)  # if_train不能少

            # 计算损失
            loss = criterion.loss_function(recon, data, mu, log_std)

            # 反向传播
            loss.backward()
            optimizer.step()

            tra_loss = tra_loss + loss.item()
        tra_loss = tra_loss / len(train_data)
        train_loss.append(tra_loss)

        # 计算测试集损失
        with torch.no_grad():
            for i, data in enumerate(valid_loader):

                # 假设数据的处理 此时的data是list类型的数据,转化成Tensor,并且把多出来的第0维去掉
                data = torch.stack(data)
                data = data.squeeze(0)

                optimizer.zero_grad()

                recon, mu, log_std = model(data, if_train=False)

                test_loss = criterion.loss_function(recon, data, mu, log_std).item()

                val_loss = val_loss + test_loss
            val_loss = val_loss / len(valid_data)
            valid_loss.append(val_loss)

        print('第 %d 轮, 训练的平均误差为%.3f, 测试的平均误差为%.3f 。'%(epoch+1, tra_loss, val_loss))
    return train_loss, valid_loss

# k折交叉验证
def k_test(config, datas): # k是总折数,
    valid_loss_sum = 0

    for i in range(config.k):

        model = ReconsModel(config) # 细节,每一折,并不是在上一折训练好的模型基础上继续训练,而是重新训练

        print('-'*25,'第',i+1,'折','-'*25)

        train_data , valid_data = get_Kfold_data(config.k, i, datas) # 获取某一折的训练数据、测试数据

        train_loss, valid_loss = train(model, train_data, valid_data, config.batch_size, config.lr, config.epochs)

        # 求某一折的平均损失
        train_loss_ave = sum(train_loss)/len(train_loss)
        valid_loss_ave = sum(valid_loss)/len(valid_loss)
        print('-*-*-*- 第 %d 折, 平均训练损失%.3f,平均检验损失%.3f -*-*-*-'%(i+1, train_loss_ave,valid_loss_ave))
        valid_loss_sum = valid_loss_sum + valid_loss_ave

    valid_loss_k_ave = valid_loss_sum / config.k  # 基于K折交叉验证的验证损失
    print('*' * 60, )
    print('基于K折交叉验证的验证损失为%.4f'%valid_loss_k_ave)




if __name__ == "__main__":
    # 创建数据集,或者说数据集只要是这样的形式即可
    X = torch.rand(5000, 16, 38)  # 5000条数据,,每条有16个时间步,每步38个特征,时序数据

    # 随机打乱
    index = [i for i in range(len(X))]
    random.shuffle(index)
    X = X[index]  # 要是有标签的话,index要对得上

    config = ModelConfig()
    config.load('./Model/config.json')

    k_test(config, X)

到了这里,关于【人工智能概论】 K折交叉验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能之深度学习

    第一章 人工智能概述 1.1人工智能的概念和历史 1.2人工智能的发展趋势和挑战 1.3人工智能的伦理和社会问题 第二章 数学基础 1.1线性代数 1.2概率与统计 1.3微积分 第三章 监督学习 1.1无监督学习 1.2半监督学习 1.3增强学习 第四章 深度学习 1.1神经网络的基本原理 1.2深度学习的

    2024年02月09日
    浏览(44)
  • 人工智能深度学习

    目录 人工智能 深度学习 机器学习 神经网络 机器学习的范围 模式识别 数据挖掘 统计学习 计算机视觉 语音识别 自然语言处理 机器学习的方法 回归算法 神经网络 SVM(支持向量机) 聚类算法 降维算法 推荐算法 其他 机器学习的分类 机器学习模型的评估 机器学习的应用 机

    2024年02月22日
    浏览(49)
  • 【人工智能概论】 XGBoost应用——特征筛选

    换一个评价指标,特征排序结果就会不一样,甚至同样的数据同样的方法多次执行得到的结果也不是完全一样,特征筛选这件事见仁见智,要理性看待,但确实可以提供一种交叉验证的角度。 使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个特征的重要

    2024年01月23日
    浏览(50)
  • 人工智能、机器学习、深度学习的区别

    人工智能涵盖范围最广,它包含了机器学习;而机器学习是人工智能的重要研究内容,它又包含了深度学习。 人工智能是一门以计算机科学为基础,融合了数学、神经学、心理学、控制学等多个科目的交叉学科。 人工智能是一门致力于使计算机能够模拟、模仿人类智能的学

    2024年02月08日
    浏览(46)
  • 深度学习:探索人工智能的前沿

    人工智能(Artificial Intelligence,简称AI)是一门研究如何使计算机能够执行通常需要人类智能的任务的领域。从早期的符号推理到现代的深度学习,人工智能经历了漫长的发展过程。 20世纪50年代,AI的奠基性工作开始,研究者们试图通过符号推理来模拟人类思维过程。然而,

    2024年01月19日
    浏览(64)
  • 人工智能的深度学习如何入门

    人工智能深度学习近年来成为热门的技术领域,被广泛应用于许多领域,如自然语言处理、图像识别、机器翻译等。学习人工智能深度学习需要具备一定的数学和编程基础,但对于初学者来说,并不需要过于复杂的数学和编程知识。本文将介绍人工智能深度学习的基本概念和

    2024年03月27日
    浏览(52)
  • 机器学习、人工智能、深度学习三者的区别

    目录 1、三者的关系 2、能做些什么 3、阶段性目标 机器学习、人工智能(AI)和深度学习之间有密切的关系,它们可以被看作是一种从不同层面理解和实现智能的方法。 人工智能(AI):人工智能是一门研究如何使计算机能够模仿人类智能的学科。它涵盖了各种技术和方法,

    2024年02月14日
    浏览(50)
  • 一探究竟:人工智能、机器学习、深度学习

    1.1 人工智能是什么?          1956年在美国Dartmounth 大学举办的一场研讨会中提出了人工智能这一概念。人工智能(Artificial Intelligence),简称AI,是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的

    2024年02月17日
    浏览(41)
  • 12、人工智能、机器学习、深度学习的关系

    很多年前听一个机器学习的公开课,在QA环节,一个同学问了老师一个问题“ 机器学习和深度学习是什么关系 ”? 老师先没回答,而是反问了在场的同学,结果问了2-3个,没有人可以回答的很到位,我当时也是初学一脸懵,会场准备的小礼品也没有拿到。 后来老师解释“机

    2024年02月05日
    浏览(61)
  • 机器学习入门教学——人工智能、机器学习、深度学习

    1、人工智能 人工智能相当于人类的代理人,我们现在所接触到的人工智能基本上都是弱AI,主要作用是正确解释从外部获得的数据,并对这些数据加以学习和利用,以便灵活的实现特定目标和任务。 例如: 阿尔法狗、智能汽车 简单来说: 人工智能使机器像人类一样进行感

    2024年02月09日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包