iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0

今天是第9天我想寫一個Lstm預測候鳥飛行距離的程式,以下是程式碼

pip install numpy pandas tensorflow scikit-learn
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

# 假設我們有一個包含候鳥行為的時序數據集
# 為了簡單起見,這裡創建了一個隨機數據集作為示例
# 通常你會從CSV或其他資料來源讀取這些數據
data_size = 1000
timesteps = 10

# 創建虛擬數據: 每一行代表一天的飛行距離、速度和高度
data = np.random.rand(data_size, 3)

# 將數據轉換為Pandas DataFrame
df = pd.DataFrame(data, columns=['distance', 'speed', 'altitude'])

# 資料正規化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(df)

# 生成輸入和輸出的時間序列
X = []
y = []

for i in range(timesteps, len(scaled_data)):
    X.append(scaled_data[i-timesteps:i])
    y.append(scaled_data[i])

X, y = np.array(X), np.array(y)

# 分割資料為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(units=3))  # 因為我們的輸出有3個特徵: distance, speed, altitude

# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')

# 訓練模型
model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test))

# 預測未來行為
predictions = model.predict(X_test)

# 反轉正規化以恢復原始數據範圍
predictions = scaler.inverse_transform(predictions)

print("預測結果:")
print(predictions)

1. 導入庫

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
  • numpypandas 是用來處理數據的基本庫。
  • tensorflow 是一個機器學習框架,用來建立和訓練深度學習模型。
  • SequentialLSTMDenseDropout 都是 Keras(TensorFlow 的高層 API)提供的模組,用於構建和編譯模型。
  • MinMaxScaler 用於數據正規化,使數據值落在一個統一的範圍內(例如 0 到 1)。
  • train_test_split 用於將數據分割為訓練集和測試集。

2. 數據準備

data_size = 1000
timesteps = 10

data = np.random.rand(data_size, 3)

df = pd.DataFrame(data, columns=['distance', 'speed', 'altitude'])
  • data_size 是數據集的大小(1000 行)。
  • timesteps 表示LSTM模型將考慮的時間步數,也就是在預測下一步時使用多少個過去的數據點。
  • data 是一個隨機生成的 1000 行 x 3 列的數據集,假設這些數據分別代表候鳥的飛行距離、速度和高度。
  • df 是一個Pandas DataFrame,將數據標籤為 distance(距離)、speed(速度)和 altitude(高度)。

3. 數據正規化

scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(df)
  • 使用 MinMaxScaler 將數據縮放到 [0, 1] 的範圍內。這樣可以使LSTM模型更容易收斂,並防止數據值差異過大導致模型表現不穩定。

4. 生成輸入和輸出

X = []
y = []

for i in range(timesteps, len(scaled_data)):
    X.append(scaled_data[i-timesteps:i])
    y.append(scaled_data[i])

X, y = np.array(X), np.array(y)
  • X 是輸入數據集,y 是輸出數據集。
  • 這段代碼將時序數據轉換為模型可以接受的格式。每個 X 包含 timesteps(10 個時間步)的數據,而 y 則是下一個時間步的數據。
  • 例如,如果 timesteps 是 10,那麼 X[0] 包含的是第 1 到第 10 步的數據,而 y[0] 包含的是第 11 步的數據。

5. 分割訓練集和測試集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  • 使用 train_test_split 將數據分為訓練集和測試集,測試集佔 20%。
  • random_state=42 是設置隨機種子,使得每次運行程式碼時分割結果一致。

6. 建立LSTM模型

model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(units=3))  # 輸出有3個特徵: distance, speed, altitude
  • Sequential() 是一個線性堆疊的模型,它允許你逐層構建神經網絡。
  • LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])) 是第一個LSTM層,有 50 個單元(或神經元)。return_sequences=True 表示返回完整的序列,這樣下一層 LSTM 層可以接收輸出的整個序列。
  • Dropout(0.2) 是一個正則化層,用來防止過擬合。這意味著每次訓練都會隨機“丟棄”20%的單元。
  • 第二個 LSTM(units=50) 層也有 50 個單元,但不返回序列。
  • Dense(units=3) 是一個全連接層,輸出 3 個單元,對應於 distancespeedaltitude

7. 編譯和訓練模型

model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test))
  • compile 函數用來配置訓練過程。這裡使用 adam 優化器(是一種常用的梯度下降優化方法),和 mean_squared_error 損失函數(適用於回歸問題)。
  • fit 函數開始訓練模型,訓練 20 個回合(epochs),每次處理 32 個樣本(batch_size),並且使用測試集來驗證模型的表現。

8. 進行預測

predictions = model.predict(X_test)
predictions = scaler.inverse_transform(predictions)

print("預測結果:")
print(predictions)
  • model.predict(X_test) 用測試集來進行預測,predictions 變量儲存了模型的預測結果。
  • scaler.inverse_transform(predictions) 將預測結果反轉正規化,恢復到原始數據的範圍,這樣我們可以解讀預測結果。
  • 最後,打印出預測結果。

總結

這個程式碼演示了如何使用LSTM模型來預測時序數據中的未來行為模式。在實際應用中,你需要用實際的候鳥行為數據來替換這裡的隨機數據,並且可能需要進行更多的數據預處理和模型調整,以提高預測的準確性。


上一篇
day 8 yolo 辨識網球是否界內球系統
下一篇
day 10 Lstm模型訓練
系列文
LSTM結合Yolo v8對於多隻斑馬魚行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言