如何解决LSTM 预测接下来的 10 分钟不是小时
我是按照 Keras.io 的例子,看下面的链接:https://keras.io/examples/timeseries/timeseries_weather_forecasting/
“每 10 分钟记录一次观察,这意味着每小时 6 次。我们将每小时重新采样一个点,因为预计 60 分钟内不会发生剧烈变化。我们通过 timeseries_dataset_from_array 实用程序中的采样率参数来完成此操作。
我们正在跟踪过去 720 个时间戳(720/6=120 小时)的数据。此数据将用于预测 72 个时间戳(76/6=12 小时)后的温度。”
如果我不想每小时重新采样一个点并且我想预测接下来的 10 分钟,我必须改变什么?我要回看过去多少个时间戳?
请看下面这个例子的代码(我很抱歉有这么多代码)。
from zipfile import ZipFile
import os
uri = "https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip"
zip_path = keras.utils.get_file(origin=uri,fname="jena_climate_2009_2016.csv.zip")
zip_file = ZipFile(zip_path)
zip_file.extractall()
csv_path = "jena_climate_2009_2016.csv"
df = pd.read_csv(csv_path)
titles = [
"Pressure","Temperature","Temperature in Kelvin","Temperature (dew point)","Relative Humidity","Saturation vapor pressure","Vapor pressure","Vapor pressure deficit","Specific humidity","Water vapor concentration","Airtight","Wind speed","Maximum wind speed","Wind direction in degrees",]
feature_keys = [
"p (mbar)","T (degC)","Tpot (K)","Tdew (degC)","rh (%)","VPmax (mbar)","VPact (mbar)","VPdef (mbar)","sh (g/kg)","H2OC (mmol/mol)","rho (g/m**3)","wv (m/s)","max. wv (m/s)","wd (deg)",]
colors = [
"blue","orange","green","red","purple","brown","pink","gray","olive","cyan",]
date_time_key = "Date Time"
split_fraction = 0.715
train_split = int(split_fraction * int(df.shape[0]))
step = 6
past = 720
future = 72
learning_rate = 0.001
batch_size = 256
epochs = 10
def normalize(data,train_split):
data_mean = data[:train_split].mean(axis=0)
data_std = data[:train_split].std(axis=0)
return (data - data_mean) / data_std
selected_features = [feature_keys[i] for i in [0,1,5,7,8,10,11]]
features = df[selected_features]
features.index = df[date_time_key]
features.head()
features = normalize(features.values,train_split)
features = pd.DataFrame(features)
features.head()
train_data = features.loc[0 : train_split - 1]
val_data = features.loc[train_split:]
start = past + future
end = start + train_split
x_train = train_data[[i for i in range(7)]].values
y_train = features.iloc[start:end][[1]]
sequence_length = int(past / step)
dataset_train = keras.preprocessing.timeseries_dataset_from_array(
x_train,y_train,sequence_length=sequence_length,sampling_rate=step,batch_size=batch_size,)
x_end = len(val_data) - past - future
label_start = train_split + past + future
x_val = val_data.iloc[:x_end][[i for i in range(7)]].values
y_val = features.iloc[label_start:][[1]]
dataset_val = keras.preprocessing.timeseries_dataset_from_array(
x_val,y_val,)
for batch in dataset_train.take(1):
inputs,targets = batch
print("Input shape:",inputs.numpy().shape)
print("Target shape:",targets.numpy().shape)
inputs = keras.layers.Input(shape=(inputs.shape[1],inputs.shape[2]))
lstm_out = keras.layers.LSTM(32)(inputs)
outputs = keras.layers.Dense(1)(lstm_out)
model = keras.Model(inputs=inputs,outputs=outputs)
model.compile(optimizer=keras.optimizers.Adam(learning_rate=learning_rate),loss="mse")
model.summary()
path_checkpoint = "model_checkpoint.h5"
es_callback = keras.callbacks.EarlyStopping(monitor="val_loss",min_delta=0,patience=5)
modelckpt_callback = keras.callbacks.ModelCheckpoint(
monitor="val_loss",filepath=path_checkpoint,verbose=1,save_weights_only=True,save_best_only=True,)
history = model.fit(
dataset_train,epochs=epochs,validation_data=dataset_val,callbacks=[es_callback,modelckpt_callback],)
def show_plot(plot_data,delta,title):
labels = ["History","True Future","Model Prediction"]
marker = [".-","rx","go"]
time_steps = list(range(-(plot_data[0].shape[0]),0))
if delta:
future = delta
else:
future = 0
plt.title(title)
for i,val in enumerate(plot_data):
if i:
plt.plot(future,plot_data[i],marker[i],markersize=10,label=labels[i])
else:
plt.plot(time_steps,plot_data[i].flatten(),label=labels[i])
plt.legend()
plt.xlim([time_steps[0],(future + 5) * 2])
plt.xlabel("Time-Step")
plt.show()
return
for x,y in dataset_val.take(5):
show_plot(
[x[0][:,1].numpy(),y[0].numpy(),model.predict(x)[0]],12,"Single Step Prediction",)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。