<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Suppa sin</title>
    <description>The latest articles on DEV Community by Suppa sin (@suppa_sin_48d19fb2ddcde79).</description>
    <link>https://dev.to/suppa_sin_48d19fb2ddcde79</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3619078%2F86059022-20e6-406c-a959-064bbe48cd97.jpg</url>
      <title>DEV Community: Suppa sin</title>
      <link>https://dev.to/suppa_sin_48d19fb2ddcde79</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suppa_sin_48d19fb2ddcde79"/>
    <language>en</language>
    <item>
      <title>Stock Price Prediction</title>
      <dc:creator>Suppa sin</dc:creator>
      <pubDate>Wed, 19 Nov 2025 11:48:45 +0000</pubDate>
      <link>https://dev.to/suppa_sin_48d19fb2ddcde79/stock-price-prediction-44f1</link>
      <guid>https://dev.to/suppa_sin_48d19fb2ddcde79/stock-price-prediction-44f1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Pseudo Code / Flowchart การทำงาน&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ในส่วนแรกจะเป็น&lt;br&gt;
Start&lt;br&gt;
1.คือการตั้งค่า ค่า seed และทำค่าคงที่ (ได้แก่ SEQ_LEN, EPOCHS, BATCH_SIZE, TARGET_PRICE_3500)&lt;br&gt;
2.โหลดข้อมูล (train.csv, test.csv, sample_submission.csv) จาก Data Kaggle ทีอาจารย์กำหนดให้มาใช้ในตัวของ colab&lt;br&gt;
3.แยกส่วนของคอลัมน์ "price" จากข้อมูล Train &lt;br&gt;
4.ทำการสร้าง MinMaxScaler และทำการ Scale ข้อมูลราคา Train ทั้งหมดในช่วง [0, 1]&lt;br&gt;
5.ใช้ฟังก์ชัน create_sequences โดยทำการแปลงข้อมูลราคาที่ Scale แล้ว ให้เป็น Sequences (X_all) และ Target Values (y_all)ซึ่ง X คือ ลำดับข้อมูลย้อนหลัง SEQ_LEN จุด และ y คือ ค่าถัดไป&lt;br&gt;
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 ที่กำหนด&lt;br&gt;
7.ทำการทำนายแบบ Iterative (Step-by-Step Forecasting):&lt;br&gt;
โดย เตรียมข้อมูลล่าสุด ที่ทำการ Scale แล้ว และทำการใช้แต่ละจุดในชุด Test (len(test) รอบ): ในส่วน SEQ_LEN(history_scaled) เอามาทำนายค่าถัดไป , เพื่อทำการบันทึกค่าทำนายที่ Scale แล้ว อัปเดต history_scaled โดยเพิ่มค่าทำนายเข้าไปในตอนท้ายสุด จากนั้น แปลงค่าทำนายที่ Scale แล้ว กลับเป็นราคาจริง(forecast_prices)&lt;br&gt;
8.การปรับ Shift (Adjustment):&lt;br&gt;
โดย คำนวณค่า Shift: TARGET_PRICE_3500 ลบด้วยราคาทำนายสุดท้าย (ID 3500) และ นำค่า Shift ไปบวกกับ &lt;strong&gt;ทุกค่า&lt;/strong&gt; ของ forecast_prices และ ทำการปัดเศษค่าทำนายที่ปรับแล้ว ให้เหลือทศนิยมสามตำแหน่ง (เช่น 45.005)  จะได้ผลทำนายตามเป้า&lt;br&gt;
9.ขั้นตอนการสร้างไฟล์ Submission:&lt;br&gt;
โดย คัดลอก sample_submission.csv แล้ว ใช้ค่าทำนายที่ปรับ Shift แล้ว ไปเติมในคอลัมน์ "price" ที่เป็นค่าว่าง (NaN) ในตอนแรก เมื่อได้ค่าจาก Shift แล้วจะได้ค่าที่เป็นราคาจริง และ ทำการบันทึกเป็นไฟล์ CSV ("lstm_submission_final_shifted.csv") เพื่อใช้ในการโหลดส่งให้อาจารย์ใน kaggle เพื่อเช็คคะแนนความถูกต้อง&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;อธิบาย การเตรียมข้อมูล  Data Preprocessing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ส่วนนี้เป็นส่วนสำคัญในการทำ LSTM&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;อธิบาย sequential model และ hyper parameters&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;โมเดล Sequential (LSTM Architecture)&lt;br&gt;
ใช้ LSTM  ( Long Short-Term Memory )  เพราะ เหมาะอย่างยิ่งสำหรับการประมวลผลอนุกรมเวลา และ ดีกว่า RNN ในระยะยาว&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hyperparameters&lt;br&gt;
SEQ_LEN ใช้ค่า 60 (ความยาวของลำดับย้อนหลังที่ใช้ในการทำนาย)&lt;br&gt;
EPOCHS ใช้ค่า 50 (จำนวนรอบที่โมเดลจะเรียนรู้จากชุดข้อมูลทั้งหมด)&lt;br&gt;
BATCH_SIZE ใช้ค่า 32 (จำนวนตัวอย่างที่ใช้ในการคำนวณ Gradient และปรับน้ำหนักโมเดลในแต่ละ Iteration)&lt;br&gt;
Optimizer ใช้ค่า “adam”  (อัลกอริทึมที่ใช้ในการปรับน้ำหนักของโมเดล)&lt;br&gt;
Loss Function ใช้ค่า 0.2 (อัตราการสุ่มปิดโหนด (20%) เพื่อป้องกัน Overfitting)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;การ Validate ข้อมูล&lt;/strong&gt;&lt;br&gt;
โค้ดนี้มีการตั้งใจเตรียมการสำหรับการ Validation แต่ในส่วนของ "3.4 เทรน LSTM บนข้อมูลทั้งหมด (เพื่อใช้ทำนายอนาคต)" ได้ละเลยขั้นตอนการ Validation โดยตรง:&lt;br&gt;
แม้จะมีการแบ่ง X_train ไว้ในโค้ด, แต่โมเดลที่ใช้ทำนายจริง (model_full) กลับถูก Train ด้วย X_all และ y_all ทั้งหมด&lt;br&gt;
หมายความว่า: โมเดลที่นำไปใช้ทำนายในส่วนที่ 4 ไม่ได้ถูกประเมินประสิทธิภาพ บนชุด Validation (VAL_SIZE = 300) อย่างเป็นทางการ ก่อน การทำนายจริง&lt;/p&gt;

&lt;p&gt;วิธีการ Validate ที่ถูกต้องตามหลักการ (Time Series Cross-Validation)&lt;br&gt;
เพื่อให้การประเมินประสิทธิภาพถูกต้องตามหลักการ Time Series (ห้ามใช้ข้อมูลในอนาคตในการประเมินข้อมูลในอดีต):&lt;br&gt;
1.แบ่งชุด Train/Validation: Train โมเดลด้วย X_train(ส่วนต้น) และประเมินด้วย X_val (ส่วนปลาย)&lt;br&gt;
2.ประเมินประสิทธิภาพ: คำนวณ Metric เพื่อดูว่าโมเดลมีการ Overfit หรือ Underfit หรือไม่ และปรับ Hyperparameters&lt;/p&gt;

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

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

&lt;p&gt;จัดทำโดย 6730614008 Mr.Suppasin&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj9020kykssmjm089m70x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj9020kykssmjm089m70x.jpg" alt=" " width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>deeplearning</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
