2025 MCM C 题思路分析
中文版题目翻译在这里先不放了,重点说一下我和队友讨论出来的一个简单思路。
题目背景信息
- 排名、金牌、奖牌数量: 奥运会奖牌榜的核心指标。
- 奖牌预测方法: 强调基于参赛运动员名单而非历史奖牌数据进行预测。
- 数据限制: 模型和分析必须仅使用提供的五个数据文件,所以好好想想到时候伟大教练应该怎么考虑 (
data_dictionary.csv
,summerOly_athletes.csv
,summerOly_medal_counts.csv
,summerOly_hosts.csv
,summerOly_programs.csv
)。
名词解释
- discipline (赛类): 如游泳、田径等大的运动类别。
- event (赛项): 具体比赛项目,如男子100米自由泳,是产生奖牌的具体赛事。
问题分解与建模思路
Q1 (Model 1): 奖牌预测模型
目标: 为每个国家建立奖牌预测模型,至少预测金牌和总奖牌数,并给出预测的置信区间,评估模型性能。
输入: (至少)一个字典,key 为运动员名称,value 为运动员的过往竞赛数据。
输出: 一个字典,key 为运动员名称,value 为预测的该运动员获得的奖牌数量(可以是单个数值或一个概率分布)。
核心: 研究运动员和奖牌之间的关系。
关键词: athletes
, medal counts
, gold medal
, quantification
, mathematical modeling
.
参考论文:
- 论文1: Olympic Game Medal Count Analysis (calstate.edu) - 分析了奖牌与温度、GDP 的关系,但未分析运动员与奖牌的关系,可参考其分析方法。
- 论文2: Forecasting the Olympic medal distribution – A socioeconomic machine learning model - ScienceDirect - 未分析运动员与奖牌关系,但对结果的预测有参考价值,模型需谨慎借鉴,不要使用额外数据,额外数据根据题目要求只能作为佐证。
模型建议:
- 尽量使用随机森林及其衍生模型。
- 创新点: 可探索随机森林的衍生模型,但避免过于复杂,保证实现可行性。
- 模型性能评估: 使用适当的评估指标(如 MSE, RMSE, R^2),进行交叉验证。
Q1.1: 2028 年洛杉矶奥运会预测
目标: 基于 Q1 模型,预测 2028 年洛杉矶奥运会的奖牌榜,包括预测区间,并分析哪些国家可能进步或退步。
输出:
- 预测的 2028 年奥运会奖牌榜 (包括区间)
- 哪些国家可能进步/退步的分析
核心: 应用已建立的奖牌预测模型进行预测。
Q1.2: 未获奖牌国家首次获奖时间预测
目标: 模型需包括未获奖牌国家,预测多少国家在下届奥运会首次获奖,并给出概率。
输入: 一个字典,每个 key 为运动员,每个 value 为运动员的过往竞赛记录。
输出:
- 一个字典,key 为运动员,value 为运动员获得奖牌的数量(或概率分布)。
- 未获奖牌国家首次获奖预测的概率。
理解: 将模型准确率视为预测的可能性。
核心: 分析运动员参赛经历、奖牌记录与首次获奖之间的关系。
Q1.3: 赛事类型与奖牌关系
目标: 探索赛事类型(如游泳、举重)和国家奖牌数之间的关系,分析哪些体育项目对不同国家重要,以及主办国选择如何影响结果。
输入: 对于每个国家,赛事类型 (x)。
输出: 对于每个国家,奖牌数量 (y)。
方法:
- 尝试多种机器学习模型(如回归、树模型),对比结果,选择最优模型。
- 模型建立过程可仅针对最优模型详细描述。
核心: 揭示赛事类型对国家奖牌数的潜在影响。
当然可以,我们先从 Q1 的模型开始,一步一步来完成代码。请确保你已经安装了 pandas
和 scikit-learn
库。
代码在这里!!!!!!!!Q1:建立奖牌预测模型
Q1 完整解答:模型开发、不确定性评估和性能衡量
目标: 开发一个更完善的奖牌预测模型,并包含不确定性估计和性能评估。
改进方向:
- 更丰富的特征工程: 加入历史奖牌表现作为特征,例如过去几届奥运会的平均金牌数、总奖牌数。
- 不确定性估计: 使用 Bootstrap 方法来估计预测结果的不确定性,并给出预测区间。
- 性能衡量: 继续使用 MSE 和 R^2,并考虑添加其他指标,例如平均绝对误差 (MAE)。
代码实现:
步骤 1: 扩展特征工程 - 加入历史奖牌特征
我们在特征中加入过去几届奥运会的金牌和总奖牌数均值,以捕捉国家历史奖牌表现的趋势。
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
# 加载数据 (保持之前的数据加载和清洗代码不变)
athletes_df = pd.read_csv('summerOly_athletes.csv', encoding='utf-8')
medal_counts_df = pd.read_csv('summerOly_medal_counts.csv', encoding='utf-8')
medal_counts_df = medal_counts_df[~medal_counts_df['NOC'].isin(['Mixed team', 'ANZ'])]
medal_counts_df['Year'] = medal_counts_df['Year'].astype(int)
athletes_df['Year'] = athletes_df['Year'].astype(int)
# 特征工程 - 加入历史奖牌特征
def create_historical_features(df, years_ago_list=[4, 8, 12]): # 考虑过去 4, 8, 12 年的奥运会
df_features