Soy nuevo en ML y TensorFlow (comencé hace unas horas), y estoy tratando de usarlo para predecir los próximos puntos de datos en una serie de tiempo. Estoy tomando mi entrada y haciendo esto con ella:
/----------- x ------------\
.-------------------------------.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
'-------------------------------'
\----------- y ------------/
Lo que pensé que estaba haciendo es usar x como datos de entrada e y como salida deseada para esa entrada, de modo que dado 0-6 podría obtener 1-7 (el 7 en particular). Sin embargo, cuando ejecuto mi gráfico con x como entrada, lo que obtengo es una predicción que se parece más a x que a y .
Aquí está el código (basado en esta publicación y esta publicación ):
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plot
import pandas as pd
import csv
def load_data_points(filename):
print("Opening CSV file")
with open(filename) as csvfile:
print("Creating CSV reader")
reader = csv.reader(csvfile)
print("Reading CSV")
return [[[float(p)] for p in row] for row in reader]
flatten = lambda l: [item for sublist in l for item in sublist]
data_points = load_data_points('dataset.csv')
print("Loaded")
prediction_size = 10
num_test_rows = 1
num_data_rows = len(data_points) - num_test_rows
row_size = len(data_points[0]) - prediction_size
# Training data
data_rows = data_points[:-num_test_rows]
x_data_points = np.array([row[:-prediction_size] for row in data_rows]).reshape([-1, row_size, 1])
y_data_points = np.array([row[prediction_size:] for row in data_rows]).reshape([-1, row_size, 1])
# Test data
test_rows = data_points[-num_test_rows:]
x_test_points = np.array([[data_points[0][:-prediction_size]]]).reshape([-1, row_size, 1])
y_test_points = np.array([[data_points[0][prediction_size:]]]).reshape([-1, row_size, 1])
tf.reset_default_graph()
num_hidden = 100
x = tf.placeholder(tf.float32, [None, row_size, 1])
y = tf.placeholder(tf.float32, [None, row_size, 1])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=num_hidden, activation=tf.nn.relu)
rnn_outputs, _ = tf.nn.dynamic_rnn(basic_cell, x, dtype=tf.float32)
learning_rate = 0.001
stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, num_hidden])
stacked_outputs = tf.layers.dense(stacked_rnn_outputs, 1)
outputs = tf.reshape(stacked_outputs, [-1, row_size, 1])
loss = tf.reduce_sum(tf.square(outputs - y))
optimizer = tf.train.AdamOptimizer(learning_rate)
training_op = optimizer.minimize(loss)
init = tf.global_variables_initializer()
iterations = 1000
with tf.Session() as sess:
init.run()
for ep in range(iterations):
sess.run(training_op, feed_dict={x: x_data_points, y: y_data_points})
if ep % 100 == 0:
mse = loss.eval(feed_dict={x: x_data_points, y: y_data_points})
print(ep, "\tMSE:", mse)
y_pred = sess.run(stacked_outputs, feed_dict={x: x_test_points})
plot.rcParams["figure.figsize"] = (20, 10)
plot.title("Actual vs Predicted")
plot.plot(pd.Series(np.ravel(x_test_points)), 'g:', markersize=2, label="X")
plot.plot(pd.Series(np.ravel(y_test_points)), 'b--', markersize=2, label="Y")
plot.plot(pd.Series(np.ravel(y_pred)), 'r-', markersize=2, label="Predicted")
plot.legend(loc='upper left')
plot.xlabel("Time periods")
plot.tick_params(
axis='y',
which='both',
left='off',
right='off',
labelleft='off')
plot.show()
El resultado que se muestra en el gráfico a continuación es una predicción que sigue a x , en lugar de desplazarse hacia la izquierda (e incluir los puntos predichos a la derecha) como debería parecerse a y . Obviamente, el deseo es que la línea roja esté lo más cerca posible de la azul.
No tengo idea de lo que estoy haciendo con todo esto, así que por favor ELI5.
Ah, también, mis puntos de datos son números bastante pequeños (orden de 0.0001). Si no los multiplico por, digamos, 1000000, los resultados son tan pequeños que la línea roja es casi plana en la parte inferior del gráfico. ¿Por qué? Supongo que se debe a la cuadratura en la función fitness. ¿Deberían normalizarse los datos antes de su uso y, en caso afirmativo, a qué? 0-1? Si yo uso:
normalized_points = [(p - min_point) / (max_point - min_point) for p in data_points]
mi predicción fluctúa más salvajemente a medida que avanza:
Editar: Estoy siendo tonto y solo le doy un ejemplo para aprender, no 500, ¿no? Entonces debería darle varias muestras de 500 puntos, ¿verdad?