查看Tensorflow 的this example,他们提供的课程可让您轻松地将时间序列转变为监督学习问题(即训练和测试数据集)。
如果您查看that same example,您还会发现一些数据转换步骤可以帮助您获得更好的模型。
对您的数据进行编码,以便数字表示在您的输入数据中找到的关系,即如果您的列描述风向,则编码使得 360 度与 359 度的距离与 0 度的距离完全相同。他们通过乘以风速,然后获取这些列的 sin 和 cos 分量来做到这一点。时间序列数据预处理是一个广泛的主题,您可以花费大量时间来研究。
另一个可能帮助您的模型摆脱在每一步都预测训练数据平均值的步骤是标准化:压缩 0 到 1 之间的所有值并从数据集中移除平均值。
我不是 Keras Sequential 模型的权威,但这里有一些东西可以帮助您入门:
这个模型至少可以预测未来 30 步的 sin 函数。
import tensorflow as tf
import tensorflow.keras as keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
def make_model(x_train, y_train, print_summary = True):
model = Sequential()
model.add(keras.Input(shape = (x_train.shape[1], x_train.shape[2])))
model.add(LSTM(units = 100, return_sequences = False))
model.add(Activation('tanh'))
model.add(Dense(units = 100, activation = 'relu')
model.add(Dropout(rate = 0.2))
model.add(Dense(units = y_train.shape[1], activation = 'relu')
model.compile(loss = 'mse', optimizer = keras.optimizers.Adam())
if print_summary: model.summary()
return model
您应该尝试激活函数,添加归一化和 dropout。
如果我给它这个输入:
sin_df = pd.DataFrame(index = pd.date_range('2015-01-01 00:00:00', '2015-12-31
23:00:00', freq = 'H'))
sin_df['data'] = np.float32(np.sin(range(len(sin_df))))
我用这个函数把它切成样本:
def multivariate_data(df, start_index, end_index, history_size, target_size,
remove_na = True, target = 0, step = 1, single_step=False):
target = df[:,target]
data = []
labels = []
start_index = start_index + history_size
if end_index is None:
end_index = len(df) - target_size
for i in range(start_index, end_index, step):
indices = range(i-history_size, i)
data.append(df[indices])
if single_step:
labels.append(target[i+target_size])
else:
labels.append(target[i:i+target_size])
return np.array(data), np.array(labels)
train_test_split = '2015-06-01'
train_test_index = len(self.df.loc[:train_test_split])-target_size
x_train, y_train = multivariate_data(sin_df.values, 0, train_test_index-1, 100, 30)
x_test, y_test = multivariate_data(sin_df.values, train_test_index+1, None, 100, 30)
然后我可以调用 fit:
history = model.fit(x_train, y_train,
epochs = 25,
batch_size = 24,
validation_data = (x_test, y_test),
callbacks = [],
verbose = 2,
shuffle = False)
这就是我的输出 V y_test 的样子:
predictions = model.predict(x_test)