时序数据交叉验证方法与python实现

2023-11-02

传统N折交叉验证方法

传统的N折交叉验证示意图如下图所示:

在这里插入图片描述

时序数据交叉验证方法

由于时间序列数据存在时序关系,因此数据之间的值存在一定的连续性,使用未来的数据验证过去的结果会使模型的验证方法不适合时序数据。

因此,在处理时序数据时,可以使用以下三种方法使用交叉验证方法来验证模型的稳定性:

方法1:窗口拆分

示意图如下:

在这里插入图片描述

方法2:带间隔的窗口拆分

示意图如下:

在这里插入图片描述

方法3:拓展窗口切分

示意图如下:

在这里插入图片描述

时序交叉验证python复现

import pandas as pd


def window_rolling_cross_val(time_index: list, train_span=3, val_span=1, split=10, gap=0):
    """窗口拆分
    :param time_index:时序数据
    :param train_span:训练数据
    :param val_span:验证数据
    :param split:将原始数据切分为多少个基本单位
    :param gap:(带间隔的)间隔
    """
    single_step = int(len(time_index) / split)  # 单份长度
    for _index in range(split - (train_span + val_span + gap) + 1):
        train_start_index = _index * single_step  # 训练集的起始位置
        train_end_index = train_start_index + train_span * single_step  # 训练集的终止位置
        val_start_index = train_end_index + gap * single_step  # 验证集的起始位置
        val_end_index = val_start_index + val_span * single_step  # 验证集的终止位置
        train_data = time_index[train_start_index:train_end_index]
        val_data = time_index[val_start_index:val_end_index]
        print(f'train_data: {train_data} val_data:{val_data}')


def expand_cross_val(time_index: list, start_train_span=3, val_span=1, split=10):
    """拓展窗口切分
    :param time_index:时序数据
    :param start_train_span:训练数据
    :param val_span:验证数据
    :param split:将原始数据切分为多少个基本单位
    """
    single_step = int(len(time_index) / split)  # 单份长度
    for _index in range(split - ((start_train_span + val_span) - 1)):
        train_start_index = 0  # 训练集的起始位置
        train_end_index = train_start_index + (_index + start_train_span) * single_step  # 训练集的终止位置
        val_start_index = train_end_index  # 验证集的起始位置
        val_end_index = val_start_index + val_span * single_step  # 验证集的终止位置
        train_data = time_index[train_start_index:train_end_index]
        val_data = time_index[val_start_index:val_end_index]
        print(f'train_data: {train_data} val_data:{val_data}')


def main():
    time_list = pd.date_range("2023-01-01", "2023-02-01").strftime("%Y-%m-%d").tolist()
    window_rolling_cross_val(time_list[:20], train_span=3, val_span=1, gap=2)
    print('====================')
    expand_cross_val(time_list[:20], start_train_span=4, val_span=4)


if __name__ == '__main__':
    main()

得到最终的结果:

train_data: ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06'] val_data:['2023-01-11', '2023-01-12']
train_data: ['2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08'] val_data:['2023-01-13', '2023-01-14']
train_data: ['2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10'] val_data:['2023-01-15', '2023-01-16']
train_data: ['2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12'] val_data:['2023-01-17', '2023-01-18']
train_data: ['2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13', '2023-01-14'] val_data:['2023-01-19', '2023-01-20']
====================
train_data: ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08'] val_data:['2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13', '2023-01-14', '2023-01-15', '2023-01-16']
train_data: ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10'] val_data:['2023-01-11', '2023-01-12', '2023-01-13', '2023-01-14', '2023-01-15', '2023-01-16', '2023-01-17', '2023-01-18']
train_data: ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12'] val_data:['2023-01-13', '2023-01-14', '2023-01-15', '2023-01-16', '2023-01-17', '2023-01-18', '2023-01-19', '2023-01-20']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时序数据交叉验证方法与python实现 的相关文章

随机推荐

  • IE被www.537.com,www.COXDX.INFO劫持,修复~

    一位同事的电脑中IE一直使用265网址导航作首页 这天忽然变成hxxp www COXDX INFO z012了 修改不回来 请我帮忙检修 打开Internet选项 手动修改首页为http www 265 com 但总不能生效 将该电脑中的
  • Qt5学习笔记:Qt两个窗口(Widget)间传递数据

    0x01 原理介绍 Qt两个窗口之间传递数据实际上还是利用了信号与槽的概念来实现 本质上讲 我们只需要实现A窗口发射信号 B窗口槽函数响应信号即可 首先我们在A窗口的头文件中定义发射的信号 signals void sendSignal Q
  • 如何进行网站性能优化?

    分享人 chenxingxing 目录 1 背景介绍 2 知识剖析 3 常见问题 4 解决方案 5 编码实战 6 扩展思考 7 参考文献 8 更多讨论 一 背景介绍 前端优化的目的 1 用户 体验好 2 服务商 节省资源 简而言之 就是在不
  • mq的概念

    1 延迟队列 概念 延迟队列存储的是对应的延迟消息 所谓 延迟消息 是指当消息被发送以后 并不想让消费者立刻拿到消息 而是等待特定时间后 消费者才能拿到这个消息进行消费 应用场景 当你在网上购物的时候是否会遇到这样的提示 十分钟之内未付款
  • SDC时序约束 - create_clock

    在写 sdc约束文件时 要做的第一件事情就是使用create clock对进入FPGA的时钟进行约束 其语法格式如下 create clock add name
  • Ranger配置HDFS报错:curl: (3) [globbing] nested braces not supported at pos 2

    Ambari上显示错误信息 2017 11 06 13 01 00 618 Will retry 65 time s caught exception u Execution of curl location trusted k negot
  • 【Matlab】提取excel中的数据画折线图

    1 前言 在日常数据分析时 将数据保存为xlsx的格式进行存储 本文利用xlsread函数对excel数据进行提取 并利用其数据进行二维图像的绘制 2 excel中数据内容 3 代码 1代表sheet1 pwd xlsread C User
  • 第二周-目录命名规则及用途,文件的元数据,软连接和硬连接

    1 描述Linux发行版的系统目录名称命名规则以及用途 命名规则 文件和目录被组织成一个单根倒置树结构 文件系统从根目录下开始 用 表示 文件名称区分大小写 文件系统分层结构 LSB Linux Standard Base 标准Linux文
  • 初识vue3

    对vue3的理解 2020年9月发布的正式版 vue3支持大多数的Vue2的特性 Vue中设计了一套强大的组合APi代替了Vue2中的option API 复用性更强了 更好的支持TS 最主要 Vue3中使用了Proxy配合Reflect代
  • notepad++中配置python IDE

    操作系统是windows7 notepad 版本是5 9 6 2的安装版 python版本是2 7 2 windows7下的python安装配置在http blog csdn net gabriel1026 article details
  • 《算法和数据结构》数学基础总结

    前言 算法是什么 数学是什么 算法中的数学又是什么 这篇文章 让我来为大家介绍下法中的数学基础 数学可以说是算法的基石 所谓万丈高楼平地起 如若根基不稳 那么再高的楼 也只是豆腐渣工程 随时都有塌陷的可能 所以数学之于算法 可谓 非常重要
  • vmware 虚拟机开机自启动脚本

    1 建立一个txt文件 D VMware VMware Workstation vmrun exe T ws start I Documents Virtual Machines centos centos vmx nogui 注意 如果路
  • Python学习之爬取网页图片(单张)

    import requests import os os 库是Python标准库 包含几百个函数 常用的有路径操作 进程管理 环境参数等 root D pictures url input 请输入图片链接 让用户输入图片链接 path ro
  • 【JVM】JVM内存模型(详细)

    目录 一 JVM概述 1 jvm简介 2 jvm作用 3 jvm的内存模型 二 类加载器 1 类加载器的作用 2 加载器的类型 3 双亲委派机制的运行过程 4 双亲委派机制优缺点 5 为什么要破坏双亲委派机制 6 破坏双亲委派机制的方式 三
  • 函数调用堆栈的过程

    函数在进行调用时会产生开栈和清栈的操作 那么就来介绍一下函数调用堆栈的过程吧 首先 利用一个小例子来研究这个过程 include
  • Android禁止view上下滑动,Android RecyclerView禁止滑动

    在开发时 数组返回数目很少 需求要求不能左右滑动 下面是一种解决方案 1 RecyclerView 为垂直状态 VERTICAL 下 LinearLayoutManager layoutManager new LinearLayoutMan
  • 1929:【04NOIP普及组】火星人

    题干 这道题有好多废话 不过和全排列非常像 全排列题目 所以这道题数字的大小顺序与全排列的默认顺序一模一样 全排列的代码 在这里 本题就是一次次地调用全排列 不愿意麻烦的 就是我 可以用STL 非常方便 代码 100分 include
  • Stream:findFirst()高效简洁遍历集合中的一个元素

    业务开发中会运用到很多的List
  • sonarqube项目按权限分配

    一 创建用户 进入sornarqube的配置中心 选择权限菜单下的用户菜单 然后点击Create User按钮 只要输入登录名 用户名与密码保存后就可以创建一个新用户 二 创建组 选择权限下的群组菜单进入用户组管理页面 点击Create G
  • 时序数据交叉验证方法与python实现

    文章目录 传统N折交叉验证方法 时序数据交叉验证方法 方法1 窗口拆分 方法2 带间隔的窗口拆分 方法3 拓展窗口切分 时序交叉验证python复现 传统N折交叉验证方法 传统的N折交叉验证示意图如下图所示 时序数据交叉验证方法 由于时间序