Нейронная сеть с подозрительно плохими результатами - PullRequest
0 голосов
/ 04 декабря 2018

Я играю с библиотекой 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
...

Код My 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()

Результаты:

enter image description here

Я пробовал LSTM слоев, но они работают аналогичноплохо.

Есть идеи, что я делаю не так?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Оказывается, keras.preprocessing.sequence.TimeseriesGenerator ожидает, что y (y_train в моем примере) будет смещено на единицу по сравнению с X (x_train в моем случае).

Ваши входные данные должны быть такимиформа, в которой определенная подпоследовательность X, заканчивающаяся индексом n, предсказывает значение индекса n + 1 в вашем y.Моя первоначальная ошибка заключалась в том, что он предсказал значение по индексу n.

Благодаря Даниэлю Меллеру , за то, что он указал мне правильное направление.

0 голосов
/ 04 декабря 2018

Каково среднее значение целевых данных?Это ноль?Из моего опыта конфигурация NN по умолчанию не имеет постоянного значения, которое может быть получено при наличии последнего уровня с аффинной или линейной функцией активации.

...