Courses
Dự đoán bóng đá rất khó. Đây là môn thể thao ít bàn thắng, nơi một cú sút đổi hướng có thể xoay chuyển kết quả, và một phần không nhỏ của mỗi trận phụ thuộc vào may rủi. Bóng đá quốc tế còn khó hơn: các đội tuyển quốc gia chỉ đá vài trận đấu chính thức mỗi năm, nên dữ liệu để học ít hơn nhiều so với các giải CLB.
Và như thế vẫn chưa đủ, FIFA tiếp tục khiến bài toán khó hơn ở World Cup năm nay. World Cup mở rộng 48 đội giới thiệu thể thức mới: hai đội đầu mỗi trong mười hai bảng đi tiếp, cùng với tám trong mười hai đội xếp thứ ba có thành tích tốt nhất, khiến cục diện vòng bảng khó lường. Vì tôi thích những thử thách hay (và bóng đá), đó chính là điều tôi muốn dự đoán.
Bài viết này nối tiếp dự án dự đoán EURO 2024 của tôi, gần như được dựng lại từ đầu. Lần trước tôi làm hoàn toàn trong Jupyter notebook và dự đoán một tỉ số khả dĩ nhất cho mỗi trận. Lần này, tôi xây một pipeline MLOps đầu-cuối có khả năng nạp kết quả mới, tự huấn luyện lại, và chạy mô phỏng Monte Carlo cho toàn bộ giải 10.000 lần, biến dự đoán cấp trận đấu thành các xác suất đội đi xa đến đâu.
Trong bài này, tôi sẽ dẫn bạn đi qua dự án ở mức khái quát: dữ liệu và đặc trưng, các thực hành MLOps giúp tái lập được kết quả, kiến trúc pipeline, và mô hình nào dự đoán bóng đá đội tuyển quốc gia tốt nhất. Bạn có thể tìm toàn bộ mã nguồn trong repo dự án. Và dĩ nhiên, tôi sẽ nói xem mô hình dự đoán ai vô địch. (Tiết lộ: nó đánh giá cao Tây Ban Nha và Argentina khoảng 16% mỗi đội, nhưng phần thú vị là cách nó đi đến kết luận đó.)
Nếu đọc đến đây khiến bạn háo hức với giải đấu, tôi khuyên xem lại các phiên của Data & AI World Cup của chúng tôi, hoặc tham gia cuộc thi Dự đoán FIFA World Cup 2026. Người thắng không chỉ nhận áo đấu World Cup chính hãng mà còn có 3 tháng thuê bao Claude Enterprise. Cập nhật liên tục trên bảng xếp hạng trực tiếp.
Dự đoán FIFA World Cup 2026
Tóm lược
- Đây là một pipeline MLOps đầu-cuối dự đoán FIFA World Cup 2026, lấy kết quả quốc tế mới và tự động huấn luyện lại trên Google Cloud, cứ hai giờ một lần trong thời gian diễn ra giải.
- Dữ liệu từ API-Football và điểm Elo được xử lý qua kiến trúc huân chương Bronze-Silver-Gold và quản lý phiên bản bằng DVC để bảo đảm tái lập hoàn toàn.
- Mười mô hình thuộc năm họ được so sánh trên tập giữ lại 347 trận; XGBoost thắng sít sao, năm mô hình đầu gần như không tách biệt, và chênh lệch Elo giữa các đội đảm nhiệm phần lớn công việc dự đoán.
- Một mô phỏng Monte Carlo chơi toàn bộ giải 10.000 lần, biến dự đoán số bàn ở cấp trận đấu thành xác suất đi tiếp và vô địch của mỗi đội.
- Tính đến ngày 10/6/2026, các ứng viên hàng đầu của mô hình là Tây Ban Nha và Argentina, khoảng 16% mỗi đội. Có thể theo dõi dự đoán trực tiếp trên bảng điều khiển Streamlit được làm mới hai giờ một lần.
Dữ liệu đứng sau các dự đoán
Một dự đoán chỉ tốt tương xứng với dữ liệu đầu vào, nên đáng để bắt đầu từ nguyên liệu thô. Mô hình học từ hai nguồn dữ liệu trực tiếp và biến chúng thành một bảng đặc trưng gọn gàng, nhất quán.
Dữ liệu đến từ đâu
Mọi thứ được xây dựng từ hai nơi. API-Football cung cấp lịch thi đấu và thống kê theo trận: ai gặp ai, khi nào, ở đâu, và kết quả ra sao. eloratings.net cung cấp điểm Elo cho mọi đội tuyển quốc gia.
Điểm Elo là một con số đơn lẻ phản ánh sức mạnh của một đội. Mỗi đội nằm đâu đó trên thang điểm, và sau mỗi trận, điểm số được cập nhật: thắng đội mạnh hơn, bạn được cộng nhiều; thua đội yếu hơn, bạn bị trừ mạnh. Ý tưởng đến từ cờ vua và thích nghi rất gọn với bóng đá. Nếu muốn直 quan đầy đủ, bài viết DataCamp trước này diễn giải trong bối cảnh World Cup 2022.
Kết hợp lại, hai nguồn tạo thành bộ dữ liệu Gold khoảng 6.900 trận quốc tế từ năm 2018 để học.
Mô hình dự đoán gì
Đây là lựa chọn thiết kế quan trọng đầu tiên. Thay vì dự đoán trực tiếp kết quả thắng, hòa, thua, mô hình dự đoán chi tiết hơn: số bàn mỗi đội ghi trong một trận. Số bàn trong bóng đá, xấp xỉ tốt, tuân theo phân phối Poisson, cách chuẩn để mô hình hóa tần suất một sự kiện tương đối hiếm xảy ra trong một khoảng thời gian cố định.
Dự đoán số bàn thay vì kết quả là điều khiến mọi thứ về sau khả thi. Khi mô hình có thể tạo ra một tỉ số hợp lý cho bất kỳ cặp đấu nào, những câu hỏi mà mọi người thực sự quan tâm—ai vượt qua vòng bảng và ai nâng cúp—có thể được trả lời bằng cách mô phỏng các tỉ số đó hàng nghìn lần.
Các đặc trưng quan trọng
Mỗi trận được mô tả bởi một bộ đặc trưng nhỏ nhưng chọn lọc kỹ:
- Chênh lệch Elo: khoảng cách điểm giữa hai đội. Đây là đặc trưng quan trọng nhất, vượt trội hẳn, với mức độ quan trọng cao hơn khoảng hai bậc độ lớn so với đặc trưng mạnh kế tiếp. Điều này hợp trực giác, vì khoảng cách thực lực giữa hai bên cho bạn biết nhiều về kết quả hơn hầu hết yếu tố khác.
- Tổng Elo: tổng điểm của hai đội, đại diện cho chất lượng tổng thể của cặp đấu. Chỉ chênh lệch thôi không phân biệt được Argentina gặp Tây Ban Nha với San Marino gặp Andorra—hai trận cân bằng nhưng ở đẳng cấp hoàn toàn khác—và tổng điểm khôi phục thông tin đó.
- Biến động Elo lăn (5 trận gần nhất): điểm số của mỗi đội thay đổi gần đây thế nào. Điều này bắt được phong độ đồng thời đã tính đến sức mạnh đối thủ đã gặp.
- Bàn thắng/bàn thua lăn (5 trận gần nhất): đầu ra tấn công và phòng ngự gần đây theo giá trị tuyệt đối, tính cho từng đội.
- Bối cảnh trận đấu: hạng giải (trận World Cup khác biệt so với vòng loại hay Nations League), liệu là trận loại trực tiếp, và có đá sân trung lập hay không.
Mọi đặc trưng đều tuyệt đối an toàn với rò rỉ dữ liệu, nghĩa là chỉ dùng thông tin có trước giờ bóng lăn. Nghe có vẻ hiển nhiên, nhưng đây là một trong những cách dễ nhất để vô tình xây một mô hình trông xuất sắc khi thử nghiệm nhưng sụp đổ ngoài thực tế.
Một ý tưởng bị loại: tôi định xây bộ đặc trưng "phong cách chơi" bằng cách gom cụm đội dựa trên thống kê trong trận, một bước học không giám sát. Thực tế, các đội không tách thành nhóm có ý nghĩa, nên thay vì đưa nhiễu vào mô hình, tôi loại bỏ. Kết quả âm vẫn là kết quả.
Giữ dữ liệu có thể tái lập
Với dữ liệu đến từ hai nguồn theo cuộn thời gian, con đường từ tệp thô đến đặc trưng sẵn sàng cho mô hình phải giống hệt nhau mỗi lần. Đó là điều kiến trúc huân chương mang lại. Nó tổ chức dữ liệu thành ba lớp:
- Bronze: dữ liệu thô, y nguyên như khi nhận, không đụng chạm.
- Silver: được làm sạch và chuẩn hóa. Ở đây tôi ánh xạ tên đội giữa hai nguồn (chúng hiếm khi thống nhất cách viết), xác thực schema, nối điểm Elo vào bản ghi trận đấu, và xử lý mọi thứ thiếu hoặc lỗi định dạng.
- Gold: lớp cho mô hình, một hàng gọn cho mỗi trận với mọi đặc trưng đã tính sẵn, sẵn sàng huấn luyện.
Mỗi lớp cấp dữ liệu cho lớp sau, nên khi có gì đó trục trặc, tôi có thể lần ngược từng bước thay vì gỡ cả mớ cùng lúc. Để toàn bộ đường đi có thể tái lập, tôi dùng DVC (Data Version Control). Mỗi khi có kết quả mới, một lệnh dvc repro sẽ dựng lại Silver và Gold từ Bronze, chỉ chạy lại bước có đầu vào thay đổi, và quản lý phiên bản các bộ dữ liệu kết quả để bất kỳ trạng thái trước đó đều có thể khôi phục y nguyên.
Chọn mô hình tốt nhất
Dự đoán số bàn là một bài toán đã được nghiên cứu kỹ, và không có công cụ duy nhất rõ ràng. Vì vậy thay vì chốt một cách tiếp cận từ đầu, tôi xây mười mô hình và để chúng cạnh tranh.
Ứng viên
Mười mô hình trải rộng trên năm họ cộng một đường cơ sở đơn giản. Bạn không cần biết nội tại từng mô hình; điểm mấu chốt là chúng đưa ra những giả định rất khác nhau về cách bàn thắng xuất hiện.
| Họ | Mô hình | Ý tưởng cốt lõi |
|---|---|---|
| Đường cơ sở | Poisson tốc độ trung bình | Giả định mỗi đội chỉ ghi một mức trung bình dài hạn, bỏ qua mọi đặc trưng. Nền tảng để các mô hình khác vượt qua. |
| Thống kê | Poisson song biến, Nhị thức âm | Mô hình hóa trực tiếp hai số bàn bằng các phân phối xác suất thiết kế cho đếm sự kiện. |
| Bayes | Poisson Bayes (MCMC) | Cùng ý tưởng đếm, nhưng trả về toàn bộ khoảng bất định quanh mỗi ước lượng. Nặng tính toán hơn nhiều: huấn luyện chậm hơn khoảng 100 lần so với phần còn lại. |
| Chuỗi thời gian | SARIMAX | Xem kết quả của một đội như dãy theo thời gian và ngoại suy dãy đó. |
| Machine learning | Ridge, Random Forest, XGBoost | Học mẫu trực tiếp từ đặc trưng mà không ràng buộc vào một phương trình cố định. |
| Deep learning | LSTM, CNN 1D | Mạng nơ-ron săn tìm các mẫu tuần tự và cục bộ trong dữ liệu. |
Cách chấm điểm
Với mười ứng viên, chọn bằng mắt là bất khả thi. Thay vào đó, mỗi mô hình đi qua ba giai đoạn, và mã quyết định có được đi tiếp hay không. Đây là triển khai dựa trên mã: mô hình được thăng cấp từ môi trường này sang môi trường khác bằng kiểm tra tự động thay vì chỉnh tay, giúp toàn bộ quy trình chọn lọc có thể tái lập và dễ kiểm toán.
- Thử nghiệm. Mỗi mô hình chỉ được huấn luyện trên các trận quốc tế diễn ra trước World Cup 2022. Không phải trận nào cũng có trọng số như nhau: các trận mới hơn và có tính chất quan trọng hơn được cho trọng số lớn hơn (giảm dần theo thời gian và trọng số theo tầm quan trọng), nên một kết quả chính thức gần đây ảnh hưởng đến mô hình nhiều hơn một trận giao hữu cũ. Sau đó tham số của mỗi mô hình được tinh chỉnh để tối thiểu hóa negative log-likelihood (NLL) Poisson bằng cross-validation. NLL đơn giản là thước đo mức độ khớp giữa tốc độ bàn thắng dự đoán và số bàn thực tế đội ghi, càng thấp càng tốt. Kết quả là phiên bản tinh chỉnh tốt nhất của mỗi mô hình.
- Đảm bảo chất lượng. Các mô hình đã tinh chỉnh được kiểm tra trên dữ liệu chưa hề thấy: World Cup 2022 cộng sáu giải lớn sau đó (EURO, hai CAN, Copa América, Asian Cup, và Gold Cup), tổng cộng 347 trận. Ở đây, metric chuyển sang ranked probability score (RPS), đo độ tốt của dự báo xác suất khi kết quả có thứ tự tự nhiên như thua, hòa, thắng, và thưởng cho việc tự tin theo đúng hướng tương đối. Lại càng thấp càng tốt. Mô hình mạnh nhất ở đây trở thành kẻ thách thức. RPS là thước đo đúng đắn vì mục tiêu thực là dự đoán đội đi xa đến đâu, không chỉ tổng số bàn.
- Triển khai. Kẻ thách thức được so với đương kim vô địch. Nếu thắng, nó được thăng cấp và huấn luyện lại trên toàn bộ dữ liệu sẵn có, để bước vào giải với tất cả dữ liệu đã học.
Kẻ chiến thắng
Vậy cách tiếp cận nào dẫn đầu? Đây là bảng xếp hạng đầy đủ trên tập giữ lại, chấm bằng RPS (càng thấp càng tốt):
| Mô hình | RPS giữ lại |
|---|---|
| XGBoost | 0.18289 |
| Poisson Bayes | 0.18316 |
| Nhị thức âm | 0.18373 |
| Poisson song biến | 0.18389 |
| Random Forest | 0.18392 |
| SARIMAX | 0.18583 |
| Ridge | 0.18813 |
| LSTM | 0.19299 |
| CNN 1D | 0.20916 |
| Poisson tốc độ trung bình (đường cơ sở) | 0.22872 |
Bốn điều nổi bật từ kết quả này:
- XGBoost thắng, nhưng chỉ nhỉnh hơn chút. Năm mô hình dẫn đầu (XGBoost, Poisson Bayes, Nhị thức âm, Poisson song biến, và Random Forest) chỉ cách nhau khoảng 0,0011 RPS. Khi năm cách tiếp cận rất khác nhau lại sát nhau như vậy, thường có nghĩa trần hiệu năng do dữ liệu và đặc trưng quyết định, không phải do mô hình. Ở đây, chênh lệch Elo gánh phần lớn công việc đến mức lựa chọn mô hình hầu như không tạo khác biệt lớn.
- Một đặc trưng áp đảo. Chênh lệch Elo là biến dự báo quan trọng nhất với khoảng cách lớn, ảnh hưởng gấp khoảng trăm lần đặc trưng kế tiếp. Điều này củng cố hơn là gây bất ngờ: trong một trận đơn lẻ, khoảng cách thực lực giữa hai đội thực sự là phần lớn câu chuyện.
- Deep learning xếp cuối, trừ đường cơ sở. CNN 1D và LSTM là những mô hình yếu nhất ngoài baseline ngây thơ. Với chỉ khoảng 7.000 trận để học, đơn giản là không đủ dữ liệu để nuôi các mạng có quá nhiều tham số; các phương pháp cổ điển xử lý tốt hơn nhiều với bộ dữ liệu nhỏ, có cấu trúc.
- Không thấy dấu hiệu overfit ở các mô hình cổ điển. Thông thường, mô hình làm tệ hơn một chút trên dữ liệu chưa thấy so với khi huấn luyện. Ở đây, gần như mọi mô hình (trừ LSTM) đều đạt điểm tốt hơn trên các giải đấu giữ lại so với trong cross-validation. Lý do khả dĩ là bóng đá giải đấu có thể dự đoán hơn lịch quốc tế thường nhật: tính chất quan trọng, đội mạnh và quen thuộc hơn, và sân trung lập đều loại bớt ngẫu nhiên.
Với giải đấu trực tiếp, tôi không chạy cả mười mô hình. Tôi giữ một danh sách rút gọn: baseline tốc độ trung bình làm mốc tham chiếu, cộng với ba mô hình hiệu năng tốt nhất. XGBoost và Poisson Bayes chiếm hai vị trí dẫn đầu tuyệt đối.
Vị trí thứ ba coi như hòa: Nhị thức âm và Poisson song biến chỉ hơn kém nhau 0,0002 RPS và hoán đổi thứ hạng tùy hạt giống ngẫu nhiên, nên giữa hai mô hình không phân biệt được về thống kê, tôi chọn Poisson song biến, có công thức đặt nền tảng vững hơn trong văn liệu dự đoán bóng đá (Karlis và Ntzoufras, 2004).
Danh sách cuối cùng gồm XGBoost (machine learning), Poisson song biến (thống kê cổ điển), và Poisson Bayes (suy luận Bayes). Phần tiếp theo trình bày cách những mô hình này chạy, huấn luyện lại, và biến dự đoán từng trận thành dự báo cho cả giải.
Đưa vào vận hành
Một mô hình sống trong notebook chỉ hữu ích khi bạn đang ngồi trước nó. Để dự đoán trong suốt giải kéo dài một tháng, mọi thứ phải tự chạy: lấy kết quả mới, huấn luyện lại, mô phỏng lại, và làm mới dự báo mà không ai phải chạm tay. Đó là nhiệm vụ của pipeline.
Pipeline hai giờ/lần trên GCP
Toàn bộ dự án chạy như một job theo lịch trên Google Cloud Run. Trước giải, nó chạy mỗi ngày một lần; từ trận khai mạc 11/6, nó chạy mỗi hai giờ. Mỗi lần chạy theo chu trình giống nhau:
- Kiểm tra dữ liệu mới. Nếu không có trận nào kết thúc từ lần chạy trước, không có việc gì, và job thoát sớm.
- Nạp và dựng lại. Khi có kết quả mới, chúng được kéo từ nguồn dữ liệu, và một lệnh
dvc reprodựng lại lớp Silver và Gold để đặc trưng được cập nhật. - Huấn luyện lại, dự đoán, mô phỏng. Các mô hình trong danh sách được cập nhật (chi tiết ngay sau), mọi cặp đấu sắp tới được dự đoán, và cả giải được mô phỏng.
- Chấm điểm. Khi một trận ngã ngũ, các dự đoán cho nó được chấm điểm, cấp dữ liệu cho hệ giám sát bên dưới.
Vì mọi bước đều do mã kích hoạt theo lịch, không có thao tác thủ công nào trong suốt giải. Kết quả mới vào, dự báo cập nhật ra.
Hai chế độ: đóng băng vs. theo vòng
Đây là nơi dự án đồng thời là một thí nghiệm. Trong giải, danh sách mô hình chạy song song hai chế độ, và khác biệt giữa chúng là câu hỏi tôi muốn dữ liệu trả lời: Huấn luyện lại khi giải diễn ra có làm dự đoán tốt hơn không?
- Đóng băng. Mô hình bị khóa ngay khi giải khởi tranh và không huấn luyện lại. Chúng vẫn phản ứng với kết quả vì mỗi mô phỏng bắt đầu từ nhánh đấu đã cập nhật, nhưng chính các tham số mô hình thì không đổi.
- Theo vòng. Các siêu tham số (thiết lập cấp cao) giữ nguyên, nhưng các tham số mô hình học được sẽ được tái khớp trên toàn bộ dữ liệu sẵn có sau mỗi lượt trận vòng bảng và mỗi vòng knock-out, để mô hình tiếp tục học từ giải đấu khi nó diễn ra.
Chạy song song cho phép tôi so sánh sau khi giải kết thúc ở hai mặt: độ chính xác dự báo thuần, và tốc độ mà bất định của mỗi chế độ được thu hẹp khi số đội giảm. Nếu theo vòng thắng, việc huấn luyện lại thường xuyên là xứng đáng; nếu đóng băng vẫn trụ vững, máy móc bổ sung có thể không đáng công.
Từ dự đoán đến cả giải: mô phỏng Monte Carlo
Dự đoán một trận là một chuyện. Biến điều đó thành "xác suất vô địch của mỗi đội" là lúc mô phỏng Monte Carlo phát huy tác dụng.
Đầu tiên là suy luận. Thay vì chỉ dự đoán các cặp đã biết, mô hình dự đoán mọi cặp đấu có thể có giữa 48 đội. Nghe có vẻ quá tay, nhưng trong một giải đấu, bất kỳ đội nào cũng có thể chạm bất kỳ đội nào ở knock-out, nên cần sẵn dự đoán cho mọi cặp.
Tiếp theo là mã hóa luật chơi, và thể thức 2026 khiến phần này đặc biệt rắc rối. Ở 12 bảng, hai đội đầu đi tiếp tự động, nhưng còn có tám đội thứ ba tốt nhất, và ô knock-out mỗi đội thứ ba được xếp vào phụ thuộc vào họ đến từ bảng nào.
Có 495 cách chọn tám bảng có đội thứ ba đi tiếp trong mười hai bảng (mười hai chọn tám), và mỗi cách tạo ra một bộ cặp đấu vòng 32 đội khác nhau. Không có công thức gọn; FIFA chỉ công bố một bảng. Vì vậy tôi (chính xác là đồng nghiệp rất cừ của tôi Cursor) đã hardcode cả 495 tổ hợp vào một bảng ánh xạ, dùng bảng chính thức làm nguồn.
"best_third_mappings": {
"EFGHIJKL": {
"74": "3F",
"77": "3G",
"79": "3E",
"80": "3K",
"81": "3I",
"82": "3H",
"85": "3J",
"87": "3L"
},
"DFGHIJKL": ...
Mỗi khóa, như EFGHIJKL, liệt kê tám bảng có đội thứ ba đi tiếp, và các giá trị đưa từng đội đó (3E, 3F, v.v.) vào một trận cụ thể ở vòng 32 đội. Đó là một mục; bảng đầy đủ lặp lại 495 lần, mỗi lần cho một tổ hợp.
Ba nước chủ nhà (Hoa Kỳ, Canada, Mexico) được xử lý thêm một bước. Khi chủ nhà đá trận tổ chức trên lãnh thổ mình, mô phỏng áp dụng điều chỉnh lợi thế sân nhà cho trận đó, còn phần còn lại của giải coi như sân trung lập.
Khi có dự đoán và luật chơi, mô phỏng chạy cả giải 10.000 lần. Mỗi lượt, nó làm như sau:
- Bốc tỉ số cho mỗi trận bằng cách lấy mẫu số bàn sân nhà và sân khách từ phân phối mà mô hình dự đoán
- Chơi vòng bảng theo đúng luật điểm và phân hạng phụ
- Giải bảng đội thứ ba xuất sắc nhất
- Điền nhánh knock-out theo các ánh xạ ở trên
- Chơi đến khi có nhà vô địch duy nhất.
Qua 10.000 giải mô phỏng, tỷ lệ số lần một đội vào chung kết hay nâng cúp trở thành xác suất của đội đó. Một lượt mô phỏng là phỏng đoán; mười nghìn lượt là dự báo.
Theo dõi tất cả bằng MLflow
Mỗi lần chạy như mô tả ở trên, trong cả hai chế độ, đều được ghi vào MLflow (host trên DagsHub). Theo dõi thí nghiệm nghĩa là ghi có hệ thống đầu vào, thiết lập, kết quả, và đầu ra của từng lần chạy, để có thể so sánh hoặc tái lập y nguyên. Một vài điểm đáng lưu ý:
- Tái lập. Mô phỏng dùng một hạt giống ngẫu nhiên cố định dẫn xuất từ vòng đấu, và cùng hạt giống đó được dùng cho hai chế độ đóng băng và theo vòng. Nghĩa là mọi khác biệt giữa hai chế độ đến từ chính mô hình, không phải may rủi trong mô phỏng. Mỗi lần chạy cũng ghi lại chính xác ảnh chụp dữ liệu nó thấy (số hàng Gold và timestamp), nên kết quả luôn lần về được đầu vào.
- Thí nghiệm. Mỗi lần chạy được gắn thẻ chế độ (đóng băng hay theo vòng) và giai đoạn trong vòng đời, từ thử nghiệm và QA đến suy luận trực tiếp và khớp lại, phản chiếu luồng thăng cấp ở phần trước.
- So sánh. RPS giữ lại được ghi làm metric chọn lựa, cùng tham chiếu đến lần chạy vô địch hiện tại để theo dõi phả hệ. Thời gian fitting cũng được ghi, nơi thấy rõ việc huấn luyện mô hình Bayes chậm hơn khoảng 100 lần.
Các mô hình đã huấn luyện và chính tệp dự đoán (xác suất giải, xếp hạng bảng, và dự báo trận) được lưu dạng artifact của lần chạy, và đó chính là các tệp mà dashboard trực tiếp đọc. Vòng lặp khép kín: từ kết quả thô, qua huấn luyện và mô phỏng, đến các con số bạn thấy online.
Giám sát trượt lệch
Mảnh ghép cuối chạy khi các trận kết thúc. Khi có kết quả thực, các dự đoán tương ứng được chấm điểm và so sánh với baseline tốc độ trung bình đơn giản. Nếu các mô hình đầy đủ bắt đầu thua một mô hình chẳng biết gì về đội bóng, đó là tín hiệu cảnh báo trôi lệch: các mẫu học được trước giải có thể không còn khớp với những gì diễn ra trên sân.
Theo dõi điều này là thực hành chuẩn cho mọi hệ thống dự báo trực tiếp, và bạn có thể đọc thêm về cách phát hiện trong hướng dẫn về data drift và model drift.
Vậy, ai vô địch World Cup?
Sau tất cả máy móc, đây là điều chúng ta muốn biết.
Ứng viên hàng đầu
Tính đến ngày 10/6/2026, trước trận khai mạc một ngày, phán quyết của mô hình ở nhóm đầu khá rõ ràng và nhóm bám đuổi thì sít sao. Tây Ban Nha và Argentina dẫn đầu, mỗi đội khoảng 16% cơ hội nâng cúp. Việc đương kim vô địch thế giới (Argentina) và đương kim vô địch châu Âu (Tây Ban Nha) đứng trên cùng là một kiểm tra tỉnh táo đáng tin rằng mô hình bám sát thực tế.
Ngay sau họ là nhóm bám đuổi chặt chẽ: Pháp, Anh, Brazil, và Colombia hoàn thiện danh sách ứng viên vô địch dễ xảy ra nhất. Đây là các con số trực tiếp và sẽ thay đổi ngay khi có kết quả thực, nên hãy coi như ảnh chụp ngày 10/6 chứ không phải lời tiên tri cố định. Dashboard luôn hiển thị số liệu hiện tại, trễ tối đa hai giờ.
Dashboard trực tiếp
Nói đến đây: Mọi con số trong bài đều đến từ ứng dụng Streamlit trực tiếp được cập nhật tự động khi pipeline chạy. Bạn có thể mở wc2026-predictions.streamlit.app và theo dõi suốt giải. Ứng dụng có bốn chế độ xem chính:
- Tổng quan giải đấu: mỗi đội được kỳ vọng đi đến đâu, nhìn nhanh.
- Xếp hạng bảng: với mỗi bảng, xác suất mỗi đội đứng nhất, nhì, ba (tách ba-đi tiếp và ba-bị loại, nhờ luật đội thứ ba xuất sắc), hoặc tư.
- Dự đoán trận đấu: với mỗi trận vòng bảng, cơ hội thắng sân nhà, hòa, thắng sân khách, cùng nhánh knock-out khả dĩ nhất.
- Các cặp knock-out thường gặp nhất: những cặp đấu mô phỏng sinh ra thường xuyên nhất.
Một điểm lạ đáng lưu ý ở chế độ xem trận: một vài đội xuất hiện đồng thời ở hai ô vòng 32 đội. Đó không phải lỗi. Nó xảy ra khi một bảng cân bằng đến mức mô hình không thể chắc chắn vị trí đi tiếp của một đội. Kết hợp bất định của đội thứ ba xuất sắc, hai kết cục dẫn đến hai ô knock-out khác nhau. Trường hợp Thổ Nhĩ Kỳ thậm chí dẫn đến việc họ xuất hiện hai lần ở vòng 16 đội.
Hình sau cho thấy các vòng cuối (tứ kết đến chung kết) mà mô hình XGBoost dự phóng trước khi giải khởi tranh:

Đội “tung đồng xu”: Hoa Kỳ
Điều thú vị của một mô hình như thế này nằm ở những đội trái với cảm nhận mắt thường, và ví dụ rõ nhất là Hoa Kỳ. Nếu bạn mở tổng quan giải trên dashboard, bạn sẽ lập tức thấy Mỹ nổi bật về màu sắc.
Với lợi thế đồng chủ nhà đá trước khán giả nhà, bạn có thể kỳ vọng khởi đầu dễ chịu, nhưng mô hình thận trọng hơn nhiều: chỉ khoảng 54,6% cơ hội vượt qua vòng bảng, thấp thứ 13 toàn giải (nhớ rằng hai phần ba số đội đi tiếp!), vì bảng của họ với Australia, Paraguay, và Thổ Nhĩ Kỳ cân bằng bất thường.
Phần thú vị là sau đó. Nếu vượt qua khe cửa hẹp, Mỹ sau đó gần như tung đồng xu ở mọi vòng tiếp theo. Chồng các “cú tung xu” đó lại, họ có khoảng 2% cơ hội vô địch cả giải, xếp thứ 13 trong 48 đội.
Một đội xếp hạng 13 từ dưới lên về khả năng qua vòng bảng và 13 từ trên xuống về khả năng vô địch chính là định nghĩa hoàn hảo của đội tung đồng xu: chẳng bao giờ là cửa trên, nhưng cũng chẳng bao giờ hết cửa.
Lời kết
Dự án này tốn rất nhiều công sức, và nó bao trùm nhiều nội dung hơn một bài viết có thể chứa. Repo có nhiều thứ không đưa vào đây: toàn bộ tập mô hình ứng viên, kỹ thuật đặc trưng, và phần điều phối giúp mọi thứ chạy trơn tru chỉ là vài ví dụ.
Hiện tại, mô hình đã đưa ra lựa chọn, và giải đấu sẽ là quan tòa. Dù bạn đến vì MLOps hay vì bóng đá, tôi hy vọng bạn sẽ tận hưởng quá trình diễn ra như tôi. Bạn có thể theo dõi dự báo trực tiếp khi các trận đổ về và xem dự đoán bền vững đến đâu.
Nếu muốn xem kỹ hơn một số khái niệm tôi nhắc tới, bạn có thể học khóa MLOps Concepts của chúng tôi.
Câu hỏi thường gặp về dự đoán đội vô địch FIFA World Cup 2026
Ai sẽ vô địch FIFA World Cup 2026?
Tính đến ngày 10/6/2026, ngay trước khi giải khởi tranh, mô hình xem Tây Ban Nha và Argentina là đồng ứng viên hàng đầu, mỗi đội khoảng 16% cơ hội vô địch, theo sau là Pháp, Anh, Brazil, và Colombia. Không có đội nào áp đảo tuyệt đối, phản ánh sự mở của giải. Đây là các con số trực tiếp thay đổi theo kết quả, nên dashboard luôn hiển thị số liệu hiện tại.
Một mô hình máy học có thể chính xác đến mức nào khi dự đoán bóng đá?
Bóng đá quốc tế khó dự báo: ít bàn thắng và các đội đá ít trận chính thức, nên ngay cả mô hình mạnh cũng để lại nhiều chỗ cho may rủi. Trong dự án này, năm mô hình đứng đầu chỉ cách nhau khoảng 0,001 RPS, gợi ý rằng trần độ chính xác chủ yếu do dữ liệu và đặc trưng hơn là thuật toán. Yếu tố chi phối lớn nhất của dự đoán là khoảng cách điểm Elo giữa hai đội.
Tại sao dự đoán số bàn thay vì kết quả trận đấu?
Dự đoán số bàn cho mỗi đội, thay vì thẳng thừng thắng, hòa, thua, tạo ra một phân phối xác suất đầy đủ trên các tỉ số. Đó là điều làm cho việc mô phỏng cả giải trở nên khả thi: khi bạn có thể lấy mẫu các tỉ số hợp lý, bạn có thể chơi vòng bảng và nhánh knock-out hàng nghìn lần và đọc ra xác suất đi tiếp hoặc vô địch của mỗi đội.
Số bàn cũng xấp xỉ theo phân phối Poisson khá tốt, phù hợp với phong cách mô hình hóa này.
Mô phỏng Monte Carlo là gì, và vì sao chạy 10.000 lần?
Mô phỏng Monte Carlo lặp đi lặp lại một quá trình ngẫu nhiên để ước lượng các xác suất khó tính trực tiếp. Ở đây, mỗi lượt rút tỉ số cho mọi trận từ dự đoán của mô hình và chơi giải đến khi có nhà vô địch; làm điều này 10.000 lần biến dự đoán từng trận thành các phần trăm ổn định như "Tây Ban Nha vô địch khoảng 16% thời gian." Một giải mô phỏng chỉ là một kết cục khả dĩ, nhưng mười nghìn giải xấp xỉ phổ khả năng thực.
Cần những công cụ nào để xây một pipeline MLOps như thế này?
Các thành phần cốt lõi gồm quản lý phiên bản dữ liệu (dự án này dùng DVC), theo dõi thí nghiệm (MLflow), cơ chế chạy job theo lịch (Google Cloud Run với Cloud Scheduler), và cách phân phối kết quả (dashboard Streamlit).
Bản thân các mô hình dựa trên tổ hợp thư viện Python: scikit-learn (Ridge và random forest), XGBoost (quán quân), statsmodels và SciPy (hồi quy Poisson, Poisson song biến, và Nhị thức âm, cộng SARIMAX), PyMC (mô hình Bayes), và Keras (LSTM và CNN), với pandas và NumPy xử lý dữ liệu.
Không thứ nào trong số này là bắt buộc cho một mô hình làm một lần, nhưng cùng nhau, chúng giúp pipeline có thể tái lập và tự huấn luyện, tự làm mới mà không cần thao tác thủ công
Tom là một nhà khoa học dữ liệu và giảng viên kỹ thuật. Anh viết và quản lý các bài hướng dẫn và bài blog về khoa học dữ liệu của DataCamp. Trước đây, Tom làm việc trong lĩnh vực khoa học dữ liệu tại Deutsche Telekom.
