Courses
การทำนายผลฟุตบอลนั้นยาก ฟุตบอลเป็นกีฬาที่ทำประตูน้อย การยิงที่แฉลบเพียงครั้งเดียวก็เปลี่ยนผลการแข่งขันได้ และส่วนหนึ่งของทุกแมตช์ก็มักขึ้นอยู่กับโชค ฟุตบอลระดับชาติก็ยิ่งยากกว่า: ทีมชาติเก็บแมตช์แข่งขันจริงต่อปีไม่กี่นัด จึงมีข้อมูลให้เรียนรู้น้อยกว่าลีกสโมสรอย่างมาก
และเท่านั้นยังไม่พอ FIFA ยังทำให้โจทย์ยากขึ้นสำหรับฟุตบอลโลกปีนี้ด้วย ฟอร์แมตใหม่สำหรับทัวร์นาเมนต์ 48 ทีม เปิดให้สองทีมอันดับแรกจากทั้ง 12 กลุ่มเข้ารอบ พร้อมด้วยอันดับสามที่ดีที่สุด 8 จาก 12 กลุ่ม ทำให้ชะตากรรมรอบแบ่งกลุ่มคาดเดายาก เนื่องจากผมชอบความท้าทาย (และฟุตบอล) นี่แหละคือสิ่งที่ตั้งใจจะลองทำนายให้ได้
นี่เป็นภาคต่อจากโครงการทำนาย EURO 2024 ของผม ซึ่งยกเครื่องใหม่แทบทั้งหมด คราวก่อนทำงานทั้งหมดใน Jupyter notebook และทำนายสกอร์ไลน์ที่น่าจะเป็นที่สุดต่อแมตช์ คราวนี้ผมสร้างท่อส่งงาน MLOps แบบครบวงจรที่ดึงผลสด ฝึกสอนตัวเองใหม่ และรันการจำลองมอนติคาร์โลทั้งทัวร์นาเมนต์ 10,000 ครั้ง แปลงการพยากรณ์ระดับแมตช์ให้เป็นความน่าจะเป็นว่าแต่ละทีมจะไปได้ไกลแค่ไหน
ในบทความนี้ ผมจะพาเดินดูโปรเจกต์ในภาพกว้าง: ข้อมูลและฟีเจอร์ แนวปฏิบัติ MLOps ที่ทำให้ทำซ้ำได้ โครงสร้างของท่อส่งงาน และโมเดลไหนที่ทำนายฟุตบอลทีมชาติได้ดีที่สุด โค้ดฉบับเต็มอยู่ในที่เก็บโปรเจกต์ และแน่นอนว่าจะบอกด้วยว่าโมเดลคิดว่าใครจะเป็นแชมป์ (สปอยล์: ชอบสเปนและอาร์เจนตินาราว 16% เท่ากัน แต่จุดที่น่าสนใจคือกระบวนการไปถึงข้อสรุปนั้น)
ถ้าเริ่มอินกับทัวร์นาเมนต์แล้ว แนะนำให้ชมบันทึกการบรรยายจากงาน Data & AI World Cup ของเรา หรือร่วมแข่งขัน FIFA World Cup 2026 Prediction ผู้ชนะจะได้รับเสื้อทีมชาติอย่างเป็นทางการและสมาชิก Claude Enterprise ระยะเวลา 3 เดือน ติดตามผลแบบเรียลไทม์ได้ที่ กระดานผู้นำสด
การทำนาย FIFA World Cup 2026
สรุปสั้นๆ
- นี่คือท่อส่งงาน MLOps แบบครบวงจรที่ทำนายฟุตบอลโลก 2026 โดยดึงผลการแข่งขันทีมชาติล่าสุดและฝึกสอนใหม่อัตโนมัติบน Google Cloud ทุกสองชั่วโมงระหว่างทัวร์นาเมนต์
- ข้อมูลจาก API-Football และคะแนน Elo ถูกประมวลผลผ่านสถาปัตยกรรมเหรียญตรา Bronze-Silver-Gold และจัดเวอร์ชันด้วย DVC เพื่อให้ทำซ้ำได้สมบูรณ์
- เปรียบเทียบ 10 โมเดลจาก 5 ตระกูลบนชุดทดสอบกันไว้ 347 แมตช์; XGBoost ชนะฉิวเฉียด โดย 5 อันดับแรกแทบแยกกันไม่ออก และความต่าง Elo ระหว่างทีมคือปัจจัยพยากรณ์หลัก
- การจำลองมอนติคาร์โลเล่นทั้งทัวร์นาเมนต์ 10,000 ครั้ง แปลงการทำนายประตูระดับแมตช์ให้เป็นโอกาสเข้ารอบและคว้าแชมป์ของแต่ละทีม
- ณ วันที่ 10 มิถุนายน 2026 ตัวเต็งของโมเดลคือสเปนและอาร์เจนตินาประมาณ 16% เท่ากัน สามารถติดตามการทำนายสดบน แดชบอร์ด Streamlit ที่รีเฟรชทุกสองชั่วโมง
ข้อมูลที่อยู่เบื้องหลังการทำนาย
คุณภาพของการทำนายดีได้เท่ากับสิ่งที่ใส่เข้าไป จึงควรเริ่มจากวัตถุดิบ โมเดลเรียนรู้จากแหล่งข้อมูลสดสองแหล่งและแปลงให้เป็นตารางฟีเจอร์ที่เป็นระเบียบเพียงชุดเดียว
แหล่งที่มาของข้อมูล
ทุกอย่างเริ่มจากสองแหล่งนี้ API-Football จัดหาโปรแกรมแข่งและสถิติต่อแมตช์: ใครพบใคร เมื่อไหร่ ที่ไหน และจบอย่างไร ส่วน eloratings.net จัดอันดับ Elo ให้ทุกทีมชาติ
คะแนน Elo คือเลขเดียวที่สะท้อนความแข็งแกร่งของทีม ทุกทีมอยู่บนสเกลนี้ และหลังจบแต่ละนัด คะแนนจะอัปเดต: ชนะทีมที่แข็งกว่าได้มาก แพ้ทีมที่อ่อนกว่าก็ตกฮวบ ไอเดียมาจากหมากรุกและปรับใช้กับฟุตบอลได้ลงตัว หากอยากเข้าใจแบบเต็มๆ บทความ DataCamp ก่อนหน้านี้อธิบายในบริบทฟุตบอลโลก 2022
เมื่อนำมารวมกัน แหล่งข้อมูลทั้งสองให้ Gold dataset ราว 6,900 แมตช์ทีมชาติตั้งแต่ปี 2018 ให้เรียนรู้
โมเดลทำนายอะไร
นี่คือการออกแบบสำคัญข้อแรก แทนที่จะทำนายผลเป็น ชนะ เสมอ แพ้ โดยตรง โมเดลจะทำนายสิ่งที่ละเอียดกว่า: จำนวนประตูที่แต่ละทีมทำได้ในแมตช์หนึ่ง จำนวนประตูในฟุตบอลโดยประมาณตาม การกระจายแบบปัวซอง ซึ่งเป็นวิธีมาตรฐานในการจำลองเหตุการณ์ที่เกิดไม่บ่อยภายในช่วงเวลาคงที่
การทำนายประตูแทนผลการแข่งขันคือสิ่งที่ทำให้ทุกอย่างต่อจากนี้เป็นไปได้ เมื่อโมเดลให้สกอร์ไลน์สมเหตุสมผลได้สำหรับทุกคู่คำถามที่ทุกคนสนใจจริงๆ เช่น ใครจะผ่านรอบแบ่งกลุ่มและใครจะชูถ้วย แก้ได้ด้วยการจำลองสกอร์ไลน์เหล่านั้นเป็นพันๆ ครั้ง
ฟีเจอร์ที่สำคัญ
แต่ละแมตช์อธิบายด้วยชุดฟีเจอร์เล็กๆ ที่คัดสรรมาอย่างตั้งใจ:
- ความต่าง Elo: ช่องว่างคะแนนระหว่างสองทีม นี่คือฟีเจอร์ที่สำคัญที่สุดแบบทิ้งห่าง โดยมีความสำคัญมากกว่าฟีเจอร์รองลงมาราวสองลำดับขั้น ซึ่งตรงกับสามัญสำนึก เพราะช่องว่างความแข็งแกร่งบอกผลที่เป็นไปได้มากกว่าสิ่งอื่นแทบทั้งหมด
- ผลรวม Elo: คะแนนสองทีมบวกกัน เป็นตัวแทนคุณภาพโดยรวมของแมตช์ ความต่างอย่างเดียวแยกอาร์เจนตินาพบสเปนออกจากซานมาริโนพบอันดอร์ราไม่ได้ ทั้งที่ทั้งสองเป็นเกมสูสีต่างระดับ ผลรวมช่วยคืนข้อมูลส่วนนั้น
- การเปลี่ยนแปลง Elo แบบกลิ้ง (5 นัดหลัง): คะแนนของแต่ละทีมเปลี่ยนไปล่าสุดแค่ไหน จับฟอร์มการเล่นโดยคำนึงถึงความแข็งแกร่งของคู่แข่งอยู่แล้ว
- ประตูได้เสียแบบกลิ้ง (5 นัดหลัง): ผลงานรุกและรับล่าสุดในเชิงปริมาณ คำนวณแยกให้แต่ละทีม
- บริบทของแมตช์: ระดับความสำคัญของรายการ (ฟุตบอลโลกรอบสุดท้ายต่างจากรอบคัดเลือกหรือนัดเนชันส์ลีก) เป็นนัดน็อกเอาต์หรือไม่ และแข่งสนามกลางหรือไม่
ทุกฟีเจอร์ป้องกันการรั่วไหลอย่างเคร่งครัด หมายถึงใช้เฉพาะข้อมูลที่มีอยู่ก่อนเขี่ยลูกเริ่มเกม ฟังดูชัดเจน แต่เป็นวิธีที่เผลอสร้างโมเดลที่ดูดีในเทสแต่พังในโลกจริงได้ง่ายมาก
อีกไอเดียที่ตัดออก: เดิมตั้งใจทำฟีเจอร์ "สไตล์การเล่น" ด้วยการจัดกลุ่มทีมจากสถิติในเกม เป็นขั้นตอน การเรียนรู้แบบไม่มีผู้สอน แต่ในทางปฏิบัติทีมไม่แยกเป็นกลุ่มที่มีความหมาย จึงเลือกไม่ป้อนสัญญาณรบกวนให้โมเดล ผลลบก็ยังเป็นผลลัพธ์
ทำให้ข้อมูลทำซ้ำได้
เมื่อข้อมูลไหลเข้าจากสองแหล่งอย่างต่อเนื่อง เส้นทางจากไฟล์ดิบไปถึงฟีเจอร์พร้อมเทรนต้องเหมือนเดิมทุกครั้ง ซึ่ง สถาปัตยกรรมเหรียญตรา ช่วยได้ โดยแบ่งข้อมูลเป็นสามชั้น:
- Bronze: ข้อมูลดิบตามที่เข้ามา ไม่แตะต้อง
- Silver: ทำความสะอาดและมาตรฐาน ที่นี่จะจับคู่ชื่อทีมระหว่างสองแหล่ง (มักสะกดไม่เหมือนกัน) ตรวจสอบสคีมา ผูกคะแนน Elo เข้ากับสถิติแมตช์ และจัดการกับข้อมูลที่ขาดหรือผิดรูป
- Gold: ชั้นสำหรับโมเดล เป็นตารางแถวละหนึ่งแมตช์พร้อมฟีเจอร์ครบถ้วนพร้อมฝึกสอน
แต่ละชั้นป้อนให้ชั้นถัดไป เมื่อมีอะไรแปลก สามารถไล่ย้อนทีละสเตจแทนการแก้ทุกอย่างพร้อมกัน เพื่อให้เส้นทางทั้งหมดทำซ้ำได้ ผมใช้ DVC (Data Version Control) ทุกครั้งที่มีผลสดเข้ามา คำสั่งเดียว dvc repro จะสร้าง Silver และ Gold จาก Bronze ใหม่ โดยรันเฉพาะสเตจที่อินพุตเปลี่ยน และเวอร์ชันชุดข้อมูลที่ได้เพื่อย้อนกลับสถานะก่อนหน้าได้เป๊ะ
เลือกโมเดลที่ดีที่สุด
การทำนายจำนวนประตูเป็นโจทย์ที่มีการศึกษาอย่างกว้างและไม่มีเครื่องมือเดียวที่ชัดเจน ดังนั้นแทนที่จะเลือกวิธีเดียวตั้งแต่แรก ผมสร้างไว้สิบโมเดลแล้วให้แข่งกัน
ผู้ท้าชิง
สิบโมเดลครอบคลุมห้าตระกูลพร้อมเบสไลน์ง่ายๆ ไม่จำเป็นต้องรู้กลไกภายใน จุดสำคัญคือแต่ละแบบตั้งสมมติฐานต่างกันมากว่าประตูเกิดขึ้นอย่างไร
| ตระกูล | โมเดล | แนวคิดหลัก |
|---|---|---|
| เบสไลน์ | Mean-rate Poisson | สมมติว่าทุกทีมยิงได้ตามค่าเฉลี่ยระยะยาวโดยรวม ไม่สนฟีเจอร์ เป็นฐานให้โมเดลอื่นต้องชนะให้ได้ |
| สถิติ | Bivariate Poisson, Negative Binomial | จำลองจำนวนประตูสองฝั่งโดยตรงด้วยการกระจายความน่าจะเป็นสำหรับเหตุการณ์นับจำนวน |
| เบย์esian | Bayesian Poisson (MCMC) | แนวคิดการนับแบบเดียวกัน แต่ให้ช่วงความไม่แน่นอนเต็มรอบค่าประมาณ คำนวณหนักกว่ามาก: ใช้เวลาฝึกสอนช้ากว่าประมาณ 100 เท่า |
| อนุกรมเวลา | SARIMAX | มองผลงานทีมเป็นลำดับตามเวลาและคาดการณ์ต่อไปข้างหน้า |
| แมชชีนเลิร์นนิง | Ridge, Random Forest, XGBoost | เรียนรู้แพทเทิร์นจากฟีเจอร์โดยไม่ผูกติดกับสมการตายตัว |
| ดีปเลิร์นนิง | LSTM, 1D CNN | โครงข่ายประสาทที่ค้นหาแพทเทิร์นเชิงลำดับและเชิงเฉพาะที่ในข้อมูล |
วิธีให้คะแนน
มีผู้สมัครสิบราย เลือกผู้ชนะด้วยสายตาย่อมไม่ได้ แต่ละโมเดลจึงผ่านสามสเตจ และให้โค้ดตัดสินว่าจะไปต่อหรือไม่ นี่คือความหมายของ code-based deployment: โมเดลถูกเลื่อนชั้นจากสภาพแวดล้อมหนึ่งไปอีกที่ด้วยการตรวจสอบอัตโนมัติแทนการจูนมือ ทำให้กระบวนการคัดเลือกทำซ้ำได้และตรวจสอบย้อนหลังง่าย
- ทดลอง ฝึกสอนแต่ละโมเดลด้วยแมตช์ทีมชาติก่อนฟุตบอลโลก 2022 เท่านั้น ไม่ใช่ทุกนัดมีน้ำหนักเท่ากัน: เกมใหม่กว่าและแมตช์เดิมพันสูงจะได้น้ำหนักมากกว่า (time-decay และน้ำหนักความสำคัญของแมตช์) เพื่อให้ผลแข่งขันจริงล่าสุดมีอิทธิพลต่อโมเดลมากกว่านัดกระชับมิตรเก่าๆ จากนั้นจูนพารามิเตอร์เพื่อลด Poisson negative log-likelihood (NLL) โดยใช้ cross-validation NLL คือคะแนนที่บอกว่าค่าอัตราประตูที่ทำนายเข้ากับจำนวนประตูจริงแค่ไหน ยิ่งต่ำยิ่งดี ผลลัพธ์คือเวอร์ชันที่จูนดีที่สุดของแต่ละโมเดล
- ประกันคุณภาพ นำโมเดลที่จูนแล้วไปทดสอบกับแมตช์ที่ไม่เคยเห็น: ฟุตบอลโลก 2022 บวกทัวร์นาเมนต์ใหญ่อีกหกรายการหลังจากนั้น (EURO, แอฟริกันเนชันส์คัพสองครั้ง, โกปาอเมริกา, เอเชียนคัพ และโกลด์คัพ) รวม 347 แมตช์ ที่นี่เมตริกเปลี่ยนเป็น ranked probability score (RPS) ซึ่งวัดคุณภาพการพยากรณ์แบบความน่าจะเป็นเมื่อผลลัพธ์มีลำดับธรรมชาติ เช่น แพ้ เสมอ ชนะ และให้รางวัลกับความมั่นใจที่ไปในทิศทางถูกคร่าวๆ ยิ่งต่ำยิ่งดี โมเดลที่แข็งแกร่งที่สุดที่นี่จะเป็น ผู้ท้าชิง RPS เหมาะเป็นไม้บรรทัดเพราะเป้าหมายจริงคือทำนายว่าแต่ละทีมจะไปได้ไกลแค่ไหน ไม่ใช่แค่ยอดรวมประตู
- ดีพลอย เปรียบเทียบผู้ท้าชิงกับแชมป์เก่า หากชนะจะถูกเลื่อนชั้นและฟิตใหม่บนทุกแมตช์ที่มี เพื่อเข้าทัวร์นาเมนต์โดยเรียนรู้จากข้อมูลทั้งหมด
ผู้ชนะคือใคร
แล้ววิธีไหนชนะ? นี่คือกระดานผู้นำบนชุดทดสอบ วัดด้วย RPS (ยิ่งต่ำยิ่งดี):
| โมเดล | RPS ชุดทดสอบ |
|---|---|
| XGBoost | 0.18289 |
| Bayesian Poisson | 0.18316 |
| Negative Binomial | 0.18373 |
| Bivariate Poisson | 0.18389 |
| Random Forest | 0.18392 |
| SARIMAX | 0.18583 |
| Ridge | 0.18813 |
| LSTM | 0.19299 |
| 1D CNN | 0.20916 |
| Mean-rate Poisson (เบสไลน์) | 0.22872 |
มีสี่ประเด็นที่โดดเด่นจากผลลัพธ์นี้:
- XGBoost ชนะ แต่แบบฉิวเฉียด ห้าอันดับแรก (XGBoost, Bayesian Poisson, Negative Binomial, Bivariate Poisson และ Random Forest) อยู่ในระยะราว 0.0011 RPS ต่อกัน เมื่อหลายวิธีที่ต่างกันมากทำผลงานใกล้กันขนาดนี้ มักหมายถึงเพดานถูกกำหนดโดยข้อมูลและฟีเจอร์ ไม่ใช่ตัวโมเดล ที่นี่ความต่าง Elo แบกรับงานส่วนใหญ่จนการเลือกโมเดลขยับเข็มน้อย
- ฟีเจอร์เดียวครองเกม ความต่าง Elo สำคัญที่สุดแบบทิ้งขาด มีอิทธิพลมากกว่าฟีเจอร์รองลงมาราวร้อยเท่า นั่นเป็นสัญญาณน่าอุ่นใจ: ในแมตช์เดียว ช่องว่างความแข็งแกร่งระหว่างสองทีมคือเนื้อหาหลักของเรื่องจริงๆ
- ดีปเลิร์นนิงรั้งท้าย (ยกเว้นเบสไลน์) ทั้ง 1D CNN และ LSTM อ่อนที่สุดรองจากเบสไลน์ง่ายๆ ด้วยข้อมูลให้เรียนรู้ราว 7,000 แมตช์ จำนวนน้อยเกินไปสำหรับเครือข่ายที่มีพารามิเตอร์มาก วิธีคลาสสิกจัดการกับชุดข้อมูลเล็กและมีโครงสร้างได้ดีกว่า
- ไม่มีสัญญาณโอเวอร์ฟิตในวิธีคลาสสิก ปกติแล้วโมเดลจะทำได้แย่ลงเล็กน้อยบนข้อมูลที่ไม่เคยเห็น เที่ยวนี้เกือบทุกโมเดล (ยกเว้น LSTM) กลับทำคะแนนบนทัวร์นาเมนต์ที่กันไว้ดีกว่าใน cross-validation เหตุผลที่เป็นไปได้คือฟุตบอลทัวร์นาเมนต์คาดเดาได้มากกว่าปฏิทินทีมชาติปกติ: เดิมพันสูง ทีมแข็งและคุ้นเคยกว่า สนามกลาง ช่วยลดความสุ่มบางส่วน
สำหรับทัวร์นาเมนต์สด ผมไม่รันทั้งสิบ จะเก็บรายชื่อเล็กลง: เบสไลน์แบบค่าเฉลี่ยเป็นจุดอ้างอิง บวกสามผู้ทำผลงานดีที่สุด XGBoost และ Bayesian Poisson ครองสองอันดับแรก
อันดับสามแทบเสมอกัน: Negative Binomial และ Bivariate Poisson ห่างกันเพียง 0.0002 RPS และสลับอันดับตาม seed แบบสุ่ม ระหว่างสองโมเดลที่แยกกันทางสถิติไม่ออก ผมเลือก Bivariate Poisson เพราะนิยามยืนบนฐานวรรณกรรมการทำนายฟุตบอลที่แข็งแรงกว่า (Karlis และ Ntzoufras, 2004)
รายชื่อสุดท้ายคือ XGBoost (แมชชีนเลิร์นนิง), Bivariate Poisson (สถิติเชิงคลาสสิก) และ Bayesian Poisson (อนุมานแบบเบย์) ส่วนถัดไปจะอธิบายว่าโมเดลเหล่านี้รัน ฝึกสอนใหม่ และแปลงการทำนายแมตช์เดี่ยวเป็นพยากรณ์ทั้งทัวร์นาเมนต์อย่างไร
นำไปใช้จริง
โมเดลที่อยู่ในโน้ตบุ๊กมีประโยชน์แค่ตอนนั่งอยู่หน้ามัน เพื่อทำนายแมตช์ยาวตลอดเดือน ทั้งระบบต้องรันเอง: ดึงผลสด ฝึกสอนใหม่ จำลองใหม่ และรีเฟรชพยากรณ์โดยไม่ต้องให้ใครไปกดปุ่ม นั่นคือหน้าที่ของท่อส่งงาน
ท่อส่งงานทุกสองชั่วโมงบน GCP
โปรเจกต์ทั้งหมดรันเป็นงานตามกำหนดการเพียงงานเดียวบน Google Cloud Run ก่อนทัวร์นาเมนต์จะปลุกวันละครั้ง ตั้งแต่นัดเปิดวันที่ 11 มิถุนายน จะรันทุกสองชั่วโมง ทุกครั้งทำตามวัฏจักรเดียวกัน:
- เช็คข้อมูลใหม่ หากไม่มีแมตช์จบตั้งแต่ครั้งก่อน ก็ไม่มีอะไรต้องทำ งานจะออกทันที
- รับเข้าและสร้างใหม่ เมื่อมีผลใหม่ จะดึงจากแหล่งข้อมูล และ
dvc reproครั้งเดียวจะสร้างชั้น Silver และ Gold ใหม่ให้ฟีเจอร์เป็นปัจจุบัน - ฝึกใหม่ ทำนาย จำลอง อัปเดตรายชื่อโมเดล (รายละเอียดต่อไป) ทำนายทุกคู่ที่กำลังจะถึง และจำลองทั้งทัวร์นาเมนต์
- ให้คะแนน เมื่อแมตช์ตัดสินแล้ว จะให้คะแนนการทำนายที่ทำไว้ เพื่อนำไปสู่การมอนิเตอร์ด้านล่าง
เพราะทุกขั้นถูกทริกเกอร์ด้วยโค้ดตามตาราง จึงไม่ต้องกดปุ่มมือระหว่างทัวร์นาเมนต์ ผลใหม่เข้า พยากรณ์ใหม่ออก
สองโหมด: คงที่ vs. ต่อรอบ
ตรงนี้โปรเจกต์ทำหน้าที่เป็นการทดลองไปด้วย ระหว่างทัวร์นาเมนต์ รายชื่อโมเดลจะรันสองโหมดคู่ขนาน และความต่างระหว่างสองโหมดคือคำถามที่หวังให้ข้อมูลช่วยตอบ: การฝึกสอนใหม่ระหว่างรายการช่วยให้แม่นขึ้นหรือไม่?
- คงที่ ล็อกโมเดลตั้งแต่นกหวีดเปิดทัวร์นาเมนต์และไม่ฝึกใหม่อีก พวกมันยังตอบสนองต่อผลการแข่งขันเพราะการจำลองแต่ละครั้งเริ่มจากผังล่าสุด แต่พารามิเตอร์ของโมเดลไม่เปลี่ยน
- ต่อรอบ คงค่าไฮเปอร์พารามิเตอร์ไว้ แต่พารามิเตอร์ที่โมเดลเรียนรู้จะฟิตใหม่บนข้อมูลทั้งหมดหลังจบทุกนัดของแต่ละแมตช์เดย์รอบแบ่งกลุ่มและหลังจบรอบน็อกเอาต์ทุกรอบ ทำให้โมเดลเรียนรู้จากทัวร์นาเมนต์ขณะเกิดขึ้น
การรันคู่กันช่วยให้เทียบได้สองมุมหลังจบ: ความแม่นยำ และความเร็วที่ความไม่แน่นอนลดลงเมื่อสนามแคบลง หากโหมดต่อรอบชนะ การฝึกใหม่เป็นประจำก็คุ้ม หากโหมดคงที่ไหว เครื่องไม้เครื่องมือเพิ่มเติมอาจไม่จำเป็น
จากการทำนายสู่ทั้งทัวร์นาเมนต์: มอนติคาร์โล
การทำนายแมตช์เดียวเป็นอย่างหนึ่ง การแปลงให้เป็น "โอกาสคว้าแชมป์ของแต่ละทีม" คือจุดที่การจำลองมอนติคาร์โลเข้ามา
เริ่มจากการอนุมาน แทนที่จะทำนายเฉพาะโปรแกรมที่รู้แล้ว โมเดลจะทำนายทุกคู่ที่เป็นไปได้ของ 48 ทีม ฟังดูเกินจำเป็น แต่ในทัวร์นาเมนต์ ทีมใดก็อาจเจอทีมใดในรอบน็อกเอาต์ได้ จึงต้องพร้อมสำหรับทุกคู่
ต่อไปต้องเข้ารหัสกติกา ซึ่งฟอร์แมตปี 2026 ทำให้ยุ่งเป็นพิเศษ ใน 12 กลุ่ม สองทีมแรกเข้ารอบอัตโนมัติ และอันดับสามที่ดีที่สุด 8 ทีมก็เข้ารอบด้วย ตำแหน่งในรอบ 32 ทีมของทั้งแปดนั้นขึ้นกับว่ามาจากกลุ่มใด
มี 495 วิธีในการเลือกแปดกลุ่มจากสิบสองกลุ่ม (สิบสองเลือกแปด) และแต่ละแบบให้ผังกรอบ 32 ทีมต่างกัน ไม่มีสูตรสะอาดๆ FIFA แค่เผยแพร่ตาราง ดังนั้นผม (หรือพูดให้ถูกคือเพื่อนร่วมงานผู้เชี่ยวชาญ Cursor) จึงฮาร์ดโค้ดทั้ง 495 กรณีลงในแมปปิง โดยใช้ตารางทางการเป็นแหล่งอ้างอิง
"best_third_mappings": {
"EFGHIJKL": {
"74": "3F",
"77": "3G",
"79": "3E",
"80": "3K",
"81": "3I",
"82": "3H",
"85": "3J",
"87": "3L"
},
"DFGHIJKL": ...
แต่ละคีย์อย่าง EFGHIJKL ระบุว่ากลุ่มใดแปดกลุ่มที่ส่งทีมอันดับสามเข้ารอบ และค่าในนั้นจะจับคู่แต่ละทีม (3E, 3F เป็นต้น) เข้ากับหมายเลขแมตช์ในรอบ 32 ทีม นี่เป็นเพียงตัวอย่างเดียว แมปปิงเต็มทำซ้ำแบบนี้ 495 ครั้ง ตามทุกชุดความเป็นไปได้
สามเจ้าภาพ (สหรัฐฯ แคนาดา และเม็กซิโก) ต้องจัดการพิเศษหนึ่งอย่าง เมื่อเจ้าภาพลงสนามในประเทศของตน การจำลองจะใช้ตัวปรับแต่งความได้เปรียบเจ้าบ้านสำหรับแมตช์นั้น ส่วนที่เหลือถือเป็นสนามกลาง
เมื่อการทำนายและกติกาพร้อม การจำลองจะรันทัวร์นาเมนต์ทั้งหมด 10,000 ครั้ง ในแต่ละครั้งจะทำขั้นตอนดังนี้:
- สุ่มสกอร์ไลน์ของทุกแมตช์โดยดึงจำนวนประตูเหย้า-เยือนจากการกระจายที่โมเดลทำนาย
- เล่นรอบแบ่งกลุ่มตามกติกาคะแนนและตัวตัดสินจริง
- ตัดสินตารางอันดับสามที่ดีที่สุด
- เติมผังน็อกเอาต์จากแมปปิงข้างต้น
- เล่นจนได้แชมป์เพียงหนึ่งทีม
ตลอด 10,000 ทัวร์นาเมนต์จำลอง สัดส่วนครั้งที่ทีมหนึ่งๆ เข้าชิงหรือคว้าแชมป์จะกลายเป็นความน่าจะเป็นของทีมนั้น การจำลองครั้งเดียวคือการเดา สิบพันครั้งคือพยากรณ์
ติดตามทั้งหมดด้วย MLflow
ทุกการรันทั้งสองโหมด ถูกบันทึกไว้ใน MLflow (โฮสต์บน DagsHub) การติดตามการทดลองหมายถึงการบันทึกอินพุต การตั้งค่า ผลลัพธ์ และเอาต์พุตของแต่ละรันอย่างเป็นระบบ เพื่อให้เปรียบเทียบกันได้หรือทำซ้ำได้เป๊ะ จุดที่น่าสังเกตบางอย่างได้แก่:
- การทำซ้ำได้ การจำลองใช้ seed สุ่มคงที่ที่ได้จากรอบของทัวร์นาเมนต์ และใช้ seed เดียวกันทั้งโหมดคงที่และต่อรอบ หมายความว่าความต่างระหว่างสองโหมดเกิดจากตัวโมเดลเอง ไม่ใช่โชคในการสุ่มสกอร์ แต่ละรันยังล็อกสแนปช็อตข้อมูลที่เห็น (จำนวนแถว Gold และเวลา) เพื่อให้ย้อนตามอินพุตได้เสมอ
- การทดลอง แต่ละรันติดแท็กโหมด (คงที่หรือ ต่อรอบ) และสถานะในวงจรชีวิต ตั้งแต่ทดลองและ QA ไปจนถึงการอนุมานสดและการฟิตใหม่ สะท้อนขั้นตอนเลื่อนชั้นจากส่วนก่อนหน้า
- การเปรียบเทียบ บันทึก RPS บนชุดทดสอบเป็นเมตริกคัดเลือก พร้อมอ้างอิงรันแชมป์ปัจจุบันเพื่อดูสายสัมพันธ์ บันทึกเวลาฟิตด้วย ซึ่งเป็นจุดที่เห็นชัดว่าโมเดลแบบเบย์ช้ากว่าราว 100 เท่า
โมเดลที่ฝึกแล้วและไฟล์การทำนาย (ความน่าจะเป็นของทัวร์นาเมนต์ ตารางคะแนนกลุ่ม และพยากรณ์แมตช์) ถูกเก็บเป็นอาร์ติแฟกต์ของรัน และไฟล์เหล่านี้เองที่แดชบอร์ดสดอ่าน ปิดลูปตั้งแต่ผลดิบ ผ่านการฝึกและการจำลอง ไปจนถึงตัวเลขที่เห็นออนไลน์
มอนิเตอร์การดริฟต์
ชิ้นส่วนสุดท้ายรันเมื่อแมตช์ตัดสิน เมื่อผลจริงเข้ามา จะให้คะแนนการทำนายที่ทำไว้และเปรียบเทียบกับเบสไลน์แบบค่าเฉลี่ย หากโมเดลเต็มเริ่มแพ้ให้กับโมเดลที่ไม่รู้อะไรเกี่ยวกับทีม นั่นคือสัญญาณเตือนการดริฟต์: แพทเทิร์นที่เรียนรู้ก่อนทัวร์นาเมนต์อาจไม่ตรงกับสิ่งที่เกิดขึ้นในสนามอีกต่อไป
การเฝ้าดูสิ่งนี้เป็นมาตรฐานสำหรับระบบพยากรณ์สดใดๆ และอ่านเพิ่มเติมได้จากคู่มือเรื่อง data drift และ model drift
แล้วใครจะได้แชมป์โลก?
หลังจากเครื่องไม้เครื่องมือทั้งหมด นี่คือสิ่งที่สร้างมาเพื่อมัน
ตัวเต็ง
ณ วันที่ 10 มิถุนายน 2026 วันก่อนเปิดสนาม คำตัดสินของโมเดลชัดเจนที่หัวตารางและแน่นขนัดถัดลงมา สเปนและอาร์เจนตินานำหน้าด้วยโอกาสชูถ้วยราว 16% เท่ากัน ที่แชมป์โลก (อาร์เจนตินา) และแชมป์ยุโรป (สเปน) ออกมานำ ถือเป็นเช็คความสมเหตุสมผลที่ดีว่าโมเดลยืนบนความจริง
ด้านหลังมีขบวนไล่ล่าที่สูสีกัน ฝรั่งเศส อังกฤษ บราซิล และโคลอมเบียคือผู้ท้าชิงแชมป์ที่น่าจะเป็นไปได้มากที่สุด ตัวเลขเหล่านี้เป็นแบบสดและจะขยับทันทีที่ผลจริงเริ่มมา จึงควรมองเป็นภาพวันที่ 10 มิถุนายน ไม่ใช่คำทำนายตายตัว แดชบอร์ดจะแสดงตัวเลขล่าสุดเสมอด้วยดีเลย์สูงสุดสองชั่วโมง
แดชบอร์ดสด
พูดถึงตรงนี้: ทุกตัวเลขในบทความนี้มาจากแอป Streamlit สดที่อัปเดตอัตโนมัติเมื่อท่อส่งงานรัน เปิดได้ที่ wc2026-predictions.streamlit.app เพื่อติดตามทัวร์นาเมนต์ มีสี่มุมมองหลัก:
- ภาพรวมทัวร์นาเมนต์: แต่ละทีมคาดว่าจะไปได้ไกลแค่ไหน แบบมองภาพรวม
- ตารางกลุ่ม: สำหรับทุกกลุ่ม ความน่าจะเป็นที่แต่ละทีมจบอันดับหนึ่ง สอง สาม (แยกเป็นที่สามแต่เข้ารอบกับที่สามแต่อกหัก ตามกฎอันดับสามที่ดีที่สุด) หรือสี่
- พยากรณ์แมตช์: สำหรับเกมรอบแบ่งกลุ่ม โอกาสชนะเหย้า เสมอ หรือชนะเยือน พร้อมผังน็อกเอาต์ที่เป็นไปได้มากที่สุด
- คู่ประกบที่พบบ่อยในน็อกเอาต์: การจับคู่ที่การจำลองสร้างขึ้นบ่อยที่สุด
ข้อสังเกตหนึ่งในมุมมองแมตช์: บางทีมอาจปรากฏในสองช่องรอบ 32 ทีมพร้อมกัน นั่นไม่ใช่บั๊ก เกิดเมื่อกลุ่มสูสีมากจนโมเดลบอกตำแหน่งเข้ารอบของทีมได้ไม่มั่นใจ พอรวมกับความไม่แน่นอนของอันดับสามที่ดีที่สุด ผลสองแบบนำไปสู่ช่องน็อกเอาต์ต่างกัน ในกรณีของตุรกี ถึงขั้นทำให้พวกเขาอยู่ในรอบ 16 ทีมสองครั้ง
กราฟิกต่อไปนี้แสดงรอบสุดท้าย (ตั้งแต่รอบก่อนรองชนะเลิศจนถึงนัดชิง) ที่โมเดล XGBoost คาดการณ์ก่อนเปิดทัวร์นาเมนต์:

ทีมเหรียญโยน: สหรัฐอเมริกา
ความสนุกของโมเดลแบบนี้อยู่ที่ทีมที่สวนทางสายตา และตัวอย่างชัดที่สุดคือสหรัฐอเมริกา หากเปิดดูภาพรวมทัวร์นาเมนต์บนแดชบอร์ด จะเห็นชัดว่าสหรัฐฯ โดดเด่นด้วยสี
ในฐานะเจ้าภาพร่วม เล่นต่อหน้าแฟนบอลในบ้าน อาจคาดว่าออกสตาร์ตสบาย แต่โมเดลระมัดระวังกว่ามาก: ให้โอกาสผ่านรอบแบ่งกลุ่มเพียงราว 54.6% ซึ่งต่ำเป็นอันดับ 13 ของทั้งสนาม (จำไว้ว่าสองในสามของทีมจะเข้ารอบ!) เพราะกลุ่มที่มีออสเตรเลีย ปารากวัย และตุรกี สูสีกันผิดปกติ
ที่น่าสนใจคือหลังจากนั้น เมื่อลอดรอดมาได้ สหรัฐฯ จะอยู่ที่ระดับเหรียญโยนแทบทุกรอบที่ตามมา เมื่อนำโอกาสเหรียญโยนต่อเนื่องมาคูณกัน จะได้โอกาสคว้าแชมป์รวมราว 2% ซึ่งสูงเป็นอันดับ 13 จาก 48 ทีม
ทีมที่อยู่อันดับ 13 จากท้ายในการเข้ารอบแบ่งกลุ่ม และอันดับ 13 จากหัวในการคว้าแชมป์ น่าจะเป็นคำจำกัดความที่ลงตัวของ “ทีมเหรียญโยน”: ไม่เคยเป็นตัวเต็ง แต่อย่าเพิ่งนับว่าหมดลุ้น
ข้อคิดส่งท้าย
โปรเจกต์นี้ใช้แรงไม่น้อย และครอบคลุมมากกว่าที่บทความเดียวจะใส่ได้ repo มีอีกมากที่ไม่ทันเล่า: ชุดผู้สมัครโมเดลเต็ม เทคนิคฟีเจอร์ และการจัดการที่ทำให้ทุกอย่างรันได้ต่อเนื่อง เป็นต้น
ตอนนี้โมเดลเลือกฝั่งแล้ว และสนามหญ้าจะเป็นผู้พิพากษา ไม่ว่ามาเพราะ MLOps หรือฟุตบอล หวังว่าจะสนุกไปกับการลุ้นเช่นเดียวกับผม ติดตาม พยากรณ์สด เมื่อผลการแข่งขันหลั่งไหลเข้ามา และดูว่าการทำนายจะยืนระยะได้แค่ไหน
หากอยากเจาะลึกแนวคิดที่กล่าวถึง แนะนำคอร์ส MLOps Concepts ของเรา
คำถามที่พบบ่อย: ทำนายแชมป์ FIFA World Cup 2026
ใครจะได้แชมป์ FIFA World Cup 2026?
ณ วันที่ 10 มิถุนายน 2026 ก่อนทัวร์นาเมนต์เริ่ม โมเดลยกให้สเปนและอาร์เจนตินาเป็นตัวเต็งร่วม ทีมละราว 16% ตามด้วยฝรั่งเศส อังกฤษ บราซิล และโคลอมเบีย ไม่มีทีมไหนเป็นเต็งจ๋า สะท้อนว่าทัวร์นาเมนต์เปิดกว้าง ตัวเลขเหล่านี้เป็นแบบสดซึ่งขยับตามผลจริง แดชบอร์ดจะแสดงตัวเลขปัจจุบันเสมอ
โมเดลแมชชีนเลิร์นนิงจะทำนายฟุตบอลได้แม่นแค่ไหน?
ฟุตบอลทีมชาติทำนายได้ยาก: ทำประตูน้อยและแข่งจริงน้อยนัด จึงถึงแม้โมเดลจะแข็งแกร่งก็ยังมีเรื่องของดวงอยู่มาก ในโปรเจกต์นี้ โมเดลห้าอันดับแรกทำคะแนนต่างกันราว 0.001 RPS ซึ่งชี้ว่าขีดจำกัดความแม่นอยู่ที่ข้อมูลและฟีเจอร์มากกว่าอัลกอริทึม ตัวขับเคลื่อนที่ใหญ่ที่สุดคือช่องว่างคะแนน Elo ระหว่างสองทีม
ทำไมต้องทำนายจำนวนประตูแทนผลการแข่งขัน?
การทำนายจำนวนประตูของแต่ละทีมแทนการชนะ เสมอ หรือแพ้โดยตรง จะให้การกระจายความน่าจะเป็นเต็มรูปของสกอร์ไลน์ นั่นทำให้สามารถจำลองทั้งทัวร์นาเมนต์ได้: เมื่อสุ่มสกอร์ไลน์ที่สมเหตุสมผลได้ ก็เล่นรอบแบ่งกลุ่มและผังน็อกเอาต์เป็นพันๆ ครั้งและอ่านโอกาสเข้ารอบหรือคว้าแชมป์ของแต่ละทีมได้
จำนวนประตูยังสอดคล้องกับการกระจายแบบปัวซองค่อนข้างดี ซึ่งเหมาะกับสไตล์โมเดลนี้
มอนติคาร์โลคืออะไร และทำไมต้องรัน 10,000 ครั้ง?
การจำลองมอนติคาร์โลคือการเล่นกระบวนการสุ่มซ้ำๆ เพื่อประมาณความน่าจะเป็นที่คำนวณตรงๆ ได้ยาก ที่นี่แต่ละรันจะสุ่มสกอร์ของทุกแมตช์จากการทำนายของโมเดลและเล่นทัวร์นาเมนต์จนได้ผู้ชนะ ทำแบบนี้ 10,000 ครั้งจะเปลี่ยนการทำนายแมตช์เดี่ยวให้เป็นเปอร์เซ็นต์ที่นิ่ง เช่น "สเปนชนะราว 16% ของครั้งทั้งหมด" การจำลองครั้งเดียวเป็นเพียงหนึ่งผลลัพธ์ที่อาจเกิดขึ้น แต่หมื่นครั้งจะเข้าใกล้การกระจายจริงของความเป็นไปได้
ต้องใช้เครื่องมืออะไรบ้างในการสร้างท่อส่งงาน MLOps แบบนี้?
องค์ประกอบหลักคือการจัดเวอร์ชันข้อมูล (โปรเจกต์นี้ใช้ DVC) การติดตามการทดลอง (MLflow) วิธีรันงานตามเวลา (Google Cloud Run พร้อม Cloud Scheduler) และช่องทางให้บริการผลลัพธ์ (แดชบอร์ด Streamlit)
ตัวโมเดลใช้ไลบรารี Python ผสมกัน: scikit-learn (Ridge และ random forest), XGBoost (แชมป์), statsmodels และ SciPy (Poisson, bivariate Poisson, negative binomial รวมถึง SARIMAX), PyMC (โมเดลแบบเบย์) และ Keras (LSTM และ CNN) โดยมี pandas และ NumPy จัดการข้อมูล
สิ่งเหล่านี้ไม่จำเป็นสำหรับโมเดลครั้งเดียว แต่เมื่อรวมกันจะทำให้ท่อส่งงานทำซ้ำได้และฝึกสอน-รีเฟรชตัวเองได้โดยไม่ต้องทำมือ