Tensorflow2(預課程)---11.3.2、(a)循環神經網絡實現股票預測(GRU)
一、總結
一句話總結:
這個應用不看准確率(這里不是分類問題),看loss就好了,loss低的話,預測自然准
# 構建容器 model = tf.keras.Sequential() # 輸入層 model.add(tf.keras.Input(shape=(60,1))) model.add(tf.keras.layers.GRU(80, return_sequences=True)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.GRU(100)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.Dense(1)) # 模型的結構 model.summary()
# 該應用只觀測loss數值,不觀測准確率 # 配置優化函數和損失器 model.compile(optimizer=tf.keras.optimizers.Adam(0.001),loss='mse',metrics=['acc']) # 開始訓練 history = model.fit(x_train,y_train,epochs=50,validation_data=(x_test,y_test)) #epochs表示訓練的次數
1、報錯:ValueError: Failed to find data adapter that can handle input: <class 'numpy.ndarray'>, (<class 'list'> containing values of types {"<class 'numpy.float64'>"})?
很可能是沒有將數據轉為numpy:是沒有將數據(y_train、y_test)轉為numpy
2、異常二:訓練集和測試集准確率都為0?
真正原因是 該應用只觀測loss數值,不觀測准確率
3、從歸一化轉換成正常數據?
MinMaxScaler的inverse_transform方法:predicted_stock_price = sc.inverse_transform(predicted_stock_price)
# 測試集輸入模型進行預測 predicted_stock_price = model.predict(x_test) # 對預測數據還原---從(0,1)反歸一化到原始范圍 predicted_stock_price = sc.inverse_transform(predicted_stock_price) # 對真實數據還原---從(0,1)反歸一化到原始范圍 real_stock_price = sc.inverse_transform(test_set[60:]) # 畫出真實數據和預測數據的對比曲線 plt.plot(real_stock_price, color='red', label='MaoTai Stock Price') plt.plot(predicted_stock_price, color='blue', label='Predicted MaoTai Stock Price') plt.title('MaoTai Stock Price Prediction') plt.xlabel('Time') plt.ylabel('MaoTai Stock Price') plt.legend() plt.show()
4、.iloc[0:2126,2:3].values和.iloc[0:2126,2:3]獲取的數據格式分別是什么?
(I)、.iloc[0:2126,2:3].values 獲取的是 numpy.ndarray
(II)、.iloc[0:2126,2:3] 獲取的是 pandas.core.frame.DataFrame
二、循環神經網絡實現股票預測(GRU)
博客對應課程的視頻位置:
步驟
1、讀取數據集
2、拆分數據集(拆分成訓練數據集和測試數據集)
3、構建模型
4、訓練模型
5、檢驗模型
需求
對
In [1]:
import pandas as pd import numpy as np import tensorflow as tf import matplotlib.pyplot as plt
1、讀取數據集
In [2]:
data = pd.read_csv("SH600519.csv") print(data.head(5)) print(data.shape)
2、拆分數據集(拆分成訓練數據集和測試數據集)
將后300行做測試集,之前的做訓練集
In [3]:
# .iloc[0:2126,2:3].values 獲取的是 numpy.ndarray
# .iloc[0:2126,2:3] 獲取的是 pandas.core.frame.DataFrame train_data = data.iloc[0:2126,2:3].values train_data1 = data.iloc[0:2126,2:3] test_data = data.iloc[2126:,2:3].values print(type(train_data)) print(type(train_data1)) print(train_data.shape) print(test_data.shape) print(train_data[0:5]) print(test_data[0:5])
In [4]:
# 歸一化
from sklearn.preprocessing import MinMaxScaler sc = MinMaxScaler(feature_range=(0, 1)) # 定義歸一化:歸一化到(0,1)之間 training_set = sc.fit_transform(train_data) # 求得訓練集的最大值,最小值這些訓練集固有的屬性,並在訓練集上進行歸一化 test_set = sc.transform(test_data) # 利用訓練集的屬性對測試集進行歸一化
In [5]:
# min-max歸一化中的min和max
print(sc.data_max_) print(sc.data_min_) print(training_set.shape) print(test_set.shape) print(training_set[:5]) print(test_set[:5])
2.1、構建訓練和測試數據集
In [6]:
x_train = [] y_train = [] x_test = [] y_test = []
In [7]:
print(type(training_set)) # 切片的索引 # 前面一個是行,后面一個是列 print(training_set[70-10:70,0]) print(training_set[70,0])
In [8]:
print(training_set[70-10:70]) print(training_set[70])
In [9]:
print(training_set[70-10:70,0]) print(training_set[70,0])
組裝 train 數據
In [10]:
for i in range(60,len(training_set)): x_train.append(training_set[i-60:i,0]) y_train.append(training_set[i,0]) # 對訓練集進行打亂 np.random.seed(7) np.random.shuffle(x_train) np.random.seed(7) np.random.shuffle(y_train) tf.random.set_seed(7)
In [11]:
print(len(x_train)) print(len(y_train)) print(x_train[:2]) print(y_train[:2])
組裝 test 數據
In [12]:
for i in range(60,len(test_set)): x_test.append(test_set[i-60:i,0]) y_test.append(test_set[i,0])
In [13]:
print(len(x_test)) print(len(y_test)) print(x_test[:2]) print(y_test[:2])
如此便構建了訓練數據和測試數據
In [14]:
print(type(x_train)) print(type(x_test))
In [15]:
print(x_train[0]) print(x_test[0])
In [16]:
x_train=np.array(x_train) x_test=np.array(x_test) y_train=np.array(y_train) y_test=np.array(y_test)
In [17]:
x_train = np.reshape(x_train, (x_train.shape[0], 60, 1)) x_test = np.reshape(x_test, (x_test.shape[0], 60, 1)) print(x_train.shape) print(x_test.shape)
3、構建模型
In [18]:
# 構建容器
model = tf.keras.Sequential() # 輸入層 model.add(tf.keras.Input(shape=(60,1))) model.add(tf.keras.layers.GRU(80, return_sequences=True)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.GRU(100)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.Dense(1)) # 模型的結構 model.summary()
4、訓練模型
In [19]:
# 該應用只觀測loss數值,不觀測准確率
# 配置優化函數和損失器 model.compile(optimizer=tf.keras.optimizers.Adam(0.001),loss='mse',metrics=['acc']) # 開始訓練 history = model.fit(x_train,y_train,epochs=50,validation_data=(x_test,y_test)) #epochs表示訓練的次數
問題一:
報錯:
ValueError: Failed to find data adapter that can handle input:
<class 'numpy.ndarray'>,
(<class 'list'> containing values of types {"<class 'numpy.float64'>"})
問題原因:
很可能是沒有將數據轉為numpy。
In [ ]:
print(type(x_train)) print(type(y_train)) print(type(x_test)) print(type(y_test))
問題二:
訓練集和測試集准確率都為0
解決方案:
來初步檢驗一下訓練和測試數據
不是因為我沒有打亂數據
真正原因是 該應用只觀測loss數值,不觀測准確率
In [ ]:
print(x_train.shape) print(y_train.shape) print(x_test.shape) print(y_test.shape)
In [19]:
print("===================x_train[0:2]===================") print(x_train[0:2]) print("===================y_train[0:2]===================") print(y_train[0:2]) print("===================x_test[0:2]===================") print(x_test[0:2]) print("===================y_test[0:2]===================") print(y_test[0:2])
5、檢驗模型
In [20]:
################## predict ######################
# 測試集輸入模型進行預測 predicted_stock_price = model.predict(x_test) # 對預測數據還原---從(0,1)反歸一化到原始范圍 predicted_stock_price = sc.inverse_transform(predicted_stock_price) # 對真實數據還原---從(0,1)反歸一化到原始范圍 real_stock_price = sc.inverse_transform(test_set[60:]) # 畫出真實數據和預測數據的對比曲線 plt.plot(real_stock_price, color='red', label='MaoTai Stock Price') plt.plot(predicted_stock_price, color='blue', label='Predicted MaoTai Stock Price') plt.title('MaoTai Stock Price Prediction') plt.xlabel('Time') plt.ylabel('MaoTai Stock Price') plt.legend() plt.show()
In [23]:
predicted_stock_price = model.predict(x_test) print(predicted_stock_price.shape) print(predicted_stock_price)
In [24]:
# 對預測數據還原---從(0,1)反歸一化到原始范圍
predicted_stock_price = sc.inverse_transform(predicted_stock_price) print(predicted_stock_price.shape) print(predicted_stock_price)
In [25]:
# 對真實數據還原---從(0,1)反歸一化到原始范圍
real_stock_price = sc.inverse_transform(test_set[60:]) print(real_stock_price.shape) print(real_stock_price)
In [ ]: