深度学习 动态交叉验证v1.0

news2024/12/23 5:16:07
# 执行特征工程(交叉验证)
def perform_feature_engineering(df, features):
    # 根据 features 中的内容选择特征生成函数
    if 'typical_ma' in features:
        df = calculate_typical_ma(df, window=10)
    if 'RSI' in features:
        df = calculate_rsi(df, column_name='Close', window=14)
    # 其他特征的生成函数,按照类似的方式添加

    # 合并所有特征
    selected_features = ['date', 'Open', 'Close', 'High', 'Low', 'Volume']
    selected_features.extend(features)  # 将 features 中的特征添加到选定特征中
    df = df[selected_features]

    # 补全缺失值
    for feature in features:
        df[feature].fillna(method='bfill', inplace=True)

    return df
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta
from keras.models import Sequential
from keras.layers import Dense, LSTM, GRU, Conv1D, Flatten, Dropout
from sklearn.preprocessing import StandardScaler
from keras.optimizers import Adam
import matplotlib.dates as mdates
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import TimeSeriesSplit
from tensorflow.keras.models import Sequential
from feature_engineering import calculate_rsi,calculate_typical_ma,perform_feature_engineering
from keras.callbacks import EarlyStopping
from keras.callbacks import LearningRateScheduler
from keras.regularizers import l2
from keras.layers import BatchNormalization
from keras import backend as K

K.clear_session()
look_back = 7
# 定义学习率调度函数
def lr_schedule(epoch):
    lr = 0.1
    if epoch > 50:
        lr = 0.01
    if epoch > 100:
        lr = 0.001
    return lr
# 创建 LearningRateScheduler 回调函数
lr_scheduler = LearningRateScheduler(lr_schedule)

# 定义函数以创建数据集
def create_dataset(dataset, look_back):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), :] 
        dataX.append(a)
        dataY.append(dataset[i + look_back])
    return np.array(dataX), np.array(dataY)

# 读取数据
df = pd.read_excel('C:/Users/47418/Desktop/data3.xlsx', sheet_name='Sheet1', parse_dates=['date'])


# 构建模型
model = Sequential()
model.add(Flatten(input_shape=(look_back, 1)))
model.add(Dense(64, activation='relu', kernel_regularizer=l2(0.01)))  # 通过减少或增加层数来调整
model.add(Dropout(0.3))
model.add(Dense(32, activation='relu', kernel_regularizer=l2(0.01)))  #神经元数量是32
model.add(Dropout(0.3))
model.add(BatchNormalization(momentum=0.9))#批量归一化
model.add(Dense(1, activation='linear'))

# 编译模型,调整学习率
optimizer = Adam()  # 调整 learning_rate 的值
model.compile(optimizer=optimizer, loss='mean_squared_error', metrics=['mae', 'mse'])

feature_combinations = [
    ['typical_ma'],
    ['typical_ma', 'RSI'],
    # 其他特征组合
]
prediction_results = {}  # 用于存储预测值的字典
performance_results = [] # 记录调试数据的变量
results_list = [] # 存储每次测试的结果、特征组合和参数
for features in feature_combinations:
    # 调用特征工程函数
    df = perform_feature_engineering(df, features)

    print(df.to_string())
   
    # 获取数据值(根据交叉验证的特征调整)
    feature_columns = ['date', 'Open', 'Close', 'High', 'Low', 'Volume'] + [f for feature in features for f in [feature]]  # 对于features这个列表中的每个元素feature,将[feature]这个列表中的每个元素f添加到新的列表中。
    values = df[feature_columns].iloc[:, 1:].values


    # 将数据值缩放到0和1之间
    scaler = MinMaxScaler(feature_range=(0, 1))
    values_normalized = scaler.fit_transform(values.reshape(-1, 1)) 

    # 创建训练集、验证集和测试集
    train_size = int(len(values_normalized) * 0.67)
    val_size = int(len(values_normalized) * 0.15)
    test_size = len(values_normalized) - train_size - val_size
    train, val, test = values_normalized[0:train_size, :], values_normalized[train_size:train_size+val_size, :], values_normalized[train_size+val_size:, :] 

    # 将输入重塑为 [样本,时间步长,特征]
    trainX, trainY = create_dataset(train, look_back=look_back)
    valX, valY = create_dataset(val, look_back=look_back)

    trainX = np.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1)) 
    valX = np.reshape(valX, (valX.shape[0], valX.shape[1], 1))

    # 定义 TimeSeriesSplit
    n_splits = 7
    tscv = TimeSeriesSplit(n_splits=n_splits)
    print(f"交叉验证的折数:\n", n_splits)
    split_results = []

    for train_index, test_index in tscv.split(trainX):
        X_train, X_test = trainX[train_index], trainX[test_index]
        y_train, y_test = trainY[train_index], trainY[test_index]
        split_results.append((X_train, X_test, y_train, y_test))
        # 在这里训练模型,评估模型等等
        # X_train, y_train 是训练集的输入和输出
        # X_test, y_test 是验证集的输入和输出
        

    # 训练模型
    early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
    lr_scheduler = LearningRateScheduler(lr_schedule)
    history = model.fit(trainX, trainY, epochs=700, batch_size=8, verbose=4, validation_data=(valX, valY), callbacks=[early_stopping, lr_scheduler], shuffle=False)

    # 预测未来5天的数据
    future_data_normalized = model.predict(np.reshape(values_normalized[-look_back:], (1, look_back, 1)))

    # 反向转换归一化的数据为实际数据
    predicted_data = scaler.inverse_transform(future_data_normalized)


    # 记录性能指标
    metrics = model.evaluate(valX, valY, verbose=0)
    
    # 记录预测值
    future_data_normalized = model.predict(np.reshape(values_normalized[-look_back:], (1, look_back, 1)))
    predicted_data = scaler.inverse_transform(future_data_normalized)
    
    # 存储结果、特征组合和参数到字典
    result_dict = {
        'Features': features,
        'Loss': metrics[0],
        'MAE': metrics[1],
        'MSE': metrics[2],
        'Predicted_Data': predicted_data.squeeze().tolist(),
        # 其他参数...
    }
    
    results_list.append(result_dict)

# 将字典列表转换为 DataFrame
results_df = pd.DataFrame(results_list)

# 保存 DataFrame 到 Excel 文件
results_df.to_excel('C:/Users/47418/Desktop/results_comparison.xlsx', index=False)








本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1315102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++11特性篇】利用 { } 初始化(1)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.回顾C98标准中{}的使用二.一切皆可用…

新钛云服助力爱达邮轮·魔都号首航,保驾护航,共创辉煌

随着2024年1月1日的临近,中国首艘国产大型邮轮——爱达邮轮魔都号即将迎来激动人心的首航时刻。作为爱达邮轮的IT系统运维和安全服务伙伴,新钛云服有幸提前登船体验,并为魔都号即将到来的航行提供全面的技术支持与保障。 爱达魔都号&#xff…

代驾系统开发:驶向未来的智能交通服务

随着科技的迅速发展,代驾系统的开发成为改善出行体验和提升交通服务智能化的重要一环。本文将聚焦于代驾系统开发的技术创新,为读者呈现其中涉及的一些令人振奋的技术代码。 1. 区块链技术的运用: 区块链技术被引入代驾系统,可…

网站监控/定时任务/网站网址URL状态监控神器

源码介绍: 这是一款在线监控网址的源码,对于有多个网站的站长来说还是非常有用的。也可以做为一项收费服务对外提供。这个程序没啥问题,就是UI有点简单,不影响使用。 网站监控/定时任务/网站网址URL状态监控神器,可以…

MFC逆向之CrackMe Level3 过反调试 + 写注册机

今天我来分享一下,过反调试的方法以及使用IDA还原代码 写注册机的过程 由于内容太多,我准备分为两个帖子写,这个帖子主要是写IDA还原代码,下一个帖子是写反调试的分析以及过反调试和异常 这个CrackMe Level3是一个朋友发我的,我也不知道他在哪里弄的,我感觉挺好玩的,对反调试…

Spark RDD、DataFrame、DataSet比较

在Spark的学习当中,RDD、DataFrame、DataSet可以说都是需要着重理解的专业名词概念。尤其是在涉及到数据结构的部分,理解清楚这三者的共性与区别,非常有必要。 RDD,作为Spark的核心数据抽象,是Spark当中不可或缺的存在…

【华为数据之道学习笔记】5-4 数据入湖方式

数据入湖遵循华为信息架构,以逻辑数据实体为粒度入湖,逻辑数据实体在首次入湖时应该考虑信息的完整性。原则上,一个逻辑数据实体的所有属性应该一次性进湖,避免一个逻辑实体多次入湖,增加入湖工作量。 数据入湖的方式…

Codeforces Round 914 (Div. 2) A~E

A.Forked!(思维) 题意: 给出骑士的跳跃能力 ( x , y ) (x, y) (x,y) 以及国王和皇后的位置,问有多少个位置可以让骑士可以直接攻击到国王和皇后。 分析: 棋盘非常大 ( 1 0 8 1 0 8 ) (10^{8} \times 10^{8}) (1…

基于ssm物流管理系统论文

摘 要 本物流管理系统设计目标是实现物流的信息化管理,提高管理效率,使得物流管理作规范化、科学化、高效化。 本文重点阐述了物流管理系统的开发过程,以实际运用为开发背景,基于SSM框架,运用了Java编程语言和MYSQL数…

C++:命名空间

从今天正式开始对C的学习&#xff0c;这里只学习C对C的拓展&#xff0c;和C相同的部分在C语言专栏中都可以找到&#xff0c;我们先看一段C代码 #include<iostream> using namespace std; int main() {cout<<"hello world<<endl;return 0; } 同样也是打…

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;按键、无源蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管默认显示第一种门铃音调&#xff0c;可通过K1键切…

力扣第一题-两数之和[简单]

题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任…

陈年葡萄酒里面有什么奥秘?

自古希腊和古罗马以来&#xff0c;陈年葡萄酒就令美食家着迷。很自然&#xff0c;许多人会认为酒越陈越香。只有一个问题:这不是真的。世界上绝大多数的葡萄酒一旦你购买了它们就会在一两年之内被品尝掉。葡萄酒是一种活的食物&#xff0c;当你打开软木塞或拧开金属螺旋盖时&am…

2023年底总结丨5大好用的局域网监控软件

不知不觉间2023年又到结尾了&#xff0c;今年我们服务过很多想要电脑监控软件的客服&#xff0c;也服务了很多想要加密软件的客户。 这一年&#xff0c;我们走得不疾不徐&#xff0c;走得稳而坚定&#xff1b;这一年&#xff0c;我们累积服务超过万计客户&#xff1b;这一年&a…

什么是质量工程?

质量工程是在精益、敏捷、DevOps等实践基础上进一步发展出的系统化赋能软件开发流程、构建既快又好的开发框架的实践。原文: What is Quality Engineering 我们基于古法语"definer"的定义&#xff0c;通过澄清边界、要素和相互作用的方式来构建某个概念&#xff0c;本…

二维差分详解

前言 上一期我们分享了一维差分的使用方法&#xff0c;这一期我们将接着上期的内容带大家了解二位差分的使用方法&#xff0c;话不多说&#xff0c;LET’S GO!&#xff08;上一期链接&#xff09; 二维差分 二维差分我们可以用于对矩阵区间进行多次操作的题。 二维差分我们还…

关于“Python”的核心知识点整理大全23

目录 ​编辑 第&#xff11;0 章 文件和异常 10.1 从文件中读取数据 10.1.1 读取整个文件 pi_digits.txt file_reader.py 10.1.2 文件路径 10.1.3 逐行读取 file_reader.py 10.1.4 创建一个包含文件各行内容的列表 10.1.5 使用文件的内容 pi_string.py 往期快速传…

【从零开始学习--设计模式--装饰者模式】

返回首页 前言 感谢各位同学的关注与支持&#xff0c;我会一直更新此专题&#xff0c;竭尽所能整理出更为详细的内容分享给大家&#xff0c;但碍于时间及精力有限&#xff0c;代码分享较少&#xff0c;后续会把所有代码示例整理到github&#xff0c;敬请期待。 此章节介绍装…

关于“Python”的核心知识点整理大全14

目录 ​编辑 7.2.2 让用户选择何时退出 parrot.py 7.2.3 使用标志 7.2.4 使用 break 退出循环 cities.py 7.2.5 在循环中使用 continue counting.py 7.2.6 避免无限循环 counting.py 7.3 使用 while 循环来处理列表和字典 7.3.1 在列表之间移动元素 confirmed_user…

虚拟网络管理解决方案

随着业务规模的扩大&#xff0c;其网络的规模和复杂性也成比例地扩大&#xff0c;企业级组织和中小型企业需要大规模网络来满足不断增长的业务需求&#xff0c;然而&#xff0c;大规模网络需要大量的物理组件、定期维护和配置&#xff0c;所有这些都是有代价的&#xff0c;因此…