乔人尹 - world cup
type: channel
link: https://underestimated.cn/tag/world-cup/
items: 谁会捧起大力神杯？

谁会捧起大力神杯？
type: item
date: 2022-12-19T00:49:00+00:00
description: 本文属于《从入门到放弃》系列，但这次我们不放弃，因为结果已经出来了，预测准了那叫"科学"，预测错了那叫"模型还需优化"。前言：一个拖延症患者的自白本来想着要写一篇关于世界杯的文章，用机器学习预测冠军，多酷炫啊！然后...我拖了。小组赛的时候我说："等淘汰赛再写，数据更准。"淘汰赛的时候我说："等半决赛再写，悬念更足。"半决赛的时候我说："等决赛再写，流量更大。"决赛的时候我在看球。然后，梅西捧起了大力神杯，我热泪盈眶。现在，世界杯结束了，我终于开始写这篇"预测"文章了。所以，本文是一篇复盘，不是预测。如果你发现我的模型"神准地预测"了阿根廷夺冠，请不要惊讶——毕竟，我是站在2022年12月19日写这篇文章的。这大概就是传说中的：事后诸葛亮，事前猪一样。graph LR A["世界杯开始"] --> B["我：要写预测文章！"] B --> C["小组赛"] C --> D["我：再等等..."] D --> E["淘汰赛"] E --> F["我：快了快了..."] F --> G["决赛"] G --> H["我：在看球"] H --> I["梅西捧杯🏆"] I --> J["我：现在开始写！"] style I fill:#ffd700,color:#000,stroke-width:3px style J fill:#ff6b6b,color:#fff一、数据准备1.1 数据来源要预测世界杯冠军，首先得有数据。我们使用Kaggle上的经典数据集：数据集内容时间范围international_matches.csv国际比赛结果1872-2022players_22.csvFIFA 22球员数据2022teams.csv国家队信息-world_cup_matches.csv历届世界杯比赛1930-2018import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier from sklearn.model_selection import train_test_split, cross_val_score from sklearn.preprocessing import LabelEncoder import warnings warnings.filterwarnings('ignore') # 加载数据 matches = pd.read_csv('international_matches.csv', parse_dates=['date']) players = pd.read_csv('players_22.csv') world_cups = pd.read_csv('world_cup_matches.csv') print(f"国际比赛数据: {len(matches)} 场") print(f"球员数据: {len(players)} 人") print(f"世界杯比赛数据: {len(world_cups)} 场")输出：国际比赛数据: 44360 场 球员数据: 19239 人 世界杯比赛数据: 964 场1.2 数据探索先看看历届世界杯冠军分布：# 历届世界杯冠军 champions = { 1930: '乌拉圭', 1934: '意大利', 1938: '意大利', 1950: '乌拉圭', 1954: '德国', 1958: '巴西', 1962: '巴西', 1966: '英格兰', 1970: '巴西', 1974: '德国', 1978: '阿根廷', 1982: '意大利', 1986: '阿根廷', 1990: '德国', 1994: '巴西', 1998: '法国', 2002: '巴西', 2006: '意大利', 2010: '西班牙', 2014: '德国', 2018: '法国', 2022: '阿根廷' # 剧透警告！ }pie showData title 世界杯冠军次数分布（1930-2022） "巴西 5次" : 5 "德国 4次" : 4 "意大利 4次" : 4 "阿根廷 3次" : 3 "法国 2次" : 2 "乌拉圭 2次" : 2 "英格兰 1次" : 1 "西班牙 1次" : 11.3 特征工程这是机器学习最重要的一步——把足球比赛变成数字。graph TB subgraph 原始数据 M["比赛数据"] P["球员数据"] H["历史战绩"] end subgraph 特征提取 F1["球队实力特征"] F2["球员能力特征"] F3["历史交锋特征"] F4["近期状态特征"] F5…