DEV Community

Suppa sin
Suppa sin

Posted on • Edited on

Stock Price Prediction

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

  1. ทำการ MinMaxScaler ซึ่งจะปรับข้อมูลราคาจริงให้อยู่ในช่วง [0, 1] โดยใช้สูตร X scale = X-X min หารกับ X max – X min ค่า price จาก train.csv จะถูกนำมา fit_transform เพื่อใช้ในค่า X max , X min และแปลงข้อมูลทั้งหมด
  2. ทำการสร้าง Sequence สำหรับ LSTM โมเดล LSTM ต้องการอินพุตที่เป็นลำดับ (Sequence) เพื่อเรียนรู้รูปแบบการขึ้นลงของราคาในอดีต จากโค๊ด SEQ_LEN ถูกกำหนดไว้ที่ 60 หมายความว่าโมเดลจะใช้ข้อมูลราคาที่ Scale แล้วย้อนหลัง 60 วัน เพื่อใช้ในการทำนายวันถัดๆไป Input X แต่ละตัวอย่าง (Sample) ใน X จะมีลักษณะ (SEQ_LEN, 1) Target y คือค่าราคาของวันถัดไป

อธิบาย sequential model และ hyper parameters

  1. โมเดล Sequential (LSTM Architecture)
    ใช้ LSTM ( Long Short-Term Memory ) เพราะ เหมาะอย่างยิ่งสำหรับการประมวลผลอนุกรมเวลา และ ดีกว่า RNN ในระยะยาว

  2. 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

  1. Final Model Training: เมื่อได้ Hyperparameters ที่ดีที่สุดแล้ว จึง Train model_full บน X_all ทั้งหมด ก่อนนำไปทำนายอนาคต (test)

ในโค้ดของผม ขั้นตอนที่ 1 และ 2 ถูกข้ามไป โดยเลือกที่จะ Train model_full บนข้อมูลทั้งหมดทันที

จัดทำโดย 6730614008 Mr.Suppasin

Top comments (0)