实验背景
2018俄罗斯世界杯进行的如火如荼,各种爆冷。『WedO实验君』也来凑个热闹,用python预测下世界杯各小组赛的胜负,虽然小组赛都快结束了,紧赶慢赶搭上末班车了。
实验器材
● Python
● Kaggle
● Pandas
● sklearn
实验内容
依赖数据介绍
本次实验的数据来源了kaggle(https://www.kaggle.com/)
2018世界杯参赛队(https://www.kaggle.com/lekroll/fifa-worldcup-2018-matches)
历史比赛数据(https://www.kaggle.com/martj42/international-football-results-from-1872-to-2017)
国际足联球队排名数据(https://www.kaggle.com/tadhgfitzgerald/fifa-international-soccer-mens-ranking-1993now)
数据预处理
由于数据有限,采用世界杯参赛队历史比赛得分数据和队伍实力排名来反映比赛胜负的关键指标。
筛选参与俄罗斯世界杯参赛队的数据
由于只预测本次世界杯的胜负,所以所有的数据都只包含参赛队的信息。
排名数据
ranking_src = pd.read_csv('F:/worldcup/fifa_ranking.csv',dtype = {'rank_date' : str});
##只筛选俄罗斯世界杯的参赛队
rank = ranking_src[ranking_src['country_full'].isin(team_name['name'])][['rank_date','country_full','rank']]
rank['year'] = rank['rank_date'].str[0:4]
##由于排名数据国际足联若干月都有一份排名,本实验就选取世界杯举办时间最近的时间的排名
tmp_rank = rank[rank['rank_date']
rank_data = rank[ (rank['rank_date'].isin(tmp_rank['rank_date']['amax'])) | ( rank['rank_date'] == '1993-08-08') ]
合并比赛和排名数据
score_src = pd.read_csv('F:/worldcup/results.csv')
##由于排名数据只有1993之后,所以筛选1993之后的数据,同样只筛选俄罗斯世界杯的参赛队
score = score_src[( score_src['home_team'].isin(team_name['name'])) & (score_src['away_team'].isin(team_name['name'])) & (score_src['date'] > '1993-01-01') ]
score = score[['date','home_team','away_team','home_score','away_score']]
score['year'] = score['date'].str[0:4]
##合并数据,把今年的世界杯参赛队数据也合并进来,为了作为预测数据的输入,通过type来区分
##预测指标加工 主队赢为1 ,平为0 客队赢为2
##排名加工成主队和客队的排名差异
##采用get_dummies 函数对分类型数据进行编码
##x为训练集,输入变量
##y为训练集预测变量
模型构建
本实验采用逻辑回归,随机森林和简单人工神经网络三种方法对比。所有模型都采用十折交叉验证取平均。
总体的结果并不是很好,逻辑回归平均预测准确性接近50%,最大为55%。随机森林比较差,可能为数据集太稀疏的原因,抽样的为无用的特征,实验过程中数的数目要比较多才会好点。
预测结果
不管怎么样,先给出预测结果吧。
与实际比较的准确率在62%左右。期待下面几场比赛的结果。
从实际比赛的结果看,预测模型只能从历史数据中获取信息,但是影响一场足球比赛的结果的因素是多样和不确定的。所以会出现历史上的强队【阿根廷】【巴西】等爆冷的情况。可能加入更多因素的考虑模型的效果会更好一点,比如比赛日的天气情况,比赛城市的海拔等。对于球员状态实时的数据在预测时是不可能得到的。
实验结语
本实验『WedO实验君』用python预测是本次俄罗斯世界杯的胜负情况,并对结果进行了简要的解释。接下来的实验『WedO实验君』会针对每天的赛事进行数据的可视化分析,来验证本次实验预测的结果。
领取专属 10元无门槛券
私享最新 技术干货