
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
其中:
輸入門用于決定當前時刻哪些信息需要寫入細胞狀態。包括兩個步驟:
計算輸入門的激活值:
生成新的候選細胞狀態:
其中:
細胞狀態的更新包括兩部分:保留部分舊的細胞狀態和添加新的細胞狀態。公式如下:
其中:
輸出門用于決定當前時刻的隱藏狀態。公式如下:
當前時刻的隱藏狀態:
其中:
總的來說,LSTM通過引入遺忘門、輸入門和輸出門,有效地控制了信息的流動,解決了傳統RNN在處理長序列數據時的梯度消失和梯度爆炸問題。
這里再匯總一下上面的公式:
通過這些公式,LSTM能夠有效地捕捉和保留序列中的長期依賴關系,從而在處理時間序列數據、自然語言處理等任務中表現出色。
數據集介紹
數據集來自UCI機器學習庫的北京PM2.5數據集。數據包含2010年至2014年北京空氣質量監測數據,包括PM2.5濃度、天氣數據等。
公眾號后臺,回復「數據集」,取PRSA_data_2010.1.1-2014.12.31.csv
PRSA_data_2010.1.1-2014.12.31.csv
數據集包括以下列:
No
: 行號year
: 年month
: 月day
: 日hour
: 小時pm2.5
: PM2.5濃度(ug/m^3)DEWP
: 露點溫度(攝氏度)TEMP
: 溫度(攝氏度)PRES
: 壓力(hPa)cbwd
: 風向Iws
: 風速(m/s)Is
: 累計小時數Ir
: 累計降雨量(mm)算法流程
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.callbacks import EarlyStopping
# 數據加載
data = pd.read_csv('PRSA_data_2010.1.1-2014.12.31.csv')
# 數據預處理
data['pm2.5'].fillna(data['pm2.5'].mean(), inplace=True) # 處理缺失值
# 選擇特征和目標變量
features = ['DEWP', 'TEMP', 'PRES', 'Iws']
target = 'pm2.5'
# 標準化
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data[features + [target]])
# 創建時間序列數據集
def create_dataset(dataset, look_back=1):
X, y = [], []
for i in range(len(dataset) - look_back):
X.append(dataset[i:(i + look_back), :-1])
y.append(dataset[i + look_back, -1])
return np.array(X), np.array(y)
look_back = 24
X, y = create_dataset(data_scaled, look_back)
# 劃分訓練集和測試集
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]
# 構建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(look_back, len(features))))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
# 模型訓練
early_stopping = EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2, callbacks=[early_stopping])
# 模型評估
y_pred = model.predict(X_test)
# 反標準化
y_test_inv = scaler.inverse_transform(np.concatenate((X_test[:, -1, :-1], y_test.reshape(-1, 1)), axis=1))[:, -1]
y_pred_inv = scaler.inverse_transform(np.concatenate((X_test[:, -1, :-1], y_pred), axis=1))[:, -1]
# 繪制結果
plt.figure(figsize=(12, 6))
plt.plot(y_test_inv, label='True')
plt.plot(y_pred_inv, label='Predicted')
plt.legend()
plt.show()
# 繪制損失曲線
plt.figure(figsize=(12, 6))
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.show()
代碼中的步驟一些細節,再給大家說一下:
以上,整個是一個完整的LSTM時間序列預測的案例,包括數據預處理、模型構建、訓練、評估和可視化。大家在自己實際的實驗中,根據需求進行進一步的調整和優化。
本文章轉載微信公眾號@深夜努力寫Python