Как построить график подгонки к фактическим данным, пока модель калибруется за период обучения в Tensorflow Python - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть фрейм данных, содержащий численные суточные данные и целевую переменную («Оценка») в последнем столбце, который я пытаюсь предсказать. Код ниже, кажется, работает, но я хотел бы визуализировать результаты подбора модели, пока модель калибруется по фактическим данным в обучающем наборе.

Все переменные являются временными рядами, поэтому они упорядочены по времени, но график, который мне удалось протестировать, показывает фактические временные ряды целевой переменной (в период обучения), но для прогнозируемых значений мне не удалось получить ожидаемые результаты.

Если я нанесу их на график, подгонянные значения не будут соответствовать порядку времени фактических данных, и это, по-видимому, связано с тем, что на более ранней стадии происходит перестановка.

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

#allData is a dataframe containing the target variable in last column
y = 'Score' #name of the target variable to predict
target = allData[y].shift(1).dropna() #shift by 1 days as I want to predict the future score
X_ = allData.drop([y], axis=1) #all features
df = pd.concat([X_, target], join='outer', axis=1).dropna() #put them all back in a dataframe

df_train = df['2015':'2018']
df_test = df[prediction[0] : prediction[1]]

#scale variables
scaler = MinMaxScaler(feature_range=(-1, 1))
train= scaler.fit_transform(df_train.values)
test = scaler.transform(df_test.values)

x_train = train[:, :-1]
y_train = train[:, -1]
x_test = test[:, :-1]

num_features = x_train.shape[1]

x = tf.placeholder(dtype=tf.float32, shape=[None, num_features])
y_ = tf.placeholder(dtype=tf.float32, shape=[None])

nl_1, nl_2, nl_3, nl_4 = 512, 256, 128, 64
wi = tf.contrib.layers.variance_scaling_initializer(mode='FAN_AVG', uniform=True, factor=1)
zi = tf.zeros_initializer()

# 4 Hidden layers
wt_hidden_1 = tf.Variable(wi([num_features, nl_1]))
bias_hidden_1 = tf.Variable(zi([nl_1]))

wt_hidden_2 = tf.Variable(wi([nl_1, nl_2]))
bias_hidden_2 = tf.Variable(zi([nl_2]))

wt_hidden_3 = tf.Variable(wi([nl_2, nl_3]))
bias_hidden_3 = tf.Variable(zi([nl_3]))

wt_hidden_4 = tf.Variable(wi([nl_3, nl_4]))
bias_hidden_4 = tf.Variable(zi([nl_4]))

# Output layer
wt_out = tf.Variable(wi([nl_4, 1]))
bias_out = tf.Variable(zi([1]))

hidden_1 = tf.nn.relu(tf.add(tf.matmul(x, wt_hidden_1), bias_hidden_1))
hidden_2 = tf.nn.relu(tf.add(tf.matmul(hidden_1, wt_hidden_2), bias_hidden_2))
hidden_3 = tf.nn.relu(tf.add(tf.matmul(hidden_2, wt_hidden_3), bias_hidden_3))
hidden_4 = tf.nn.relu(tf.add(tf.matmul(hidden_3, wt_hidden_4), bias_hidden_4))
out = tf.transpose(tf.add(tf.matmul(hidden_4, wt_out), bias_out))

mse = tf.reduce_mean(tf.squared_difference(out, y_))

optimizer = tf.train.AdamOptimizer().minimize(mse)

session = tf.InteractiveSession()

session.run(tf.global_variables_initializer())

BATCH_SIZE = 100
EPOCHS = 100

for epoch in range(EPOCHS):
    # Shuffle the training data
    shuffle_data = permutation(arange(len(y_train)))
    x_train = x_train[shuffle_data]
    y_train = y_train[shuffle_data]

    # Mini-batch training
    for i in range(len(y_train)//BATCH_SIZE):
        start = i*BATCH_SIZE
        batch_x = x_train[start:start+BATCH_SIZE]
        batch_y = y_train[start:start+BATCH_SIZE]
        session.run(optimizer, feed_dict={x: batch_x, y_: batch_y})

        # Show plot of fitted model against actual data
        if np.mod(i, 5) == 0:
            pred = session.run(out, feed_dict={x: x_train}) #x_train is scaled
            dd = train.copy()
            dd[:, -1] = pred[0]
            pred = scaler.inverse_transform(dd) #need to rescale in order to compare with actual data
            fig = plt.figure()
            ax1 = fig.add_subplot(111)
            line1, = ax1.plot(df_train[y].values) #the actual data in the training period
            line2, = ax1.plot(pred[:, -1][::-1]) #the fitted data in the training period don't seem to be ordered in time, like the original data
            plt.title('Epoch ' + str(epoch) + ', Batch ' + str(i))
            plt.show()
            plt.pause(0.01)
...