Tôi mới sử dụng ML và TensorFlow (tôi đã bắt đầu khoảng vài giờ trước) và tôi đang cố gắng sử dụng nó để dự đoán một vài điểm dữ liệu tiếp theo trong một chuỗi thời gian. Tôi đang lấy đầu vào của mình và làm điều này với nó:
/----------- x ------------\
.-------------------------------.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
'-------------------------------'
\----------- y ------------/
Những gì tôi nghĩ rằng tôi đang làm là sử dụng x làm dữ liệu đầu vào và y làm đầu ra mong muốn cho đầu vào đó, do đó, đưa ra 0-6 tôi có thể nhận được 1-7 (cụ thể là 7). Tuy nhiên, khi tôi chạy biểu đồ của mình với x làm đầu vào, những gì tôi nhận được là một dự đoán trông giống x hơn y .
Đây là mã (dựa trên bài đăng này và bài đăng này ):
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()
Kết quả hiển thị trong biểu đồ bên dưới là một dự đoán theo sau x , thay vì bị dịch chuyển sang trái (và bao gồm các điểm được dự đoán ở bên phải) vì nó phải giống với y . Rõ ràng mong muốn là đường màu đỏ càng gần với đường màu xanh càng tốt.
Tôi không biết tôi đang làm gì với tất cả những điều này, vì vậy xin vui lòng ELI5.
Ồ, ngoài ra, điểm dữ liệu của tôi là những con số khá nhỏ (thứ tự 0,0001). Nếu tôi không nhân chúng với 1000000, thì kết quả rất nhỏ đến mức đường màu đỏ gần như phẳng ở cuối biểu đồ. Tại sao? Tôi đoán đó là do bình phương trong chức năng tập thể dục. Dữ liệu nên được chuẩn hóa trước khi sử dụng, và nếu vậy, để làm gì? 0-1? Nếu tôi sử dụng:
normalized_points = [(p - min_point) / (max_point - min_point) for p in data_points]
dự đoán của tôi dao động dữ dội hơn khi nó tiến triển:
Chỉnh sửa: Tôi đang bị câm và chỉ đưa ra một ví dụ để học hỏi, chứ không phải 500, phải không? Vì vậy, tôi nên cho nó nhiều mẫu 500 điểm, phải không?