一、LSTM基礎原理
LSTM(Long Short-Term Memory)是一種遞歸神經網絡,廣泛用於自然語言處理、時間序列預測等領域。LSTM的主要特點是能夠捕捉長期依賴關係,即能夠在序列中保留多個時刻的信息。
LSTM包含一個單元(cell),可用於存儲狀態和控制流程。單元的核心是三個門(gate):輸入門(input gate)、遺忘門(forget gate)和輸出門(output gate)。輸入門控制激活狀態信息的輸入,遺忘門控制遺忘狀態信息的輸入,輸出門控制輸出信息的輸入。
具體而言,輸入門、遺忘門和輸出門的計算方式如下:
<img src="input.png">
<img src="forget.png">
<img src="output.png">
其中,W、U和b為可學習參數,σ為sigmoid函數。
二、Keras實現LSTM時間序列預測
Keras是一個用於構建神經網絡的高級API,可用於快速構建、訓練和評估各種類型的神經網絡模型。下面將介紹如何使用Keras實現LSTM時間序列預測模型。
1. 數據準備
首先,我們需要準備數據。假設我們要預測某公司2021年1月至6月的銷售額,我們可以使用該公司過去一年的銷售額數據作為訓練集。
我們將訓練集按照時間順序排序,然後取最後n個數據作為測試集(n為自定義的測試集大小)。接下來,我們需要對數據進行標準化處理(將所有數據縮放到[0,1]的範圍內)。
# 加載數據
data = pd.read_csv('sales_data.csv', header=None)
# 排序
data = data.values[1:].astype('float32')
data = data[~np.isnan(data).any(axis=1)]
data = data[np.argsort(data[:, 0])]
# 劃分訓練集和測試集
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train, test = data[0:train_size, :], data[train_size:len(data), :]
# 標準化處理
scaler = MinMaxScaler(feature_range=(0, 1))
train = scaler.fit_transform(train)
test = scaler.transform(test)
2. 創建數據集
接下來,我們需要創建數據集。LSTM模型需要輸入一個有序的、三維的數據集。具體而言,對於每個樣本,我們需要提供n_steps_in個時間步長(用於預測的歷史數據)以及n_features個特徵(在我們的例子中,這個特徵就是銷售額本身)。同時,我們也需要提供n_steps_out個時間步長的目標值(即預測的值)。
# 創建數據集
def create_dataset(dataset, n_steps_in, n_steps_out):
dataX, dataY = [], []
for i in range(len(dataset)-n_steps_in-n_steps_out+1):
x = dataset[i:(i+n_steps_in), :]
y = dataset[(i+n_steps_in):(i+n_steps_in+n_steps_out), 0]
dataX.append(x)
dataY.append(y)
return np.array(dataX), np.array(dataY)
n_steps_in = 12
n_steps_out = 6
trainX, trainY = create_dataset(train, n_steps_in, n_steps_out)
testX, testY = create_dataset(test, n_steps_in, n_steps_out)
3. 構建模型
接下來,我們需要構建LSTM模型。在這個例子中,我們使用了一個含有兩個LSTM層的網絡,每個LSTM層含有50個神經元。如果你需要更好的性能,可以使用更深、更寬的網絡。
# 構建模型
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(50, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')
4. 訓練模型
接下來,我們需要訓練模型。LSTM在序列數據中表現良好,但是它也需要更長的時間來訓練。我們在訓練過程中使用了EarlyStopping和ModelCheckpoint回調函數,以便在損失不再下降時停止訓練並保存最好的模型。
# 訓練模型
es = EarlyStopping(monitor='val_loss', patience=10)
mc = ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True)
history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), callbacks=[es, mc])
5. 測試模型
最後,我們需要使用測試集驗證模型的性能。我們可以使用模型的predict()方法來進行預測,並將預測結果與實際值進行比較。
# 測試模型
model = load_model('best_model.h5')
predictions = model.predict(testX)
predictions = scaler.inverse_transform(predictions)
# 計算R²分數
r2score = r2_score(testY, predictions)
print('R²分數:{}'.format(r2score))
三、小結
本文介紹了LSTM時間序列預測的基礎原理和Keras實現。在實現過程中,我們對數據進行了準備和標準化處理,創建了LSTM模型,並使用訓練集進行訓練,最後使用測試集進行預測。LSTM相比於其他算法具有更好的性能和更強的泛化能力,可廣泛應用於自然語言處理、時間序列預測等領域。
原創文章,作者:AAHDD,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/369397.html