Я испытываю Tensorflow через библиотеку Keras и, прежде чем погрузиться в предсказание неопределенности, подумал, что было бы неплохо предсказать что-то определенное. Поэтому я попытался предсказать еженедельный доход, используя ежедневные данные об уровне цен. Моя входная форма выглядит так: (1000, 5, 2), то есть 1000 матриц формы:
Stock A Stock B
110 100
95 101
90 100
89 99
100 110
Для Stock A
цена на day t=0
равна 100
, 95
на t-1
и 100
на t-5
. Таким образом, еженедельный доход для Stock A
будет 110/100=10%
и -10%
для Stock B
. Поскольку сейчас я фокусируюсь только на прогнозировании Stock As, моим значением y для этой входной матрицы будет просто скаляр 0.01
. Кроме того, я хочу сделать это проблемой классификации и, таким образом, создать вектор с горячим кодированием через to_categorical
с 1, если y выше 5%, 2, если он ниже -5%, и 0, если он между ними. Следовательно, мой вывод классификации для вышеупомянутой матрицы будет:
0 1 0
Чтобы упростить: я хочу, чтобы моя модель научилась вычислять доходность, то есть разделить первое значение в матрице ввода на последнее значение матрицы ввода для запаса A и игнорировать ввод для запаса B. Это даст y. Для меня это просто практическая задача, прежде чем я приступлю к более сложным задачам, и модель должна достичь нулевой потери, потому что нет никакой неопределенности. Какую модель вы предлагаете сделать это? Я попробовал следующее, и оно не сходится вообще. Вес обучения и проверки рассчитывается через compute_sample_weight('balanced', )
.
Earlystop = EarlyStopping(monitor='val_loss', patience=150, mode='min', verbose=1, min_delta=0.0002, restore_best_weights=True)
checkpoint = ModelCheckpoint('nn', monitor='val_loss', verbose=1, save_best_only=True, mode='min', save_weights_only=False)
Plateau = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=30, verbose=1)
optimizer = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, amsgrad=True)
input_ = Input(batch_shape=(batch_size, 1, 5, 2))
model = LocallyConnected2D(16, kernel_size=(5, 1), padding='valid', data_format="channels_first")(input_)
model = LeakyReLU(alpha=0.01)(model)
model = Dense(128)(model)
model = LeakyReLU(alpha=0.01)(model)
model = Flatten()(model)
x1 = Dense(3, activation='softmax', name='0')(model)
final_model = Model(inputs=input_, outputs=[x1])
final_model.compile(loss='categorical_crossentropy' , optimizer=optimizer, metrics=['accuracy'])
history = final_model.fit(X_train, y_train, epochs=1000, batch_size=batch_size, verbose=2, shuffle=False, validation_data=[X_valid, y_valid, valid_weight], sample_weight=train_weight, callbacks=[Earlystop, checkpoint, Plateau])
Я думал, что для этого может быть полезна свертка, и, поскольку каждое возвращение рассчитывается индивидуально, я решил использовать слой LocallyConnected. Нужно ли добавлять больше слоев для такой простой задачи?
РЕДАКТИРОВАТЬ: преобразовал мою входную матрицу в возвращения, и модель успешно сходится. Таким образом, ввод должен быть корректным, но модель не может найти функцию деления. Есть ли слои, которые подходят для этого?