【发布时间】:2018-12-04 17:59:57
【问题描述】:
我正在玩 Keras 库,试图预测一个时间序列并得到非常糟糕的结果,我想知道为什么神经网络甚至无法处理一个简单的场景。我的(工程)数据如下所示:
(模式很简单 - 结果与特征值完全相同,有10000行这样的)
dataPointIndex,feature,result
0, 1, 1
1, 1, 1
2, 0, 0
3, 1, 1
4, 1, 1
5, 1, 1
6, 1, 1
7, 0, 0
8, 1, 1
9, 0, 0
10, 1, 1
...
我的 Keras 代码:
TIMESERIES_LENGTH = 10
TIMESERIES_SAMPLING_RATE = 1
TIMESERIES_BATCH_SIZE = 16
TEST_SET_RATIO = 0.2
VALIDATION_SET_RATIO = 0.2
data = pd.read_csv("data/" + csv_path)
x = data.ix[:, 1:2]
y = data.ix[:, 2]
test_set_length = int(round(len(x) * TEST_SET_RATIO))
validation_set_length = int(round(len(x) * VALIDATION_SET_RATIO))
x_train_and_val = x[:-test_set_length]
y_train_and_val = y[:-test_set_length]
x_train = x_train_and_val[:-validation_set_length].values
y_train = y_train_and_val[:-validation_set_length].values
x_val = x_train_and_val[-validation_set_length:].values
y_val = y_train_and_val[-validation_set_length:].values
x_test = x[-test_set_length:].values
y_test = y[-test_set_length:].values
scaler = sklearn.preprocessing.StandardScaler().fit(x_train_and_val)
train_gen = keras.preprocessing.sequence.TimeseriesGenerator(
x_train,
y_train,
length=TIMESERIES_LENGTH,
sampling_rate=TIMESERIES_SAMPLING_RATE,
batch_size=TIMESERIES_BATCH_SIZE
)
val_gen = keras.preprocessing.sequence.TimeseriesGenerator(
x_val,
y_val,
length=TIMESERIES_LENGTH,
sampling_rate=TIMESERIES_SAMPLING_RATE,
batch_size=TIMESERIES_BATCH_SIZE
)
test_gen = keras.preprocessing.sequence.TimeseriesGenerator(
x_test,
y_test,
length=TIMESERIES_LENGTH,
sampling_rate=TIMESERIES_SAMPLING_RATE,
batch_size=TIMESERIES_BATCH_SIZE
)
model = keras.models.Sequential()
model.add(keras.layers.Dense(100, activation='relu', input_shape=(TIMESERIES_LENGTH, 1)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(1000, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(
loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
history = model.fit_generator(
train_gen,
epochs=20,
verbose=1,
validation_data=val_gen
)
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.ylabel('accuracy/loss')
plt.xlabel('epoch')
plt.legend(['training accuracy', 'validation accuracy', 'training loss', 'validation loss'], loc='upper left')
plt.show()
结果:
我尝试了LSTM 层,但它们的表现同样糟糕。
知道我做错了什么吗?非常感谢。
【问题讨论】:
-
您确定您的发电机输出正确吗?试试
x,y = next(train_gen)并打印。 -
产生错误:TypeError: 'TimeseriesGenerator' object is not an iterator
-
好的,然后
x,y = train_gen[0]。 -
你可能是在正确的轨道上,我得到:
(Pdb) x,y = train_gen[0] (Pdb) x array([[[1.],[1.]], [[1.],[0.]], [[0.],[1.]]]) (Pdb) y array([0., 1., 1.])这似乎是错误的,特征和结果根本不对应。 -
如果你有 10000 行这样的行,第一列
dataPointIndex将从 0 变为 9999。这可能会严重扭曲数据。您能否将此列标准化为从 0 变为 1,然后重试?
标签: python keras neural-network time-series