<?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>Forem: Attanon Sukkeaw</title>
    <description>The latest articles on Forem by Attanon Sukkeaw (@attanon_sukkeaw_1d357b716).</description>
    <link>https://forem.com/attanon_sukkeaw_1d357b716</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3621092%2F371daf5e-b153-485d-aa5b-7255b47a43b1.png</url>
      <title>Forem: Attanon Sukkeaw</title>
      <link>https://forem.com/attanon_sukkeaw_1d357b716</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/attanon_sukkeaw_1d357b716"/>
    <language>en</language>
    <item>
      <title>Stock Price Prediction by ML Models</title>
      <dc:creator>Attanon Sukkeaw</dc:creator>
      <pubDate>Thu, 20 Nov 2025 16:44:48 +0000</pubDate>
      <link>https://forem.com/attanon_sukkeaw_1d357b716/stock-price-prediction-by-ml-models-bho</link>
      <guid>https://forem.com/attanon_sukkeaw_1d357b716/stock-price-prediction-by-ml-models-bho</guid>
      <description>&lt;p&gt;สวัสดีครับ ผมคือ AI Engineer มือใหม่&lt;br&gt;
วันนี้ผมจะมาแชร์ประสบการณ์การทำนายหุ้นโดยใช้รูปแบบ &lt;strong&gt;Hybrid-model&lt;/strong&gt; ซึ่งคือ&lt;br&gt;
การผสมกันระหว่าง &lt;strong&gt;LSTM + Transformer&lt;/strong&gt; Hybrid Model&lt;/p&gt;

&lt;p&gt;ซึ่งวันนี้ผมจะมาอธิบายว่า LSTM คืออะไร และ Transformer คืออะไร พร้อมหลักการทำงานของโค้ดที่ผสมระหว่าง 2 models นี้  &lt;/p&gt;

&lt;p&gt;1.&lt;strong&gt;LSTM&lt;/strong&gt; คือ Long Short‑Term Memory (LSTM) เป็นรูปแบบหนึ่งของ Recurrent Neural Network (RNN) ที่ถูกพัฒนาโดย Sepp Hochreiter และ Jürgen Schmidhuber เพื่อจัดการกับปัญหาการเรียนรู้แบบ “ขึ้นกับบริบทในอดีตระยะยาว” (long-term dependencies) ซึ่ง RNN ปกติทำได้ไม่ดีนัก LSTM จึงเพิ่ม “เซลล์ความจำ” (memory cell) เข้าไปในโครงสร้าง ทำให้สามารถเก็บข้อมูลระยะยาว และเลือกที่จะลืมหรือจดจำข้อมูลที่สำคัญได้ &lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;Transformer&lt;/strong&gt; คือ Transformer คือ สถาปัตยกรรมของ Neural Network ชนิดหนึ่ง ที่ออกแบบมาเพื่อแปลงข้อมูลลำดับหนึ่งไปยังลำดับอีกชุดหนึ่ง (Sequence-to-Sequence) หรือจากตัวเข้ารหัส (Encoder) ไปยังตัวถอดรหัส (Decoder)&lt;br&gt;
โดยมักใช้แก้ปัญหาเช่นการแปลภาษาที่ต้องจับความซับซ้อนของ อารมณ์และบริบท ในข้อความได้อย่างแม่นยำ&lt;/p&gt;

&lt;p&gt;Transformer ใช้กลไกที่เรียกว่า Self-Attention ซึ่งทำงานโดยการมองหาความสัมพันธ์ระหว่างทุกตำแหน่งของข้อมูลกับทุกตำแหน่งในลำดับเดียวกัน พร้อมกำหนดน้ำหนักความสำคัญให้กับแต่ละตำแหน่ง โดยไม่สนใจว่าระยะห่างของข้อมูลจะอยู่ใกล้หรือไกลกันแค่ไหน ทำให้โมเดลสามารถเข้าใจบริบทในระดับกว้างได้อย่างมีประสิทธิภาพ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;การเตรียมข้อมูล Data Preprocessing&lt;/strong&gt;&lt;br&gt;
ผมจะโหลดข้อมูลหุ้นไฟล์ CSV ซึ่งมี train(1).csv, test(1).csv, sample_submission(1).csv และทำการปรับข้อมูลด้วย MinMaxScaler เพื่อให้อยู่ในช่วง 0 ถึง 1 ซึ่งช่วยให้โมเดลเรียนรู้ได้อย่างมีประสิทธิภาพ จากนั้นผมได้สร้างชุดข้อมูลแบบลำดับโดยการแบ่งข้อมูลราคาย้อนหลังจำนวน 90 วันเป็นอินพุต และใช้ราคาของวันถัดไปเป็นเป้าหมาย โดยจัดรูปแบบข้อมูลให้อยู่ในมิติที่เหมาะสมสำหรับโมเดล&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;sequential model และ hyper parameters&lt;/strong&gt;&lt;br&gt;
ผมสร้างโมเดลด้วย Keras โดยใช้ LSTM 3 ชั้นเพื่อจับแนวโน้มข้อมูลระยะสั้น จากนั้นแปลงเป็น embedding แล้วส่งเข้า Transformer block ที่มี multi-head attention 4 หัว เพื่อเรียนรู้ความสัมพันธ์ระยะยาว ใช้ dropout ลดการ overfitting และ GlobalAveragePooling ก่อนส่งผ่าน dense layer ทำนายราคาวันถัดไป ผมตั้งพารามิเตอร์สำคัญ เช่น window size 90, embedding dimension 64, learning rate 0.0005 และ weight decay เพื่อให้โมเดลฝึกได้ดีและเสถียร&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;การ Validate ข้อมูล *&lt;/em&gt;&lt;br&gt;
การตรวจสอบโมเดล ผมใช้การแยกข้อมูล validation 10% จากชุดฝึก เพื่อประเมินประสิทธิภาพโมเดลในแต่ละ epoch และใช้ EarlyStopping เพื่อหยุดการฝึกหากค่า validation loss ไม่ดีขึ้นภายใน 10 รอบ ช่วยป้องกันการ overfitting และคืนโมเดลที่ดีที่สุดกลับมา__&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pseudo Code&lt;/strong&gt;&lt;br&gt;
เริ่มต้นโปรแกรม&lt;/p&gt;

&lt;p&gt;โหลดข้อมูล train, test, sample_submission&lt;/p&gt;

&lt;p&gt;กำหนด hyperparameters:&lt;br&gt;
    WINDOW = 90&lt;br&gt;
    EMBED_DIM = 64&lt;br&gt;
    NUM_HEADS = 4&lt;br&gt;
    FF_DIM = 128&lt;/p&gt;

&lt;p&gt;ทำการ Normalize ราคาหุ้นใน train ด้วย MinMaxScaler&lt;/p&gt;

&lt;p&gt;ฟังก์ชัน create_dataset(data, window):&lt;br&gt;
    สำหรับทุกตำแหน่งตั้งแต่ window → สิ้นสุดข้อมูล:&lt;br&gt;
        X = ข้อมูลย้อนหลังตามจำนวน window วัน&lt;br&gt;
        y = ราคาวันถัดไป&lt;br&gt;
    ส่งคืน X, y&lt;/p&gt;

&lt;p&gt;สร้างชุดข้อมูล X_train, y_train ด้วย WINDOW ขนาด 90 วัน&lt;br&gt;
ปรับรูป X_train ให้มีรูปแบบ (จำนวนข้อมูล, WINDOW, 1)&lt;/p&gt;

&lt;p&gt;สร้างคลาส TransformerBlock:&lt;br&gt;
    - Multi-head attention&lt;br&gt;
    - Feed-forward network&lt;br&gt;
    - Layer normalization + dropout&lt;/p&gt;

&lt;p&gt;สร้างโมเดล:&lt;br&gt;
    Input: sequence 90 วัน, รูปแบบ (WINDOW,1)&lt;br&gt;
    ผ่าน LSTM 3 ชั้น (return_sequences=True ทุกชั้น)&lt;br&gt;
    ผ่าน Dense เพื่อแปลงเป็น embedding (EMBED_DIM)&lt;br&gt;
    ผ่าน TransformerBlock 1 ชั้น&lt;br&gt;
    Global Average Pooling&lt;br&gt;
    Dropout&lt;br&gt;
    Dense(1) → ให้ผลลัพธ์ราคาวันถัดไป&lt;/p&gt;

&lt;p&gt;คอมไพล์โมเดลด้วย optimizer AdamW และ loss = MSE&lt;/p&gt;

&lt;p&gt;สร้าง EarlyStopping เฝ้าดู val_loss&lt;/p&gt;

&lt;p&gt;ฝึกโมเดลด้วย:&lt;br&gt;
    epochs = 100&lt;br&gt;
    batch_size = 32&lt;br&gt;
    validation_split = 0.1&lt;br&gt;
    early stopping&lt;/p&gt;

&lt;p&gt;---- เริ่มการพยากรณ์อนาคต ----&lt;/p&gt;

&lt;p&gt;นำ WINDOW วันสุดท้ายของ train มาสร้างอินพุตเริ่มต้น&lt;/p&gt;

&lt;p&gt;วนซ้ำสำหรับจำนวนวันใน test:&lt;br&gt;
    1) โมเดลทำนายราคาวันถัดไป (แบบ scaled)&lt;br&gt;
    2) เก็บผลลัพธ์ไว้ใน predictions&lt;br&gt;
    3) นำการทำนายใหม่มาต่อท้าย window และเลื่อนหน้าต่างข้อมูล 1 วัน&lt;br&gt;
    4) ใช้ window ใหม่ในการทำนายครั้งถัดไป&lt;/p&gt;

&lt;p&gt;Inverse transform ผลลัพธ์กลับไปเป็นราคาจริง&lt;/p&gt;

&lt;p&gt;โหลด sample_submission&lt;br&gt;
แทนที่คอลัมน์ price ด้วยผลพยากรณ์ทั้งหมด&lt;/p&gt;

&lt;p&gt;บันทึก submission.csv&lt;/p&gt;

&lt;p&gt;จบโปรแกรม&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>deeplearning</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
