用機器學習預測誰將奪得世界杯冠軍?附完整代碼!

來源: sangang 2018-06-20 12:48:42 [] [博客] [舊帖] [給我悄悄話] 本文已被閱讀: 次 (55732 bytes)

2018 年 FIFA 世界杯即將拉開帷幕,全世界的球迷都熱切地想要知道:誰將獲得那夢寐以求的大力神杯?

如果你不僅是個足球迷,而且也是高科技人員的話,我猜你肯定知道機器學習和人工智能也是目前的流行詞。

讓我們結合兩者來預測一下本屆俄羅斯 FIFA 世界杯哪個國家將奪冠。

這裏寫圖片描述

免責聲明:請不要以本文為依據投注或做財務決定。如果你非買不可的話,我也沒法阻止你,隻是如果你中了大獎的話,別忘了我哦:)

以下為譯文:

足球比賽涉及的因素非常繁多,我無法將所有因素都融入機器學習模型中。本文隻是一個黑客想用數據嚐試一些很酷的東西。本文的目標是:

  • 用機器學習來預測誰將贏得2018 FIFA世界杯的冠軍;
  • 預測整個比賽的小組賽結果;
  • 模擬四分之一決賽、半決賽以及決賽。

這些目標代表了獨一無二的現實世界裏機器學習的預測問題,並將解決機器學習中的各種任務:數據集成、特征建模和結果預測。

數據

我采用了兩個來自 Kaggle 的數據集,我們將使用自 1930 年第一屆世界杯以來所有參賽隊的曆史賽事結果。

FIFA 排名是於 90 年代創建的,因此這裏缺失很大一部分數據,所以我們使用曆史比賽記錄。點擊以下鏈接獲取所有數據 :

https://www.kaggle.com/martj42/international-football-results-from-1872-to-2017/data

本文中主要使用的環境和工具有:jupyter notebook、numpy、pandas、seaborn、matplotlib 和 scikit-learn。

首先,我們要針對兩個數據集做探索性分析,然後經過特征工程來選擇與預測關聯性最強的特征,還有數據處理,再選擇一個機器學習模型,最後將模型配置到數據集上。

讓我們開始動手吧!

首先,導入所需的代碼庫,並將數據集加載到數據框中:

這裏寫圖片描述

導入代碼庫:

這裏寫圖片描述

下一步是加載數據集。通過調用 world_cup.head() 和 results.head() ,務必將兩個數據集都加載到數據框中,如下所示:

這裏寫圖片描述

探索性分析

在分析了兩組數據集後,所得的數據集包含了以往賽事的數據——這個新的(所得的)數據集對於分析和預測將來的賽事非常有幫助。

探索性分析和特征工程:需要建立與機器學習模型相關的特征,在任何數據科學的項目中,這部分工作都是最耗時的。

現在我們把目標差異和結果列添加到結果數據集:

這裏寫圖片描述

檢查一下新的結果數據框:

這裏寫圖片描述

然後我們著手處理僅包含尼日利亞參加比賽的一組數據(這可以幫助我們集中找出哪些特征對一個國家有效,隨後再擴展到參與世界杯的所有國家):

這裏寫圖片描述

第一屆世界杯於 1930 年舉行。我們為年份創建一列,並選擇所有 1930 年之後舉行的比賽:

這裏寫圖片描述

現在我們可以用圖形表示這些年來尼日利亞隊最普遍的比賽結果:

這裏寫圖片描述

每個參加世界杯的國家的勝率是非常有幫助性的指標,我們可以用它來預測此次比賽最可能的結果。

比賽的舉行地點無關緊要。

鎖定參加世界杯的隊伍

我們為所有參賽隊伍創建一個數據框:

這裏寫圖片描述

然後從該數據框中進一步篩選出從 1930 年起參加世界杯的隊伍,並去掉重複的隊伍:

這裏寫圖片描述

為年份創建一列,去掉 1930 年之前的比賽,並去掉不會影響到比賽結果的數據列,比如 date(日期)、home_score(主場得分)、away_score(客場得分)、tournament(錦標賽)、city(城市)、country(國家)、goal_difference(目標差異)和 match_year(比賽年份):

這裏寫圖片描述

為了簡化模型的處理,我們修改一下預測標簽。

如果主場隊伍獲勝,那麽 winning_team(獲勝隊伍)一列顯示“2”,如果平局則顯示“1”,如果是客場隊伍獲勝則顯示“0”:

這裏寫圖片描述

通過設置啞變量(dummy variables),我們將 home_team(主場隊伍)和away _team(客場隊伍)從分類變量轉換成連續的輸入。

這時可以使用 pandas 的 get_dummies() 函數,它會將分類列替換成一位有效值(one-hot,由數字‘1’和‘0’組成),以便將它們加載到 Scikit-learn 模型中。

接下來,我們將數據按照 70% 的訓練數據集和 30% 的測試數據集分成 X 集和 Y 集:

這裏寫圖片描述

這裏我們將使用分類算法:邏輯回歸。這個算法的工作原理是什麽?該算法利用邏輯函數來預測概率,從而可以測量出分類因變量與一個或多個自變量之間的關係。具體來說就是累積的邏輯分布。

換句話說,邏輯回歸可以針對一組可以影響到結果的既定數據集(統計值)嚐試預測結果(贏或輸)。

在實踐中這種方法的工作原理是:使用上述的兩套“數據集”和比賽的實際結果,一次輸入一場比賽到算法中。然後模型就會學習輸入的每條數據對比賽結果產生了積極的效果還是消極的效果,以及影響的程度。

經過充分的(好)數據的訓練後,就可以得到能夠預測未來結果的模型,而模型的好壞程度取決於輸入的數據。

讓我們看看最終的數據框:

這裏寫圖片描述

看起來很不錯。現在我們將這些數據傳遞到算法中:

這裏寫圖片描述

我們的模型子訓練數據集的正確率為 57%,在測試數據集上的正確率為 55%。雖然結果不是很好,但是我們先繼續下一步。

接下來我們建立需要配置到模型的數據框。

首先我們加載 2018 年 4 月 FIFA 排名數據和小組賽分組狀況的數據集。由於世界杯比賽中沒有“主場”和“客場”,所以我們把 FIFA 排名靠前的隊伍作為“喜愛”的比賽隊伍,將他們放到“home_teams”(主場隊伍)一列。然後我們根據每個隊伍的排名將他們加入到新的預測數據集中。下一步是創建默認變量,並部署機器學習模型。

2018 年 4 月 FIFA 排名數據:

https://us.soccerway.com/teams/rankings/fifa/?ICID=TN_03_05_01

小組賽分組狀況的數據集:

https://fixturedownload.com/results/fifa-world-cup-2018

比賽結果預測

到這裏你可能在想我們究竟什麽時候開始預測啊?看了這麽多代碼和嘮叨,究竟什麽時候才給我們看預測結果?別著急,我們馬上就要開始了……

將模型部署到數據集中

首先,我們將模型部署到小組賽中:

這裏寫圖片描述

以下是小組賽的結果:

這裏寫圖片描述

該模型的預測中出現了三場平局,並且獲勝隊伍會在葡萄牙和西班牙之間,且判定西班牙有更高的獲勝概率。我使用該網站(https://ultra.zone/2018-FIFA-World-Cup-Group-Stage)模擬了小組賽。

以下是 16 強淘汰賽的模擬:

這裏寫圖片描述 
這裏寫圖片描述

模型預測的四分之一決賽——葡萄牙vs法國,巴西vs英格蘭,西班牙vs阿根廷,德國vs比利時。

下麵是結果預測:

這裏寫圖片描述

半決賽的陣容是——葡萄牙vs巴西,德國vs阿根廷。

結果預測:

這裏寫圖片描述

最後的冠軍比賽是——巴西vs德國。

結果預測:

這裏寫圖片描述

根據該模型,巴西將有可能獲得本屆世界杯的冠軍。

進一步的研究和提高領域

為提高數據集的質量,可以利用 FIFA 的比賽數據評估每個球員的水平;

混淆矩陣可以幫助我們分析模型預測的哪場有誤;

我們可以嚐試將多個模型組合在一起,提高預測準確度。

寫在最後

我們可以從很多方麵的工作來提高該預測,接下來就讓我們來看看真正的比賽結果是否如此啦。

點擊此處獲取完整的代碼:

https://github.com/itsmuriuki/FIFA-2018-World-cup-predictions

最後的聲明:我不是資深球迷,所以請自行承擔預測的風險。

 

所有跟帖: 

看不見圖,是不是和這個差不多? -得瑟一下- 給 得瑟一下 發送悄悄話 (346 bytes) () 06/20/2018 postreply 12:52:39

最後葡萄牙和阿根廷,C羅和梅西大比拚,哈哈 -令狐衝衝- 給 令狐衝衝 發送悄悄話 令狐衝衝 的博客首頁 (169 bytes) () 06/20/2018 postreply 12:59:49

讓梅西踢點球,派C羅守門。。。 -火頭- 給 火頭 發送悄悄話 火頭 的博客首頁 (0 bytes) () 06/20/2018 postreply 13:05:53

…………“(^_^)v -令狐衝衝- 給 令狐衝衝 發送悄悄話 令狐衝衝 的博客首頁 (163 bytes) () 06/20/2018 postreply 13:08:08

與我賽前預測的比利時決賽贏法國而奪冠有點兒差距啊。。。 -鋤禾日當午2004- 給 鋤禾日當午2004 發送悄悄話 (1028 bytes) () 06/20/2018 postreply 13:00:06

章魚,海帶,貓啊狗啊,五花八門,咋測的都有 -板凳球迷- 給 板凳球迷 發送悄悄話 (0 bytes) () 06/20/2018 postreply 13:41:43

要都中了,可以拿著這個找工作或者投資者。 -作業本- 給 作業本 發送悄悄話 作業本 的博客首頁 (0 bytes) () 06/20/2018 postreply 14:17:57

每隔四年才一屆杯賽,這數據的Sample還是太小。而且1990年前的足球和現在足球很多戰術也不大相同! -leonardo2025- 給 leonardo2025 發送悄悄話 (0 bytes) () 06/21/2018 postreply 00:12:57

我特麽還是在家拜拜財神吧。 -palmdodo- 給 palmdodo 發送悄悄話 palmdodo 的博客首頁 (169 bytes) () 06/21/2018 postreply 08:33:20

請您先登陸,再發跟帖!

發現Adblock插件

如要繼續瀏覽
請支持本站 請務必在本站關閉/移除任何Adblock

關閉Adblock後 請點擊

請參考如何關閉Adblock/Adblock plus

安裝Adblock plus用戶請點擊瀏覽器圖標
選擇“Disable on www.wenxuecity.com”

安裝Adblock用戶請點擊圖標
選擇“don't run on pages on this domain”