如何把时间信息引入到神经网络中

引言

在许多实际问题中,时间信息是非常重要的。比如,在股票预测中,过去的股价和成交量是影响未来股价的重要因素之一。因此,将时间信息引入到神经网络中,可以提高模型的准确性和预测能力。本文将详细介绍如何通过不同的方法将时间信息引入到神经网络中,并通过一个股票预测的示例来说明。

方法一:时间作为输入特征

一种简单的方法是将时间作为神经网络的输入特征之一。我们可以将时间表示为一个固定格式的字符串,比如"2022-01-01 10:30:00",然后将其转化为一个向量作为输入。这个向量可以是一个one-hot编码,也可以是一个连续值。下面是一个使用one-hot编码表示时间的示例代码:

import numpy as np
import datetime

def time_to_vector(time_string):
    time = datetime.datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S")
    time_vector = np.zeros(24)  # 假设时间范围在一天内
    time_vector[time.hour] = 1
    return time_vector

# 示例时间
time_string = "2022-01-01 10:30:00"
time_vector = time_to_vector(time_string)
print(time_vector)

上述代码中,我们将时间表示为一天内的小时数,并将其转化为一个长度为24的向量。在实际应用中,时间可以进一步细化,比如考虑分钟、秒等信息。

将时间向量与其他特征一起作为神经网络的输入,可以更好地捕捉到时间对结果的影响。

方法二:时间作为循环输入

另一种常用的方法是将时间作为循环输入。我们可以将时间表示为一个周期性的量,比如一天中的小时数或一年中的月份,然后将其转化为一个周期变化的输入。这样神经网络可以更好地学习时间的周期性变化。下面是一个使用时间作为循环输入的示例代码:

import numpy as np
import math

def time_to_cycle(time_string, cycle_length):
    time = datetime.datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S")
    time_cycle = 2 * math.pi * time.hour / cycle_length
    return np.sin(time_cycle), np.cos(time_cycle)

# 示例时间
time_string = "2022-01-01 10:30:00"
sin_time, cos_time = time_to_cycle(time_string, 24)
print(sin_time, cos_time)

上述代码中,我们将时间表示为一天内的小时数,并将其转化为一个周期在0~2π之间变化的数值。然后,我们使用sin和cos函数将其转化为两个输入特征。在实际应用中,可以根据需要调整周期的长度和变化方式。

实际问题:股票价格预测

为了说明如何将时间信息引入到神经网络中,我们以股票价格预测为例。假设我们有一段时间内的股票价格数据,我们希望通过神经网络来预测未来的股票价格。我们可以使用方法一或方法二中的任意一种方法来引入时间信息,并将其与其他相关因素一起作为神经网络的输入。

下面是一个使用LSTM网络进行股票价格预测的示例代码:

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 读入股票数据
data = pd.read_csv("stock_data.csv")

# 数据预处理
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data["price"].values.reshape(-1, 1))

# 构建输入特征和标签
time_steps = 30  # 时间步长
X, y = [], []
for i in range(time_steps, len(scaled_data)):
    X.append(scaled_data[i - time_steps:i, 0])
    y.append(scaled_data[i, 0])
X, y = np.array(X), np.array(y)