【问题标题】:Neural network having suspiciously bad results神经网络有可疑的坏结果
【发布时间】: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


【解决方案1】:

事实证明,keras.preprocessing.sequence.TimeseriesGenerator 期望 y(在我的示例中为 y_train)与 X(在我的示例中为 x_train)相比移动一个。

您的输入数据应该是这样一种形状,即以索引 n 结尾的 X 的特定子序列可以预测您的 y 中索引 n + 1 处的值。我最初的错误是它在索引n 处预测值。

感谢Daniel Möller,为我指明了正确的方向。

【讨论】:

    【解决方案2】:

    目标数据的平均值是多少?是零吗?根据我的经验,NN 的默认配置没有一个常数值,这可以通过使最后一层具有仿射或线性激活函数来获得。

    【讨论】:

    • 特征和结果集的平均值(它们是相同的)是 0.5045
    猜你喜欢
    • 2018-01-05
    • 2017-02-21
    • 2018-05-06
    • 1970-01-01
    • 2019-05-13
    • 2012-09-13
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多