风速预测(一)数据集介绍和预处理

  往期精彩内容:

时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客

风速预测(一)数据集介绍和预处理-CSDN博客

风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客

风速预测(三)EMD-LSTM-Attention模型-CSDN博客

风速预测(四)基于Pytorch的EMD-Transformer模型-CSDN博客

风速预测(五)基于Pytorch的EMD-CNN-LSTM模型-CSDN博客

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型-CSDN博客

风速预测(七)VMD-CNN-BiLSTM预测模型-CSDN博客

CEEMDAN +组合预测模型(BiLSTM-Attention + ARIMA)-CSDN博客

CEEMDAN +组合预测模型(CNN-LSTM + ARIMA)-CSDN博客

CEEMDAN +组合预测模型(Transformer - BiLSTM+ ARIMA)-CSDN博客

 CEEMDAN +组合预测模型(CNN-Transformer + ARIMA)-CSDN博客

多特征变量序列预测(一)——CNN-LSTM风速预测模型-CSDN博客

多特征变量序列预测(二)——CNN-LSTM-Attention风速预测模型-CSDN博客

多特征变量序列预测(三)——CNN-Transformer风速预测模型-CSDN博客

多特征变量序列预测(四)Transformer-BiLSTM风速预测模型-CSDN博客

多特征变量序列预测(五) CEEMDAN+CNN-LSTM风速预测模型-CSDN博客

多特征变量序列预测(六) CEEMDAN+CNN-Transformer风速预测模型-CSDN博客

多特征变量序列预测(七) CEEMDAN+Transformer-BiLSTM预测模型-CSDN博客

基于麻雀优化算法SSA的CEEMDAN-BiLSTM-Attention的预测模型-CSDN博客

基于麻雀优化算法SSA的CEEMDAN-Transformer-BiGRU预测模型-CSDN博客

多特征变量序列预测(八)基于麻雀优化算法的CEEMDAN-SSA-BiLSTM预测模型-CSDN博客

多特征变量序列预测(九)基于麻雀优化算法的CEEMDAN-SSA-BiGRU-Attention预测模型-CSDN博客

多特征变量序列预测(10)基于麻雀优化算法的CEEMDAN-SSA-Transformer-BiLSTM预测模型-CSDN博客

超强预测算法:XGBoost预测模型-CSDN博客

VMD + CEEMDAN 二次分解,BiLSTM-Attention预测模型-CSDN博客

基于麻雀优化算法SSA的预测模型——代码全家桶-CSDN博客

1 风速数据集来源

        国内气象站点的数据因为其保密性和版权问题,往往难以下载,不少数据网站通过国外气象站点的观测数据进行处理转换,得到国内城市区域的气象数据,都采用收费形式才能获取,本文提供一些免费获取风速数据的平台:

1.1 美国国家海洋和大气管理局(NOAA)下设的国家环境信息中心(NCEI)  

地址:https://www.ncei.noaa.gov/data/global-summary-of-the-day/archive/

数据包括1929——2022年的气象数据

1.2 美国国家航空航天局-地球数据

地址:https://www.earthdata.nasa.gov/

1.3 kaggle平台

地址:https://www.kaggle.com/

kaggle平台是机器学习和数据科学社区,里面有大量的数据集,直接搜索"wind speed",可以看到有上百个数据集

简单介绍两个排名靠前的高分数据集,

  • 一个数据集比较大,是巴西气候地表数据-每小时,2000年至2021年间122个气象站的小时气候数据,

    地址:https://www.kaggle.com/datasets/PROPPG-PPG/hourly-weather-surface-brazil-southeast-region

  • 另一个数据集小一点,是本文采用的数据集(文末附数据集

    地址:https://www.kaggle.com/datasets/budincsevity/

    szeged-weather/

2 数据集介绍

本文采用kaggle平台数据集:2006年至2016年塞格德的气象数据,包括每小时/每日数据,包括温度、压力、风速等。

第一步,读取数据

该数据为每小时时间序列数据,一共96453条,包括:时间、天气类型、降水类型、气温、体表温度、湿度、风速(km/小时)、风向(度)、能见度(km)、噪声、气压、全天天气12个变量。

第二步,提取数据集中的风速数据,并按照一天(24小时)的平均值进行重采样

import pandas as pd

# 读取原始 CSV 文件
df = pd.read_csv('weatherHistory.csv'  )

# 移除时区信息并将日期时间列解析为 Pandas 的日期时间类型(包括毫秒)
df['Formatted Date'] = pd.to_datetime(df['Formatted Date'].str.replace(r'\s+\+\d{4}', '', regex=True),
                                      format='%Y-%m-%d %H:%M:%S.%f', utc=True)

# 将日期时间列设置为索引
df.set_index('Formatted Date', inplace=True)

# 提取 风速 列
selected_column = df[['Wind Speed (km/h)']]

# 按照一天(24小时)的平均值重新采样
daily_avg_wind_speed = selected_column.resample('D').mean()

# 保存结果到新的 CSV 文件
daily_avg_wind_speed.to_csv('wind_speed.csv')

daily_avg_wind_speed

这样,数据就采集成为日平均风速,一共4018条数据。

第三步,数据可视化

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')

# 读取数据
data = pd.read_csv('wind_speed.csv')
# 可视化
plt.figure(figsize=(15,5), dpi=100)
plt.grid(True)
plt.plot(data['Wind Speed (km/h)'], color='green')
plt.show()

3 风速数据集预处理

第一步,先划分数据集

我们按照8:2划分训练集和测试集,划分比例不同,也会对后续的模型训练推理效果有影响,比如对电池寿命的预测中,明显训练集的数据量划分越多,模型拟合效果越好[1]。

第二步,滑动窗口介绍

在时间序列预测问题中,滑动窗口是一种常用的数据处理方法,用于将时间序列数据转换为模型的输入特征和输出标签。滑动窗口的基本思想是以固定的时间窗口长度对时间序列进行切片,每次滑动一定的步长,从而生成一系列的子序列。这些子序列可以作为模型的输入特征,同时可以对应相同长度的下一个时间步的数据作为输出标签。这样就可以将时间序列数据转换为监督学习问题的数据集,用于训练和测试预测模型。

具体来说,对于一个时间序列 [x1, x2, x3, ..., xn],滑动窗口的过程如下:

1. 选择固定长度的时间窗口,比如长度为w。

2. 从序列的起始位置开始,取前w个数据作为输入特征,同时取第w+1个数据作为输出标签,形成第一个样本。

3. 然后向后滑动一个固定的步长,取第2到w+1个数据作为输入特征,同时取第w+2个数据作为输出标签,形成第二个样本,依此类推,直到序列末尾。

比如序列长为20,滑动窗口设置为4

训练集,滑动:

构造训练集数据和对应标签:

构造测试集数据和对应标签:

通过滑动窗口的处理,原始的时间序列数据被转换为一系列的样本,每个样本包括了固定长度的输入特征和对应的输出标签,用于模型的训练和测试。滑动窗口技术可以帮助模型捕捉时间序列数据的局部模式和趋势,提高模型对时间序列的预测能力。

第三步,代码实现

import numpy as np

# 生成示例时间序列数据
time_series = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 定义滑动窗口大小
window_size = 3

# 使用滑动窗口处理时间序列数据
def data_window_maker(time_series, window_size):
    # 用来存放输入特征
    data_x = []
    # 用来存放输出标签
    data_y = []
    # 构建训练集和对应标签
    for i in range(len(time_series) - window_size):
        data_x.append(time_series[i:i+window_size])  # 取前window_size个数据作为输入特征
        data_y.append(time_series[i+window_size])  # 取第window_size+1个数据作为输出标签

    return data_x, data_y

x, y = data_window_maker(time_series, window_size)

print("输出标签y:", y)
x

选择合适的 window_size 对于时间序列数据的滑动窗口处理非常关键。window_size 的大小直接影响着模型对时间序列数据的理解和预测能力。下面是一些关于选择 window_size 的决策因素:

  • 上下文长度:window_size 应该足够长,能够捕获时间序列数据中的重要上下文信息,以便模型能够学习到时间序列数据的长期依赖关系。

  • 数据周期性:如果时间序列数据具有明显的周期性,window_size 最好能够覆盖一个完整的周期,这样可以帮助模型更好地理解周期性特征。

  • 数据频率:如果时间序列数据的采样频率很高,那么可能需要选择较小的 window_size,以便更好地捕捉时间序列数据的变化。

  • 数据长度:如果时间序列数据比较长,可以适当增大 window_size,以提高模型对整体趋势的理解。

  • 训练样本数量:选择合适的 window_size 可以确保生成足够数量的训练样本,以便模型能够充分学习时间序列数据的模式。

一般来说,选择合适的 window_size 需要结合具体的时间序列数据特点和预测任务需求来进行调整。通常情况下,可以通过尝试不同的 window_size 并进行交叉验证来确定最佳的参数值。也可阅读相关领域的论文,参考论文中的设定数值。

  • 29
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,下面是一个基于Matlab的BP神经网络风速预测模型的代码实现。 首先,加载数据并进行预处理: ```matlab % 加载数据 data = readtable('wind_speed_data.csv'); % 数据预处理 features = table2array(data(:, 2:end)); % 提取特征数据 labels = table2array(data(:, 1)); % 提取标签数据 features_norm = normalize(features); % 特征数据归一化 labels_norm = normalize(labels); % 标签数据归一化 ``` 然后,将数据划分为训练集和测试集: ```matlab % 划分训练集和测试集 train_ratio = 0.8; % 训练集比例 train_size = round(size(features_norm, 1) * train_ratio); % 训练集大小 train_features = features_norm(1:train_size, :); % 训练集特征数据 train_labels = labels_norm(1:train_size, :); % 训练集标签数据 test_features = features_norm(train_size+1:end, :); % 测试集特征数据 test_labels = labels_norm(train_size+1:end, :); % 测试集标签数据 ``` 接下来,构建BP神经网络模型: ```matlab % 构建BP神经网络模型 net = feedforwardnet([10 5]); % 隐藏层包含10个和5个神经元 net.trainFcn = 'trainlm'; % 选择Levenberg-Marquardt算法进行训练 net.trainParam.showWindow = false; % 不显示训练窗口 net.trainParam.epochs = 1000; % 训练次数 net.layers{1}.transferFcn = 'logsig'; % 第1层使用Sigmoid激活函数 net.layers{2}.transferFcn = 'logsig'; % 第2层使用Sigmoid激活函数 net = train(net, train_features', train_labels'); % 训练神经网络模型 ``` 最后,使用训练好的模型对测试集进行预测并计算预测误差: ```matlab % 使用训练好的模型对测试集进行预测 pred_labels = net(test_features')'; % 预测标签数据 pred_labels = denormalize(pred_labels); % 反归一化预测标签数据 test_labels = denormalize(test_labels); % 反归一化测试标签数据 % 计算预测误差 mse = mean((pred_labels - test_labels).^2); % 均方误差 mae = mean(abs(pred_labels - test_labels)); % 平均绝对误差 ``` 这样,一个基于Matlab的BP神经网络风速预测模型就建立完成了。需要注意的是,在实际应用中,还需要对数据进行更加细致的处理和特征工程,以提高预测的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

建模先锋

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值