ในบทความนี้ เราจะอธิบายขั้นตอนการใช้ LSTM สำหรับการพยากรณ์ข้อมูลอนุกรมเวลาด้วย Python พร้อมตัวอย่างการเขียนโค้ดอย่างละเอียด
ตัวอย่างข้อมูลที่ใช้
เราจะใช้ชุดข้อมูล Airline Passengers Dataset ซึ่งเป็นข้อมูลจำนวนผู้โดยสารรายเดือนของสายการบิน โดยสามารถดาวน์โหลดได้จาก Airline Passengers Dataset
หลังจากดาวน์โหลดชุดข้อมูลมาแล้วมาเริ่มขั้นตอนแรกกันเลย
- การโหลดและดูภาพรวมของข้อมูล
ข้อมูลจะถูกแสดงเป็นกราฟเพื่อดูแนวโน้มของจำนวนผู้โดยสารรายเดือน ดังภาพ
โค้ด: เลือกทั้งหมด
import pandas as pd import matplotlib.pyplot as plt # โหลดข้อมูล url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv" df = pd.read_csv(url, header=0, index_col=0, parse_dates=True) # ดูข้อมูลเบื้องต้น print(df.head()) # พล็อตข้อมูล plt.figure(figsize=(10, 6)) df.plot() plt.title("Monthly Airline Passengers") plt.xlabel("Date") plt.ylabel("Passengers") plt.show()
- การเตรียมข้อมูล
LSTM ต้องการข้อมูลที่อยู่ในรูปแบบของ sequences ดังนั้นเราจึงต้องทำการแปลงข้อมูลและปรับให้เหมาะสมสำหรับการนำไปใช้ในโมเดล- การ Normalize ข้อมูล
เราจะปรับข้อมูลให้อยู่ในช่วง 0 ถึง 1 ด้วย MinMaxScalerโค้ด: เลือกทั้งหมด
import numpy as np from sklearn.preprocessing import MinMaxScaler # Normalize ข้อมูล scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(df.values)
- การสร้าง Sequence Data
เราจะแบ่งข้อมูลออกเป็น sequences โดยใช้ข้อมูลในอดีต (เช่น 12 เดือน) เพื่อพยากรณ์ค่าในอนาคตโค้ด: เลือกทั้งหมด
# สร้าง sequence data def create_sequences(data, seq_length): X, y = [], [] for i in range(len(data) - seq_length): X.append(data[i:i+seq_length]) y.append(data[i+seq_length]) return np.array(X), np.array(y) # กำหนดความยาวของ sequence seq_length = 12 # แบ่งข้อมูลเป็น train/test train_size = int(len(scaled_data) * 0.8) train_data, test_data = scaled_data[:train_size], scaled_data[train_size:] # สร้างชุดข้อมูลสำหรับ train และ test X_train, y_train = create_sequences(train_data, seq_length) X_test, y_test = create_sequences(test_data, seq_length)
- การ Normalize ข้อมูล
- การสร้างและเทรน LSTM Model
- การสร้างโมเดล
เราจะสร้างโมเดล LSTM ด้วย TensorFlow/Kerasโค้ด: เลือกทั้งหมด
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense # สร้างโมเดล LSTM model = Sequential([ LSTM(50, return_sequences=False, input_shape=(seq_length, 1)), Dense(1) ]) # คอมไพล์โมเดล model.compile(optimizer='adam', loss='mean_squared_error') # ดูสรุปโมเดล model.summary()
- การเทรนโมเดล
โค้ด: เลือกทั้งหมด
# เทรนโมเดล model.fit(X_train, y_train, epochs=20, batch_size=16, validation_data=(X_test, y_test))
- การสร้างโมเดล
- การทำนายผลและการประเมินโมเดล
หลังจากเทรนโมเดลเสร็จ เราจะทำการทำนายผลสำหรับข้อมูลทดสอบค่า RMSE แสดงถึงความคลาดเคลื่อนระหว่างค่าที่โมเดลพยากรณ์ได้กับค่าจริง โดยค่าที่ต่ำกว่าแสดงถึงความแม่นยำที่สูงขึ้น หากค่า RMSE สูง อาจแสดงว่ามีข้อผิดพลาดในโมเดลหรือข้อมูล เช่น การเลือกจำนวน sequence ที่ไม่เหมาะสม หรือโมเดลอาจต้องการการปรับพารามิเตอร์เพิ่มเติมโค้ด: เลือกทั้งหมด
# ทำนายผล from sklearn.metrics import mean_squared_error predictions = model.predict(X_test) predictions = scaler.inverse_transform(predictions) actual = scaler.inverse_transform(y_test.reshape(-1, 1)) rmse = np.sqrt(mean_squared_error(actual, predictions)) print(f"RMSE: {rmse}")
ในบทความนี้ แสดงตัวอย่างการใช้ LSTM Model สำหรับการพยากรณ์ข้อมูลอนุกรมเวลา โดยเริ่มตั้งแต่การเตรียมข้อมูล การสร้าง sequences การสร้างโมเดล และการทำนายผล LSTM ซึ่งเป็นเครื่องมือที่นิยมใช้สำหรับการพยากรณ์ข้อมูลอนุกรมเวลา โดยเฉพาะเมื่อข้อมูลมีความซับซ้อนและไม่เชิงเส้น อย่างไรก็ตาม การเลือกค่าพารามิเตอร์ (เช่น ความยาวของ sequence และจำนวน layer) อาจต้องทดลองหลายครั้งเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด
คุณสามารถนำไปประยุกต์ให้เข้ากับงานของคุณได้ เช่น การใช้งานด้านการแปลภาษา หรือการสร้างโมเดลสำหรับแก้ปัญหาต่าง ๆ
อ้างอิง
https://matthewmacfarquhar.medium.com/predicting-airline-passengers-using-lstm-and-tensorflow-ab86347cf318
https://medium.com/@sinart.t/long-short-term-memory-lstm-e6cb23b494c6
https://www.kaggle.com/code/tanyildizderya/airline-passenger-lstm