Advertisement
Guest User

LSTMFuture

a guest
Aug 2nd, 2023
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.88 KB | Source Code | 0 0
  1. import pandas as pd
  2. import numpy as np
  3. import seaborn as sns
  4. import csv
  5. from pandas import read_csv
  6. from pandas import datetime
  7. from matplotlib import pyplot
  8. from datetime import date
  9. import matplotlib.pyplot as plt
  10. from pylab import rcParams
  11. import statsmodels.api as sm
  12. from sklearn.preprocessing import MinMaxScaler
  13. from keras.models import Sequential
  14. from keras.layers import Dense
  15. from keras.layers import LSTM
  16. from keras.layers import Dropout
  17. from sklearn.metrics import mean_squared_error
  18. from keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint, LearningRateScheduler
  19. from sklearn.metrics import mean_squared_error
  20. from sklearn.metrics import mean_absolute_error
  21. from keras.layers.core import Activation
  22. from keras.layers import Bidirectional
  23.  
  24. import tensorflow as tf
  25. from tensorflow.keras.layers import Dense, LSTM
  26. from tensorflow.keras.models import Sequential
  27. from sklearn.preprocessing import MinMaxScaler
  28. pd.options.mode.chained_assignment = None
  29. tf.random.set_seed(0)
  30.  
  31. # read the csv file
  32. dataset = pd.read_csv("ABC.csv")
  33. dataset['Tanggal'] = pd.to_datetime(dataset['Tanggal'])
  34. dataset = dataset.sort_values('Tanggal')
  35. dataset = dataset.groupby('Tanggal')['Harga'].sum().reset_index()
  36. dataset.set_index('Tanggal', inplace=True)
  37. dataset.head()
  38.  
  39. import plotly.express as px
  40.  
  41. #Melakukan pemeriksaan outliers
  42. px.box(dataset, x='Harga')
  43.  
  44. y = dataset['Harga']
  45. y.plot(figsize=(15, 6))
  46. plt.show()
  47.  
  48. scaler = MinMaxScaler(feature_range = (0, 1))
  49. df = scaler.fit_transform(dataset)
  50.  
  51. train_size = int(len(df) * 0.75)
  52. train, test = df[0:train_size, :], df[train_size:len(df), :]
  53. valid_size = int(len(train) * 0.7)
  54. train1, valid = train[0:valid_size, :], train[valid_size:len(train), :]
  55.  
  56. def create_data_set(df, n_steps = 1):
  57.     data_x, data_y = [], []
  58.     for i in range(len(df) - n_steps - 1):
  59.         a = df[i:(i + n_steps), 0]
  60.         data_x.append(a)
  61.         data_y.append(df[i + n_steps, 0])
  62.     return np.array(data_x), np.array(data_y)
  63.  
  64. n_steps = 1
  65. n_features = 1
  66. X_train,Y_train,X_test,Y_test,X_valid,Y_valid  = [],[],[],[],[],[]
  67.  
  68. X_train,Y_train=create_data_set(train1,n_steps)
  69. X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], n_features))
  70.  
  71. X_test,Y_test=create_data_set(test,n_steps)
  72. X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], n_features))
  73.  
  74. X_valid,Y_valid=create_data_set(valid,n_steps)
  75. X_valid = np.reshape(X_valid, (X_valid.shape[0], X_valid.shape[1], n_features))
  76.  
  77. model = Sequential()
  78. model.add(LSTM(50, return_sequences = False, input_shape = (n_steps, n_features)))
  79. # model.add(LSTM(50, return_sequences = True, input_shape = (n_steps, n_features)))
  80. # model.add(LSTM(50, return_sequences = True))
  81. # model.add(LSTM(50, return_sequences = False))
  82. model.add(Dropout(0.05))
  83. model.add(Dense(1))
  84. model.compile(optimizer = 'adam', loss = 'mse')
  85.  
  86. call_back = EarlyStopping(monitor = 'val_loss', patience = 30, mode = 'min')
  87. history = model.fit(X_train, Y_train, epochs = 250, batch_size = 30, validation_data = (X_valid, Y_valid), callbacks = [call_back], shuffle = False)
  88.  
  89. train_predict = model.predict(X_train)
  90. test_predict = model.predict(X_test)
  91.  
  92. plt.figure(figsize = (15,6))
  93. plt.plot(history.history['loss'], label = 'Train Loss')
  94. plt.plot(history.history['val_loss'], label = 'Validation Loss')
  95. plt.title('model loss')
  96. plt.ylabel('loss')
  97. plt.xlabel('epochs')
  98. plt.legend(loc = 'upper right')
  99. plt.show();
  100.  
  101. # # invert predictions
  102. train_predict = scaler.inverse_transform(train_predict)
  103. Y_train = scaler.inverse_transform([Y_train])
  104. test_predict = scaler.inverse_transform(test_predict)
  105. Y_test = scaler.inverse_transform([Y_test])
  106.  
  107.  
  108. # Compare train data Actual vs. Prediction
  109. plt.style.context("seaborn-white")
  110. plt.figure(figsize=(15,6))
  111. plt.plot(Y_train[0], 'b', label="actual")
  112. plt.plot(train_predict, 'y', label="prediction")
  113. plt.tight_layout()
  114. plt.title('Train Data')
  115. # sns.despine(top=True)
  116. plt.subplots_adjust(left=0.07)
  117. plt.ylabel('Price', size=15)
  118. plt.legend(fontsize=15)
  119. plt.show();
  120.  
  121. from sklearn.metrics import mean_absolute_percentage_error
  122. print('Train MAPE:', mean_absolute_percentage_error(Y_train[0], train_predict[:,0]))
  123. print('Train Mean Absolute Error:', mean_absolute_error(Y_train[0], train_predict[:,0]))
  124. print('Test Mean Absolute Error:', mean_absolute_error(Y_test[0], test_predict[:,0]))
  125.  
  126. # Compare test data Actual vs. Prediction
  127. plt.figure(figsize=(15,6))
  128. plt.plot(Y_test[0], 'b', label="actual")
  129. plt.plot(test_predict, 'y', label="prediction")
  130. plt.tight_layout()
  131. # sns.despine(top=True)
  132. plt.subplots_adjust(left=0.07)
  133. plt.ylabel('Price ( US Dollar )', size=11)
  134. plt.xlabel('Total Test Data', size=11)
  135. plt.legend(fontsize=15)
  136. plt.show();
  137.  
  138. print('Test MAPE:', mean_absolute_percentage_error(Y_test[0], test_predict[:,0]))
  139. print('Test Mean Absolute Error:', mean_absolute_error(Y_test[0], test_predict[:,0]))
  140. print('Test Root Mean Squared Error:',np.sqrt(mean_squared_error(Y_test[0], test_predict[:,0])))
  141.  
  142. # generate the input and output sequences
  143. n_lookback = 20  # length of input sequences (lookback period)
  144. n_forecast = 20  # length of output sequences (forecast period)
  145.  
  146. # generate the forecasts
  147. X_ = df[- n_lookback:]  # last available input sequence
  148. X_ = X_.reshape(1, n_lookback, 1)
  149.  
  150. Y_ = model.predict(X_).reshape(-1, 1)
  151. Y_ = scaler.inverse_transform(Y_)
  152.  
  153. dataset.reset_index(inplace=True)
  154.  
  155. # organize the results in a data frame
  156. df_past = dataset
  157. df_past.rename(columns={'Harga': 'Actual'}, inplace=True)
  158. df_past['Forecast'] = np.nan
  159. df_past['Forecast'].iloc[-1] = df_past['Actual'].iloc[-1]
  160.  
  161. df_future = pd.DataFrame(columns=['Tanggal', 'Actual', 'Forecast'])
  162. df_future['Tanggal'] = pd.date_range(start=df_past['Tanggal'].iloc[-1] + pd.Timedelta(days=1), periods=n_forecast)
  163. df_future['Forecast'] = Y_.flatten()
  164. df_future['Actual'] = np.nan
  165.  
  166. results = df_past.append(df_future).set_index('Tanggal')
  167.  
  168. # plot the results
  169. results.plot(title='AAPL')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement