Courses
Dự đoán bóng đá là việc khó. Đây là môn thể thao ít bàn thắng, nơi một cú sút đổi hướng có thể lật ngược kết quả, và một phần không nhỏ của mỗi trận phụ thuộc vào may mắn. Bóng đá quốc tế còn khó hơn: các đội tuyển chỉ chơi vài trận đấu chính thức mỗi năm, nên có ít dữ liệu để học hơn nhiều so với cấp CLB.
Và như thế vẫn chưa đủ, FIFA lại khiến bài toán khó hơn ở kỳ World Cup năm nay. World Cup mở rộng với 48 đội giới thiệu thể thức mới, trong đó hai đội đứng đầu của mười hai bảng đi tiếp, cùng với tám trong số mười hai đội hạng 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 quyết định dự đoán.
Đây là phần tiếp nối dự án dự đoán EURO 2024 của tôi, gần như được xây 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ố có khả năng xảy ra nhất cho mỗi trận. Lần này, tôi xây dựng một pipeline MLOps đầu-cuối: tiếp nhận 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 đấu 10.000 lần, biến dự đoán cấp trận đấu thành xác suất đội đi xa đến đâu.
Trong bài viết này, tôi sẽ dẫn bạn 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, kiến trúc pipeline, và mô hình nào hóa ra 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ã trong repo dự án. Và tất nhiên, tôi sẽ nói cho bạn biết mô hình nghĩ ai sẽ vô địch. (Bật mí: nó ưa 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 quả đó.)
Nếu điều này khiến bạn có tâm trạng sẵn sàng cho giải đấu, tôi khuyên bạn nên theo dõi tuần lễ Data & AI World Cup của chúng tôi, chuỗi phiên chia sẻ về cách dữ liệu và AI đang định hình lại bóng đá, miễn phí xem trực tiếp hoặc theo yêu cầu.
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, hai giờ một lần trong suốt giải đấu.
- Dữ liệu từ API-Football và Elo được xử lý qua kiến trúc huy chương Bronze-Silver-Gold và được quản lý phiên bản với DVC để tái lập đầy đủ.
- Mười mô hình từ 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 đứng đầu gần như không tách biệt, và chênh lệch Elo giữa các đội là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 đấu 10.000 lần, biến dự đoán bàn thắng cấp trận thành xác suất mỗi đội đi tiếp và vô địch.
- Tính đến ngày 10 tháng 6 năm 2026, các ứng viên hàng đầu của mô hình là Tây Ban Nha và Argentina, xấp xỉ 16% mỗi đội. Bạn có thể theo dõi dự đoán trực tiếp trên bảng điều khiển Streamlit đi kèm, làm mới mỗi hai giờ.
Dữ liệu phía sau các dự đoán
Một dự đoán chỉ tốt khi dữ liệu đầu vào của nó tốt, 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.
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 thúc 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ậ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 bạn muốn trực giác đầy đủ, bài viết DataCamp trước đây giải thích trong bối cảnh World Cup 2022.
Kết hợp lại, hai nguồn mang đến 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à mỗi đội ghi trong một trận. Số bàn thắng trong bóng đá, xấp xỉ khá tốt, tuân theo phân phối Poisson, cách tiêu 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 bàn thắng thay vì kết quả là điều khiến mọi thứ về sau trở nên khả thi. Một khi mô hình có thể tạo ra tỉ số hợp lý cho bất kỳ cặp đấu nào, những câu hỏi 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ể trả lời bằng cách mô phỏng những tỉ số đó hàng nghìn lần.
Các đặc trưng quan trọng
Mỗi trận được mô tả bằng một tập đặ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 vượt trội là đặc trưng quan trọng nhất trong mô hình, với mức độ quan trọng cao hơn khoảng hai bậc so với đặc trưng mạnh kế tiếp. Điều đó hợp trực giác, vì chênh lệch sức mạnh giữa hai bên nói lên nhiều điều về kết quả hơn hầu hết yếu tố khác.
- Tổng Elo: tổng hai điểm Elo, đại diện cho chất lượng tổng thể của cặp đấu. Chênh lệch một mình không thể phân biệt Argentina gặp Tây Ban Nha với San Marino gặp Andorra—hai trận cân bằng ở hai đẳng cấp hoàn toàn khác nhau—và tổng điểm khôi phục thông tin đó.
- Biến động Elo cuộn (5 trận gần nhất): điểm của mỗi đội đã thay đổi gần đây bao nhiêu. Điều này phản ánh phong độ trong khi đã tính đến sức mạnh đối thủ đã gặp.
- Bàn thắng ghi và thủng lưới cuộn (5 trận gần nhất): hiệu suất 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 có sức nặng khác vòng loại hay Nations League), liệu đó có là trận loại trực tiếp, và có thi đấu tại sân trung lập hay không.
Mọi đặc trưng đều nghiêm ngặt an toàn rò rỉ, nghĩa là mỗi đặc trưng chỉ dùng thông tin có sẵn 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 kiểm thử rồi sụp đổ ngoài thực tế.
Một ý tưởng không qua vòng chọn: tôi từng dự định bộ đặc trưng “phong cách chơi” bằng cách phân cụm đội từ 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ì cho mô hình ăn nhiễu, tôi loại bỏ. Kết quả âm vẫn là kết quả.
Giữ cho dữ liệu tái lập được
Với dữ liệu đến từ hai nguồn theo chu kỳ, đường đi từ tệp thô đến đặc trưng sẵn sàng cho mô hình phải giống hệt mỗi lần. Đó là điều kiến trúc huy 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ư nhận về, không đụng chạm.
- Silver: đã làm sạch và chuẩn hóa. Tại đây tôi ánh xạ tên đội giữa hai nguồn (họ hiếm khi thống nhất cách viết), xác thực lược đồ, nối điểm Elo vào bản ghi trận, và xử lý mọi thứ thiếu hoặc sai định dạng.
- Gold: lớp mô hình hóa, mỗi hàng gọn cho một trận với mọi đặc trưng được tính sẵn và sẵn sàng huấn luyện.
Mỗi lớp nuôi lớp sau, nên khi có gì đó trông không ổn, tôi có thể truy vết lùi từng bước thay vì gỡ rối tất cả cùng lúc. Để làm cho toàn bộ tuyến đường tái lập được, tôi dùng DVC (Data Version Control). Bất cứ khi nào có kết quả mới, một lệnh dvc repro tái xây Silver và Gold từ Bronze, chỉ chạy lại bước nào có đầu vào thay đổi, và quản lý phiên bản các bộ dữ liệu tạo ra để mọi trạng thái trước đó đều có thể khôi phục chính xác.
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 hiển nhiên. Thay vì chọn 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 bao trùm năm họ cộng một đường cơ sở đơn giản. Bạn không cần biết nội hàm của từng mô hình; điểm mấu chốt là chúng đưa ra các 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 tổng thể, bỏ qua mọi đặc trưng. Mốc sàn để 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 biến đếm bàn thắng bằng các phân phối xác suất dành 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. Rất tốn tài nguyên tính toán: chậm hơn khoảng 100 lần khi fit so với phần còn lại. |
| Chuỗi thời gian | SARIMAX | Coi kết quả của một đội là chuỗi theo thời gian và ngoại suy chuỗi đó về phía trước. |
| Học máy | 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. |
| Học sâu | LSTM, 1D CNN | Mạng nơ-ron tìm kiế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 kẻ chiến thắng bằng cảm tính là bất khả thi. Thay vào đó, mỗi mô hình đi qua ba giai đoạn, và mã quyết định nó có đi tiếp hay không. Đây chính là triển khai dựa trên mã: mô hình được thăng hạng từ môi trường này sang môi trường khác bằng các kiểm tra tự động thay vì tinh chỉnh thủ công, giúp toàn bộ quy trình lựa chọn 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ế trước World Cup 2022. Không phải tất cả các trận đều có trọng số như nhau: các trận gần đây hơn và có tính chất quan trọng hơn được gán trọng số cao hơn (suy giảm theo thời gian và trọng số tầm quan trọng), nên một kết quả cạnh tranh gần đây định hình mô hình nhiều hơn một trận giao hữu cũ. Sau đó siêu tham số của mỗi mô hình được tinh chỉnh để tối thiểu hóa Poisson negative log-likelihood (NLL) bằng cross-validation. NLL chỉ 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ế, 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 từng mô hình.
- Đảm bảo chất lượng. Những mô hình đã tinh chỉnh này được kiểm tra trên các trận chúng chưa từng thấy: World Cup 2022 cộng sáu giải lớn gần đây (EURO, hai CAN, Copa América, Asian Cup, và Gold Cup), tổng cộng 347 trận. Ở đây, thước đo chuyển sang ranked probability score (RPS), đo lường chất lượng 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 đấu. RPS là thước đo phù hợp 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 đấu được so với nhà vô địch đương nhiệm. Nếu thắng, nó được thăng hạng và fit lại trên mọi trận có sẵn, để bước vào giải đấu sau khi đã học từ toàn bộ dữ liệu.
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 |
| 1D CNN | 0.20916 |
| Poisson tốc độ trung bình (đường cơ sở) | 0.22872 |
Bốn điều nổi bật từ các kết quả này:
- XGBoost thắng, nhưng chỉ vừa đủ. Năm mô hình đứng đầu (XGBoost, Poisson Bayes, Nhị thức âm, Poisson song biến, và Random Forest) kết thúc trong khoảng 0,0011 RPS của nhau. Khi năm cách tiếp cận rất khác nhau về đích sát nhau như vậy, thường nghĩa là trần hiệu năng do dữ liệu và đặc trưng đặt ra, không phải do mô hình. Ở đây, chênh lệch Elo làm quá nhiều 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 biên cách rất lớn, ảnh hưởng gấp khoảng trăm lần đặc trưng kế tiếp. Điều đó củng cố thay vì gây bất ngờ: trong một trận đơn lẻ, chênh lệch sức mạnh thật sự là phần lớn câu chuyện.
- Học sâu về cuối, trừ đường cơ sở. 1D CNN 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 có dấu hiệu quá khớp ở các mô hình cổ điển. Thông thường, mô hình làm tệ hơn đôi 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) lại có điểm tốt hơn trên các giải bị giữ lại so với trong cross-validation. Lý do có thể là bóng đá giải đấu dự đoán được hơn lịch thi đấu quốc tế thường nhật: tính chất quan trọng cao hơn, các đội mạnh và quen mặt hơn, và sân trung lập—tất cả đều loại bớt phần ngẫu nhiên.
Với giải đấu trực tiếp, tôi không chạy cả mười. Tôi giữ một đội hình nhỏ hơn: baseline tốc độ trung bình làm mốc tham chiếu, cộng với ba mô hình có hiệu năng tốt nhất. XGBoost và Poisson Bayes chắc suất top 2.
Vị trí thứ ba về cơ bản là hòa: Nhị thức âm và Poisson song biến chỉ cách nhau 0,0002 RPS và đổi chỗ 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ề mặt thống kê, tôi chọn Poisson song biến, có công thức được nền tảng vững hơn trong tài liệu dự đoán bóng đá (Karlis và Ntzoufras, 2004).
Vậy đội hình còn lại gồm XGBoost (học máy), Poisson song biến (thống kê cổ điển), và Poisson Bayes (suy luận Bayes). Phần tiếp theo nói về cách các mô hình đó chạy, huấn luyện lại, và biến dự đoán trận đơn thành dự báo cho cả giải.
Đưa vào sản xuất
Một mô hình sống trong notebook chỉ hữu ích khi bạn ngồi trước nó. Để dự đoán các trận trong suốt giải đấu kéo dài một tháng, mọi thứ phải tự chạy: kéo 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 cần ai chạm tay. Đó là việc của pipeline.
Pipeline mỗi hai giờ 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 đấu, nó thức dậy mỗi ngày một lần; từ trận khai mạc ngày 11/6, nó chạy mỗi hai giờ. Mỗi lần chạy theo cùng chu trình:
- Kiểm tra dữ liệu mới. Nếu không có trận nào kết thúc kể từ lần chạy trước, không có gì để làm, và job thoát sớm.
- Nạp và tái xây. Khi có kết quả mới, chúng được kéo từ nguồn dữ liệu, và một lệnh
dvc reprotái xây các 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 đội hình được cập nhật (chi tiết ngay sau), mọi cặp đấu sắp tới được dự đoán, và toàn bộ 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, cung cấp dữ liệu cho việc giám sát bên dưới.
Vì mọi bước được kích hoạt bằng mã theo lịch, không có thao tác thủ công nào trong suốt giải đấu. Có kết quả mới vào, có dự báo làm mới ra.
Hai chế độ: đóng băng và theo vòng
Đây là nơi dự án kiêm nhiệm vai trò thí nghiệm. Trong giải đấu, đội hình chạy song song ở hai chế độ, và khác biệt giữa chúng là câu hỏi tôi hy vọng dữ liệu sẽ trả lời: Việc 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 khoảnh khắc giải khởi tranh và không bao giờ 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 tham số mô hình thì không đổi.
- Theo vòng. Siêu tham số (các thiết lập cấp cao) giữ nguyên, nhưng tham số mà mô hình học được sẽ fit lại trên toàn bộ dữ liệu có sẵn sau mỗi lượt trận vòng bảng hoàn tất và sau mỗi vòng knock-out, để mô hình tiếp tục học từ giải đấu ngay khi nó diễn ra.
Chạy song song cho phép tôi so sánh chúng trên hai mặt sau khi kết thúc: độ chính xác dự đoán thô, và tốc độ mà bất định của mỗi chế độ giảm khi số đội thu hẹp. Nếu theo vòng thắng, việc huấn luyện lại thường kỳ là xứng đáng; nếu đóng băng vẫn trụ vững, có thể không đáng lắp thêm cơ chế.
Từ dự đoán tới 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 “cơ hội vô địch của mỗi đội” là nơi mô phỏng Monte Carlo phát huy.
Đầu tiên là suy luận. Thay vì chỉ dự đoán các cặp đấu đã biết, mô hình dự đoán mọi cặp có thể 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ể gặp đội khác ở vòng knock-out, nên dự đoán phải sẵn cho mọi cặp.
Tiếp theo là mã hóa luật, và thể thức 2026 khiến phần này đặc biệt rắc rối. Qua 12 bảng, hai đội đầu bảng đi tiếp tự động, nhưng tám đội hạng ba tốt nhất cũng đi tiếp, và mỗi đội trong số tám đội đó rơi vào ô knock-out nào phụ thuộc vào họ đến từ bảng nào.
Có 495 cách chọn tám bảng vượt hạng ba trong mười hai (mười hai chọn tám), và mỗi cách sinh ra một bộ cặp đấu vòng 32 đội khác nhau. Không có công thức gọn; FIFA đơn giản là công bố một bảng. Vậy nên tôi (thực ra là đồng nghiệp rất cừ của tôi Cursor) đã hardcode cả 495 tổ hợp vào một á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 hạng ba đi tiếp, và các giá trị sẽ xếp từng đội đó (3E, 3F, v.v.) vào số trận cụ thể của vòng 32 đội. Đó là một mục; ánh xạ đầy đủ lặp lại 495 lần, mỗi tổ hợp một lần.
Ba nước chủ nhà (Hoa Kỳ, Canada, và Mexico) có một xử lý bổ sung. Khi chủ nhà đá trận tổ chức tại nước 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, mô phỏng chạy toàn bộ giải 10.000 lần. Mỗi lần, nó theo quy trình:
- 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ừ các phân phối dự đoán của mô hình
- Chơi vòng bảng theo đúng luật điểm số và tie-break thực tế
- Giải quyết bảng xếp hạng hạng ba tốt nhất
- Điền nhánh knock-out từ các ánh xạ ở trên
- Chơi đến khi còn một nhà vô địch.
Qua 10.000 giải đấu mô phỏng, tỷ lệ lượt chạy mà 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 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 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 nhận có hệ thống đầu vào, thiết lập, kết quả, và đầu ra của mỗi lần chạy, để có thể so sánh hoặc tái lập chính xác. Một vài thứ đáng nêu:
- Tính 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 chia sẻ giữa chế độ đóng băng và theo vòng. Điều đó nghĩa là khác biệt giữa hai chế độ đến từ bản thân mô hình, không phải do may rủi bên trong mô phỏng. Mỗi lần chạy cũng ghi lại ảnh chụp dữ liệu chính xác mà nó thấy (số hàng Gold và dấu thời gian), để kết quả luôn truy vết được về đầu vào.
- Thí nghiệm. Mỗi lần chạy được gắn thẻ với chế độ (đóng băng hay theo vòng) và giai đoạn vòng đời của nó, từ thử nghiệm và QA đến suy luận trực tiếp và fit lại, phản chiếu luồng thăng hạng ở phần trước.
- So sánh. RPS trên tập giữ lại được ghi như thước đo lựa chọn, cùng tham chiếu đến lần chạy nhà vô địch hiện tại để theo dõi phả hệ. Thời gian fit cũng được ghi, nơi thể hiện 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à tệp dự đoán (xác suất giải đấu, xếp hạng bảng, và dự báo trận) được lưu làm artifact của lần chạy, và chính các tệp đó là thứ bảng điều khiển trực tiếp đọc. Vòng lặp được khép kín: từ kết quả thô, qua huấn luyện và mô phỏng, đến con số bạn thấy trực tuyến.
Giám sát drift
Mảnh ghép cuối cùng chạy khi các trận kết thúc. Khi có kết quả thực, các dự đoán cho chúng được chấ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 sút một mô hình không biết gì về đội bóng, đó là dấu hiệu cảnh báo drift: 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 đưa ra dự đoán 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ả cỗ máy đó, đây là điều nó phục vụ.
Ứng viên hàng đầu
Tính đến ngày 10/6/2026, một ngày trước trận khai mạc, phán quyết của mô hình ở nhóm đầu khá rõ ràng và ngay sau đó thì chen chúc. 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 đầu là một phép thử tỉnh táo đáng yên tâm rằng mô hình bám sát thực tế.
Phía sau là nhóm bám đuổi sít sao: Pháp, Anh, Brazil, và Colombia hoàn thiện nhóm ứng viên vô địch hàng đầu. Đâ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 chúng như ảnh chụp ngày 10/6 chứ không phải lời tiên tri cố định. Bảng điều khiển luôn hiển thị số liệu hiện tại, trễ tối đa hai giờ.
Bảng điều khiển trực tiếp
Nói về điều đó: Mọi con số trong bài viết này đến từ một ứng dụng Streamlit trực tiếp cập nhật tự động khi pipeline chạy. Bạn có thể mở tại 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 dự kiến đi xa đến đâu, nhìn nhanh.
- Xếp hạng bảng: cho mỗi bảng, xác suất của từng đội về đích nhất, nhì, ba (tách thành “hạng ba đi tiếp” và “hạng ba bị loại”, nhờ luật đội hạng ba xuất sắc), hoặc tư.
- Dự đoán trận đấu: cho mỗi trận vòng bảng, xác suất chủ thắng, hòa, khách thắng, cùng nhánh knock-out có khả năng nhất.
- Cặp knock-out thường gặp nhất: các cặp mà mô phỏng tạo 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 ô có thể của 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ể tự tin xác định đội sẽ đứng vị trí nào để vượt qua. Kết hợp với bất định từ hạng ba xuất sắc, hai kết cục dẫn đến hai ô knock-out khác nhau. Với Thổ Nhĩ Kỳ, thậm chí họ xuất hiện hai lần ở vòng 16 đội.
Đồ họa 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ị ở một mô hình như thế này nằm ở những đội trái ngược với cảm nhận bằng mắt, và ví dụ rõ nhất là Hoa Kỳ. Nếu bạn vào tổng quan giải đấu trên bảng điều khiển, bạn sẽ lập tức thấy Mỹ nổi bật về màu sắc.
Với tư cách đồng chủ nhà thi đấu trước khán giả nhà, bạn có thể kỳ vọng một khởi đầu thoải mái, nhưng mô hình thận trọng hơn nhiều: nó chỉ cho họ khoảng 54,6% cơ hội vượt vòng bảng, thấp thứ 13 trong toàn bộ giải (nhớ rằng hai phần ba số đội vượt vòng bảng!), 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à những gì sau đó. Nếu vượt qua được, Mỹ sau đó ở mức xấp xỉ tung đồng xu ở mọi vòng tiếp theo. Chồng các lần tung đồng xu đó lại, họ có khoảng 2% cơ hội vô địch cả giải, xếp hạng 13 trên 48 đội.
Một đội xếp hạng 13 từ dưới lên về cơ hội vượt vòng bảng và 13 từ trên xuống về cơ hội vô địch là định nghĩa gần hoàn hảo của “đội tung đồng xu”: không bao giờ là kèo trên, cũng chẳng bao giờ hết cửa.
Lời kết
Dự án này là rất nhiều công việc và bao phủ nhiều nội dung hơn một bài viết có thể chứa. Repo có nhiều thứ không kịp đưa vào đây: toàn bộ tập mô hình ứng viên, kỹ thuật xây đặc trưng, và dàn nhạc vận hành mọi thứ là vài ví dụ.
Hiện tại, mô hình đã đưa ra lựa chọn, và giải đấu sẽ là trọng tài. Dù bạn đến vì MLOps hay bóng đá, tôi hy vọng bạn sẽ thích theo dõi nó 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 trụ vững ra sao.
Nếu bạn muốn tìm hiểu kỹ hơn một số khái niệm tôi đã nhắc, tôi khuyến nghị khóa học MLOps Concepts của chúng tôi.
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.
