lstm时间序列,loss值很高
共享单车需求预测
如何优化代码,或者说我思路有问题?
该如何写
数据集
321行,特征字段weekday(0工作日,1非工作日),weather(1晴,2多云),meantemp
最好加上参数优化代码,另有报酬
# 加载数据集
dataset = pd.read_csv("../data/r_ultimate4.csv", parse_dates=['starttime'], index_col=['starttime'])
# 特征数据集
X = dataset.drop(columns=['count'], axis=1)
# 标签数据集
y = dataset['count']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False, random_state=6)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
X_train = pd.DataFrame(X_train)
X_test = pd.DataFrame(X_test)
# 2 构造特征数据集
def create_dataset(X, y, seq_len=3):
features = []
targets = []
for i in range(0, len(X) - seq_len, 1):
data = X.iloc[i:i + seq_len]
label = y.iloc[i + seq_len]
features.append(data)
targets.append(label)
return np.array(features), np.array(targets)
# 构造训练特征数据集
train_dataset, train_labels = create_dataset(X_train, y_train, seq_len=3)
# 构造测试特征数据集
test_dataset, test_labels = create_dataset(X_test, y_test, seq_len=3)
# print(train_dataset.shape)
# print(train_labels.shape)
# 构造批数据
def create_batch_dataset(X, y, train=True, buffer_size=100, batch_size=32):
batch_data = tf.data.Dataset.from_tensor_slices((tf.constant(X), tf.constant(y))) # 数据封装,tensor类型
if train: # 训练集
return batch_data.cache().shuffle(buffer_size).batch(batch_size)
else: # 测试集
return batch_data.batch(batch_size)
# # 训练批数据
train_batch_dataset = create_batch_dataset(train_dataset, train_labels)
# print(train_batch_dataset)
# 测试批数据
test_batch_dataset = create_batch_dataset(test_dataset, test_labels, train=False)
# print(train_dataset.shape)
# print(train_dataset)
# # 模型构建
model = Sequential()
model.add(LSTM(256, activation='relu', input_shape=train_dataset.shape[-2:]))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))
optimizer = Adam(learning_rate=0.001)
# 模型编译
model.compile(optimizer='adam',loss='mean_squared_error')
checkpoint_file = "best_model.hdf5"
checkpoint_callback = ModelCheckpoint(filepath=checkpoint_file,
monitor='loss',
mode='min',
save_best_only=True,
save_weights_only=True)
# 模型训练
history = model.fit(train_batch_dataset,
epochs=1000,
validation_data=test_batch_dataset,
callbacks=[checkpoint_callback])