Как уменьшить переоснащение в модели "CNN для прогноза акций" - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь сделать прогноз движения запаса, используя функциональную модель 1D-CNN. Как мне уменьшить перенастройку моей проверки?

Ввод для модели с использованием истории открытия, закрытия, максимума, минимума и объема цены фондового рынка. Таким образом, на входе будет матрица WINDOW_SIZE X 5 . Выход будет проверять следующую минимальную цену последнего дня, если она повышается, она будет помечена как «вверх» и «вниз», если она пойдет вниз. Я создал модель, используя ссылку из этой бумаги .

В документе говорится, что он использует 6 слоев конвона, а размер фильтра для каждого слоя 32, 64, 128 и 256 для 3 последних слоев. Я пробовал:

  • Элемент списка
  • настройка размеров окон (7, 14, 21, 30)
  • настройка размера ядра в слое
  • настройка размера фильтра в слое
  • функция потери: softmax
  • добавление выпадающего слоя

Вот набор данных, который я использовал CSV-файл

Вот ссылка на полный код

Вот модель, использующая тензор потока:

WINDOW = 30
n_channels = 5
n_classes = 2
batch_size = 100 # Batch size
learning_rate = 0.0001
epochs = 10000

graph = tf.Graph()

# Construct placeholders
with graph.as_default():
    inputs_ = tf.placeholder(tf.float32, [None, WINDOW, n_channels], name = 'inputs')
    labels_ = tf.placeholder(tf.float32, [None, n_classes], name = 'labels')
    keep_prob_ = tf.placeholder(tf.float32, name = 'keep')
    learning_rate_ = tf.placeholder(tf.float32, name = 'learning_rate')

with graph.as_default():
    # Layer-1
    conv = tf.layers.conv1d(inputs=inputs_, filters=32, kernel_size=3, strides=1, padding='valid', activation=tf.nn.relu)
    conv = tf.layers.batch_normalization(conv)

    # Layer-2
    conv = tf.layers.conv1d(inputs=conv, filters=64, kernel_size=3, strides=1, padding='valid')
    conv = tf.nn.leaky_relu(conv, alpha=0.01)
    conv = tf.layers.batch_normalization(conv)

    # Layer-3
    conv = tf.layers.conv1d(inputs=conv, filters=128, kernel_size=3, strides=1, padding='valid')
    conv = tf.nn.leaky_relu(conv, alpha=0.01)
    conv = tf.layers.batch_normalization(conv)


     # Layer-4
    conv = tf.layers.conv1d(inputs=conv, filters=256, kernel_size=3, strides=1, padding='valid')
    conv = tf.nn.leaky_relu(conv, alpha=0.01)
    conv = tf.layers.batch_normalization(conv)


    # Layer-5
    conv = tf.layers.conv1d(inputs=conv, filters=256, kernel_size=3, strides=1, padding='valid')
    conv = tf.nn.leaky_relu(conv, alpha=0.01)
    conv = tf.layers.batch_normalization(conv)


    # Layer-6
    conv = tf.layers.conv1d(inputs=conv, filters=256, kernel_size=3, strides=1, padding='valid')
    conv = tf.nn.leaky_relu(conv, alpha=0.01)
    conv = tf.layers.batch_normalization(conv)

with graph.as_default():
    # Flatten and add dropout

    flat = tf.layers.flatten(conv)
    flat = tf.nn.dropout(flat, keep_prob=keep_prob_)
    dense = tf.layers.dense(inputs=flat, units=256)
    dense = tf.nn.dropout(dense, rate=1-keep_prob_)
    dense = tf.layers.dense(inputs=dense, units=256)
    dense = tf.nn.dropout(dense, rate=1-keep_prob_)

    # Predictions
    logits = tf.layers.dense(flat, n_classes)

    # Cost function and optimizer
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels_))
    optimizer = tf.train.AdamOptimizer(learning_rate_).minimize(cost)

    # Accuracy
    correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(labels_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy')

validation_acc = []
validation_loss = []

train_acc = []
train_loss = []

with graph.as_default():
  saver = tf.train.Saver()

with tf.Session(graph=graph) as sess:
  sess.run(tf.global_variables_initializer())
  iteration = 1

  for e in range(epochs):

      # Loop over batches
      for x,y in get_batches(X_tr, y_tr, batch_size):
          # Feed dictionary
          feed = {inputs_ : x, labels_ : y, keep_prob_ : 0.2, learning_rate_ : learning_rate}

          # Loss
          loss, _ , acc = sess.run([cost, optimizer, accuracy], feed_dict = feed)
          train_acc.append(acc)
          train_loss.append(loss)

          # Print at each 5 iters
          if (iteration % 50 == 0):
              print("Epoch: {}/{}".format(e, epochs),
                    "Iteration: {:d}".format(iteration),
                    "Train loss: {:6f}".format(loss),
                    "Train acc: {:.6f}".format(acc))

          # Compute validation loss at every 10 iterations
          if (iteration%100 == 0):                
              val_acc_ = []
              val_loss_ = []

              for x_v, y_v in get_batches(X_vld, y_vld, batch_size):
                  # Feed
                  feed = {inputs_ : x_v, labels_ : y_v, keep_prob_ : 1.0}  

                  # Loss
                  loss_v, acc_v = sess.run([cost, accuracy], feed_dict = feed)                    
                  val_acc_.append(acc_v)
                  val_loss_.append(loss_v)
              # Print info
              print("Epoch: {}/{}".format(e, epochs),
                    "Iteration: {:d}".format(iteration),
                    "Validation loss: {:6f}".format(np.mean(val_loss_)),
                    "Validation acc: {:.6f}".format(np.mean(val_acc_)))

              # Store
              validation_acc.append(np.mean(val_acc_))
              validation_loss.append(np.mean(val_loss_))

          # Iterate 
          iteration += 1

  saver.save(sess,"/checkpoints-cnn/har.ckpt")

Вот мой результат

потеря акк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...