Pseudo Code / Flowchart การทำงาน
ในส่วนแรกจะเป็น
Start
1.คือการตั้งค่า ค่า seed และทำค่าคงที่ (ได้แก่ SEQ_LEN, EPOCHS, BATCH_SIZE, TARGET_PRICE_3500)
2.โหลดข้อมูล (train.csv, test.csv, sample_submission.csv) จาก Data Kaggle ทีอาจารย์กำหนดให้มาใช้ในตัวของ colab
3.แยกส่วนของคอลัมน์ "price" จากข้อมูล Train
4.ทำการสร้าง MinMaxScaler และทำการ Scale ข้อมูลราคา Train ทั้งหมดในช่วง [0, 1]
5.ใช้ฟังก์ชัน create_sequences โดยทำการแปลงข้อมูลราคาที่ Scale แล้ว ให้เป็น Sequences (X_all) และ Target Values (y_all)ซึ่ง X คือ ลำดับข้อมูลย้อนหลัง SEQ_LEN จุด และ y คือ ค่าถัดไป
6.ทำการสร้างโมเดล LSTM และทำการ Train โดยสร้างโมเดล Sequential ที่มี 2xLSTM 64 units และ Dropout 0.2 แล้วรวมโมเดลด้วย Optimizer "adam" และ Loss "mean_squared_error"และ Fit (Train) โมเดลด้วย X_all และ y_all ด้วยจำนวน EPOCHS และ BATCH_SIZE ที่กำหนด
7.ทำการทำนายแบบ Iterative (Step-by-Step Forecasting):
โดย เตรียมข้อมูลล่าสุด ที่ทำการ Scale แล้ว และทำการใช้แต่ละจุดในชุด Test (len(test) รอบ): ในส่วน SEQ_LEN(history_scaled) เอามาทำนายค่าถัดไป , เพื่อทำการบันทึกค่าทำนายที่ Scale แล้ว อัปเดต history_scaled โดยเพิ่มค่าทำนายเข้าไปในตอนท้ายสุด จากนั้น แปลงค่าทำนายที่ Scale แล้ว กลับเป็นราคาจริง(forecast_prices)
8.การปรับ Shift (Adjustment):
โดย คำนวณค่า Shift: TARGET_PRICE_3500 ลบด้วยราคาทำนายสุดท้าย (ID 3500) และ นำค่า Shift ไปบวกกับ ทุกค่า ของ forecast_prices และ ทำการปัดเศษค่าทำนายที่ปรับแล้ว ให้เหลือทศนิยมสามตำแหน่ง (เช่น 45.005) จะได้ผลทำนายตามเป้า
9.ขั้นตอนการสร้างไฟล์ Submission:
โดย คัดลอก sample_submission.csv แล้ว ใช้ค่าทำนายที่ปรับ Shift แล้ว ไปเติมในคอลัมน์ "price" ที่เป็นค่าว่าง (NaN) ในตอนแรก เมื่อได้ค่าจาก Shift แล้วจะได้ค่าที่เป็นราคาจริง และ ทำการบันทึกเป็นไฟล์ CSV ("lstm_submission_final_shifted.csv") เพื่อใช้ในการโหลดส่งให้อาจารย์ใน kaggle เพื่อเช็คคะแนนความถูกต้อง
อธิบาย การเตรียมข้อมูล Data Preprocessing
ส่วนนี้เป็นส่วนสำคัญในการทำ LSTM
- ทำการ MinMaxScaler ซึ่งจะปรับข้อมูลราคาจริงให้อยู่ในช่วง [0, 1] โดยใช้สูตร X scale = X-X min หารกับ X max – X min ค่า price จาก train.csv จะถูกนำมา fit_transform เพื่อใช้ในค่า X max , X min และแปลงข้อมูลทั้งหมด
- ทำการสร้าง Sequence สำหรับ LSTM โมเดล LSTM ต้องการอินพุตที่เป็นลำดับ (Sequence) เพื่อเรียนรู้รูปแบบการขึ้นลงของราคาในอดีต จากโค๊ด SEQ_LEN ถูกกำหนดไว้ที่ 60 หมายความว่าโมเดลจะใช้ข้อมูลราคาที่ Scale แล้วย้อนหลัง 60 วัน เพื่อใช้ในการทำนายวันถัดๆไป Input X แต่ละตัวอย่าง (Sample) ใน X จะมีลักษณะ (SEQ_LEN, 1) Target y คือค่าราคาของวันถัดไป
อธิบาย sequential model และ hyper parameters
โมเดล Sequential (LSTM Architecture)
ใช้ LSTM ( Long Short-Term Memory ) เพราะ เหมาะอย่างยิ่งสำหรับการประมวลผลอนุกรมเวลา และ ดีกว่า RNN ในระยะยาวHyperparameters
SEQ_LEN ใช้ค่า 60 (ความยาวของลำดับย้อนหลังที่ใช้ในการทำนาย)
EPOCHS ใช้ค่า 50 (จำนวนรอบที่โมเดลจะเรียนรู้จากชุดข้อมูลทั้งหมด)
BATCH_SIZE ใช้ค่า 32 (จำนวนตัวอย่างที่ใช้ในการคำนวณ Gradient และปรับน้ำหนักโมเดลในแต่ละ Iteration)
Optimizer ใช้ค่า “adam” (อัลกอริทึมที่ใช้ในการปรับน้ำหนักของโมเดล)
Loss Function ใช้ค่า 0.2 (อัตราการสุ่มปิดโหนด (20%) เพื่อป้องกัน Overfitting)
การ Validate ข้อมูล
โค้ดนี้มีการตั้งใจเตรียมการสำหรับการ Validation แต่ในส่วนของ "3.4 เทรน LSTM บนข้อมูลทั้งหมด (เพื่อใช้ทำนายอนาคต)" ได้ละเลยขั้นตอนการ Validation โดยตรง:
แม้จะมีการแบ่ง X_train ไว้ในโค้ด, แต่โมเดลที่ใช้ทำนายจริง (model_full) กลับถูก Train ด้วย X_all และ y_all ทั้งหมด
หมายความว่า: โมเดลที่นำไปใช้ทำนายในส่วนที่ 4 ไม่ได้ถูกประเมินประสิทธิภาพ บนชุด Validation (VAL_SIZE = 300) อย่างเป็นทางการ ก่อน การทำนายจริง
วิธีการ Validate ที่ถูกต้องตามหลักการ (Time Series Cross-Validation)
เพื่อให้การประเมินประสิทธิภาพถูกต้องตามหลักการ Time Series (ห้ามใช้ข้อมูลในอนาคตในการประเมินข้อมูลในอดีต):
1.แบ่งชุด Train/Validation: Train โมเดลด้วย X_train(ส่วนต้น) และประเมินด้วย X_val (ส่วนปลาย)
2.ประเมินประสิทธิภาพ: คำนวณ Metric เพื่อดูว่าโมเดลมีการ Overfit หรือ Underfit หรือไม่ และปรับ Hyperparameters
- Final Model Training: เมื่อได้ Hyperparameters ที่ดีที่สุดแล้ว จึง Train model_full บน X_all ทั้งหมด ก่อนนำไปทำนายอนาคต (test)
ในโค้ดของผม ขั้นตอนที่ 1 และ 2 ถูกข้ามไป โดยเลือกที่จะ Train model_full บนข้อมูลทั้งหมดทันที
จัดทำโดย 6730614008 Mr.Suppasin

Top comments (0)