Как можно интерпретировать MSE / MAE / MAPE для предсказания элементов матриц? - PullRequest
0 голосов
/ 30 апреля 2019

Привет, у меня есть следующий сценарий для обучения набора данных с временными рядами , принадлежащими 3 матрицам (R, G, B), которые имеют корреляцию , и я хотел бы обучить RNN и прогнозировать только 2 из 3 (R, G). Чтобы упростить процесс, я использовал особые данные изменения формы, помещая элементы всех 3 матриц для каждого временного цикла в один ряд данных изменения формы, поскольку я знаю, что между ними есть корреляция. Этим я хочу проложить путь для RNN, чтобы он также изучил их соотношение! и в конце после прогнозирования по обратному сценарию я перестрою заинтересованные матрицы (R, G). img

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from keras.layers import Dense , Activation , BatchNormalization
from keras.layers import Dropout
from keras.layers import LSTM,SimpleRNN
from keras.models import Sequential
from keras.optimizers import Adam, RMSprop

#select interested columns to predict 980 out of 1440
j=0
index=[]
for i in range(11): #in my real data since size of matrices are 24*20 it should be 1439
    if j==2:
        j=0
        continue
    else:
        index.append(i)
        j+=1

Y_train = data_train[index]
Y_test  = data_test[index]
data_train = data_train.values
data_test  = data_test.values
X_train = data_train .reshape((data_train.shape[0], 1,data_train.shape[1]))
X_test  = data_test  .reshape((data_test.shape[0] , 1 ,data_test.shape[1]))


# create and fit the SimpleRNN model
model_RNN = Sequential()
model_RNN.add(SimpleRNN(units=12, input_shape=(X_train.shape[1], X_train.shape[2]))) #in real data units=1440
model_RNN.add(Dense(9)) # in real data Dense(960)
model_RNN.add(BatchNormalization())
model_RNN.add(Activation('tanh'))
model_RNN.compile(loss='mean_squared_error', optimizer='adam')
hist_RNN=model_RNN.fit(X_train, Y_train, epochs =50, batch_size =20,validation_data=(X_test,Y_test),verbose=1)

from sklearn.metrics import mean_absolute_error 
from sklearn.metrics import mean_squared_error

def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100


Y_train=np.array(Y_train)
Y_test=np.array(Y_test)

Y_RNN_Train_pred=model_RNN.predict(X_train)
train_RNN= pd.DataFrame.from_records(Y_RNN_Train_pred)
train_RNN.to_csv('New/train_RNN.csv', sep=',', header=None, index=None)
train_MSE=mean_squared_error(Y_train, Y_RNN_Train_pred)
train_MAE=mean_absolute_error(Y_train, Y_RNN_Train_pred)
train_MAPE=mean_absolute_percentage_error(Y_train, Y_RNN_Train_pred)
print("*"*50)
print("Train MSE:", "%.4f" % train_MSE)
print("Train MAE:", "%.4f" % train_MAE)
print("Train MAPE:", "%.2f%%" % train_MAPE)
print("*"*50)

Y_RNN_Test_pred=model_RNN.predict(X_test)
test_RNN= pd.DataFrame.from_records(Y_RNN_Test_pred)
test_RNN.to_csv('New/test_RNN.csv', sep=',', header=None, index=None)
test_MSE=mean_squared_error(Y_test, Y_RNN_Test_pred)
test_MAE=mean_absolute_error(Y_test, Y_RNN_Test_pred)
test_MAPE=mean_absolute_percentage_error(Y_test, Y_RNN_Test_pred)
print("*"*50)
print("Test MSE:", "%.4f" % test_MSE)
print("Test MAE:", "%.4f" % test_MAE)
print("Test MAPE:", "%.2f%%" % test_MAPE)
print("*"*50) 

#calculating MSE column-wise for train
train_MSE_col=mean_squared_error(Y_train[0,:], Y_RNN_Train_pred[0,:])
train_MSE_col_ = "%.4f" % train_MSE_col
#calculating MSE column-wise for test
test_MSE_col=mean_squared_error(Y_test[0,:], Y_RNN_Test_pred[0,:])
test_MSE_col_ = "%.4f" % test_MSE_col
#calculating MSE row-wise for train
train_MSE_row=mean_squared_error(Y_train[:,0], Y_RNN_Train_pred[:,0])
train_MSE_row_ = "%.4f" % train_MSE_row
#calculating MSE row-wise for test
test_MSE_row=mean_squared_error(Y_test[:,0], Y_RNN_Test_pred[:,0])
test_MSE_row_ = "%.4f" % test_MSE_row

f, ax = plt.subplots(figsize=(20, 15))
plt.subplot(2, 2, 1)
plt.plot(Y_train[0,:],'r-')
plt.plot(Y_RNN_Train_pred[0,:],'b-')
#plt.xlim([-10, 970])
plt.title(f'Prediction on Train data on 960 columns in RNN , Train MSE={train_MSE_col_}', fontsize=15, fontweight='bold')

plt.subplot(2, 2, 2)
plt.plot(Y_test[0,:],'r-')
plt.plot(Y_RNN_Test_pred[0,:],'b-')
plt.title(f'Prediction on Test data on 960 columns in RNN , Test MSE={test_MSE_col_}', fontsize=15, fontweight='bold')

plt.subplot(2, 2, 3)
plt.plot(Y_train[:,0],'r-')
plt.plot(Y_RNN_Train_pred[:,0],'b-')
plt.ylim([-1.2, 1.2])
plt.title(f'Prediction on Test data on 40 rows-cyclewise in RNN, Train MSE={train_MSE_row_}', fontsize=15, fontweight='bold')

plt.subplot(2, 2, 4)
plt.plot(Y_test[:,0],'r-')
plt.plot(Y_RNN_Test_pred[:,0],'b-')
plt.ylim([-1.2, 1.2])
plt.title(f'Prediction on Test data on 40 rows-cyclewise in RNN, Test MSE={test_MSE_row_}', fontsize=15, fontweight='bold')
plt.subplots_adjust(top=0.90, bottom=0.42, left=0.05, right=0.96, hspace=0.4, wspace=0.2)
plt.suptitle('RNN + BN + tanh', color='yellow', backgroundcolor='black', fontsize=15, fontweight='bold')
plt.show()

Вопрос 1: об оценочной интерпретации модели Как соотносится оценка модели с такими показателями, как MSE / MAE / MAPE? Что я знаю, это дает нам ошибку, но расчет основан на том, какие показатели по умолчанию в Керасе?

## evaluate the model by calculation of Error predicted output Vs actual output
scores_train = model_RNN.evaluate(X_train, Y_train, verbose=1)
print("Model Accuracy for train : %.2f%%" % ((1-scores_train)*100) )

scores_test = model_RNN.evaluate(X_test, Y_test, verbose=1)
print("Model Accuracy for test: %.2f%%" % ((1-scores_test)*100) )

40/40 [==============================] - 0s 1ms/step
Model Accuracy for train : 67.82%
40/40 [==============================] - 0s 900us/step
Model Accuracy for test: 33.82%

Вопрос 2: о интерпретации MSE и других метрик. Проблема Я не могу понять или интерпретировать их: когда я оцениваю мою RNN_model, это дает мне высокое значение, которое может быть неверным в отношении правильного предсказания. Другая проблема заключается в том, что когда я извлекаю MSE между предсказанием и фактическими значениями теста, обычно возникает различие, даже если я строю значения предсказания на фактических значениях теста по столбцам или по строкам и даже получаю их MSE по столбцам или по строкам, которые я не могу интерпретировать. их. Я что-то не так делаю в этом сценарии? Как возникают различия между MSE со следующих точек зрения:

mean_squared_error(Y_test, Y_RNN_Test_pred)
mean_squared_error(Y_test[0,:], Y_RNN_Test_pred[0,:])
mean_squared_error(Y_test[:,0], Y_RNN_Test_pred[:,0])

Мне интересно, смогу ли я после перестройки предсказанных матриц вычислить матрицу вычитания и попробовать реализовать MSE / MAE / MAPE своими собственными кодами, чтобы я мог быть уверен в результатах .

img Примечание 1: значения всех элементов в матрицах находятся между [-1, +1].

Примечание 2: реальный размер моих матриц - 24 * 20, но для упрощения вопроса, который я показал 2 * 2.

Примечание 3: Я испробовал свою реализацию на 40 временных шагах (последняя последовательность времени при изменении формы была t = 40)

Примечание 4: Реальный размер моих данных изменения формы был 40 * 1440 [3 раза 24 * 20 = 480 будет 1440]

...