閱讀706 返回首頁    go 阿裏雲 go 技術社區[雲棲]


學霸使出機器學習大招,真能贏得10億美金嗎?

導讀:本文為大二學生Adit Deshpande在美國大學生男子籃球錦標賽的開賽前的預測。目前四強已經塵埃落定,雖然Adit放出了機器學習的大招,但是也預測錯了(so sad,獎金泡湯)。正如Adit所說,建模是含有偏見的,而我們能做的是在建模的過程中盡量剔除個人因素,選擇能夠代表全量的數據集。看看Adit的思路,能給我們以後的預測帶來哪些啟發呢?

 
 
 
 
 

 

20170401094028956.jpg

 

3月13日,NCAA“瘋狂三月”的68強球隊名單正式出爐,這也意味著每年NCAA備受矚目的“瘋狂三月”正式拉開序幕。

 

“瘋狂三月”指美國一年一度的大學生男子籃球錦標賽。比賽由68個大學隊組成,采取單場淘汰製。為了贏得總冠軍,一支球隊必須贏得6連勝。

 

比賽分為4個區域。每個地區有17支隊伍,排名從1到17。這個排名由NCAA委員會根據每個球隊的常規賽季表現決定。由17號種子和16號種子先比賽,勝者和一號種子隊伍比,2號種子和15號種子比,以此類推。

 

20170401094039226.jpg

 

賽程安排結束後各個球隊開始積極緊湊的備戰,而球迷就會開始玩Bracket,也就是全國錦標賽的對戰表,球迷可以預測每一輪,每一場,某一支比賽的勝負,填寫bracket已經成為了球迷不成文的習慣和傳統。從數學上講,可以有

263種結果。

 

2014年股王巴菲特出資10億美元獎勵bracket完全預測正確的球迷,隻可惜,近千萬份預測在經過首輪的角逐後有70%都沒辦法全對,最終準確率最高的也熬不過第三輪。

 

作為體育迷,預測比賽的結果是我們的天性。三月瘋狂的魅力來自這樣一個大型的淘汰賽的不可預測性。

 

預測問題

 

在運用機器學習之前,讓我們來想想體育項目的預測,似乎不是很複雜。例如以下這種情況。

 

你作為一個預測者,什麼樣的因素會影響你對比賽結果的判斷?

 

A說:Pats在NFL的統計裏有最好的防守,帶球進攻碼數第四,失誤差第三,他們能贏。

 

B說:100個NFL的ESPN分析師中有72個選擇Pats贏,所以我也選他們。

 

C說: 因為Pats有Tom Brady,而我喜歡他。

 

D說: 我的前女友喜歡底特律獵鷹隊,所以我選Pats。

 

20170401094050307.jpg

 

看看這些回答,你會發現每個人基於自己特殊的感情會在選擇中把不同的特征安排不同的權重。A依賴於常規賽季的統計數據。B考慮到NFL分析師的意見。C表現出個人對Tom Brady的偏愛,導致他/她選擇Pats。D可能從來沒有看過比賽之前,選擇PATS因為一個特定的人。

 

我們都有不同的預測方法,在做決定時會考慮不同的因素,所以我們對體育比賽的預測也有不同的方法。這些不同讓我們在比賽前會有激烈的爭執、可能讓我們沉浸在自己幻想的成功中,或者讓我們重新思考我們的預測過程。

 

但我們所有觀點中的一個共同點就是我們有偏見。我們每個人都有不同的偏見,因為對於“什麼是好的預測”這個問題沒有明確的答案。我們應該看統計數據嗎?應該注意無形資產嗎?我們應該忘記所有這些,僅僅根據個人的感受做出預測嗎?沒有一個簡單的解決方案。

 

所以,我們需要機器學習。

 

機器學習能幫助預測嗎?

 

看看我們是否可以建立一個ML模型,能夠看訓練數據(過去的NCAA籃球比賽),找到一個團隊的成功和他們的屬性(統計)之間的關係,對未來的比賽輸贏做出預測。

 

首先,我們有大量數據。在過去25年的時間裏,有超過100000場NCAA常規賽,我們通常都有很多關於每個賽季球隊的統計數據。因為有所有這些數據,我們可以嚐試使用機器學習來找出贏得比賽的團隊在統計上的特征。如果球隊得分少於60分,他們能贏得比賽嗎?如果一個球隊丟球超過15次,他們會輸給一個護球很好的球隊嗎?這些類型的問題,我們希望數據分析和機器學習可以解答。
 

(所有的分析數據的代碼可以在這找到

https://github.com/adeshpande3/March-Madness-2017/blob/master/March%20Madness%202017.ipynb

 

基礎模型

 

我們的ML模型使用了兩個團隊信息(團隊1,團隊2)作為輸入,然後輸出1隊贏得比賽的概率。

 

20170401094100359.jpg

 

ML算法通常由奇異矩陣或向量的形式輸入。我們需要想辦法把兩個團隊的信息在單個向量中封裝。以2016 Kansas Jayhawks為例。

 

20170401094109674.jpg

 

他們在賽季中表現很好,贏得了第十二次冠軍,在聯賽中是1號種子。我們考慮如何用一個特征來反映他們的賽季。在ML術語中,我們想要采用哪些特征?

 

讓我們從常見的統計開始。

 

常規賽勝數:29

平均每場得分:80

30平均每場得分:67.61

平均每場3的比賽:9.21

場平均失誤數:14.39

每場平均助攻數:18.30

每場平均籃板數:43.73

平均每場搶斷:7.66

 

然後,我們可以考慮其他因素

 

“Power 6”(NCAA的聯賽)表現(Big 12, Big 10, SEC, ACC, Pac-12, Big East):1 Binary Label

常規賽季總冠軍:1 - Binary Label

國際賽冠軍:1 - Binary Label

 

我們再看看更多的度量。

 

簡單評分係統(進度表和平均點差函數):23.87

賽程強度:11.22

 

一些曆史因素。

 

1985以來比賽出場次數:31

1985以來全國錦標賽數:2

 

最後,我們用一個三元標簽描述位置。

 

位置(-1代表球隊1是客場,中立場為0,1代表球隊1是主場):為了反映 2016 Kansas Jayhawks,我們可以將所有因素集成到一個16維的向量。

 

20170401094120191.jpg

 

現在讓我們再看看2016賽季的另一個隊伍the Oklahoma Sooners。

 

20170401094128561.jpg

 

The Sooners,由NBA第一輪選中的Buddy Hield帶領,這個賽季獲得25場常規賽的勝利,成為2號種子。我們可以看看他們的向量。

 

20170401094138285.jpg

 

在NLP中使用深度學習方法team vectors和word vectors相似。在通過RNN或LSTM輸入之前,我們首先必須將我們的句子或短語轉換成可用的表示。

 

由於ML模型通常采取單一的輸入,我們可以把每場比賽設為兩組向量之間的差異(Team 1向量,Team 2 向量)。雖然有些人可能會選擇連接兩個向量,但是取而代之的是有助於強調團隊彼此不相似的方式,這有助於確定對匹配結果有影響的統計數據類型。

 

20170401094147171.jpg

 

我們的模型將采取這個差異向量,並輸出團隊1贏得比賽的概率。

 

我們訓練這種模式的方式是看過去的常規賽的結果,並通過觀察兩個競爭球隊的團隊向量。讓我們看一個實際的訓練例子。

 

Oklahoma和Kansas在2016賽季遇到了兩次。第一次在Kansas的Allen Fieldhous,成為了大學生籃球賽所有賽季中最偉大的比賽之一。

 

20170401094205234.jpg

 

1號種子VS 2號種子,三次加時,是的,那場比賽很激烈。這將是我們訓練數據中的許多比賽之一。這場特殊的比賽會是什麼樣子?

 

20170401094215478.jpg

 

有意義嗎?每個訓練例子的X特征是兩個隊伍向量在那個賽季的差異。訓練的Y特征是[ 1 ]或[ 0 ],代表球隊1贏或球隊2贏。

 

Sports-Reference和Kaggle dataset的常規賽和錦標賽的數據從1993季開始的,從1993到2016,有超過115000場比賽。對於x訓練的維度是115113 x 16,y訓練的維度是115113 x 1。

 

ML算法的應用

 

有訓練集後,我們必須選擇一個ML算法。從簡單的logistic回歸到隨機森林到複雜集成,有各種各樣的模型可以適合我們的任務。當你第一次啟動一個數據集和一個預測任務,總是嚐試一個非常簡單的模型(如線性/ logistic回歸或決策樹或KNN),然後再嚐試更複雜的神經網絡和集成方法。將訓練數據分成訓練集後,我們訓練模型(使用scikit學習功能)並評估測試集。

 

下麵,你可以看到一係列我們的模型的表現。為了確保模型不隻是幸運與簡單的遊戲進行分類,我們在隨機劃分訓練集和測試集評估100次模型,並取平均值。

 

20170401094227425.jpg

 

Gradient Boosted Trees

 

該模型在測試集上獲得了最好的性能。該模型基本上是一種集成的網絡,當你用multiple shallow regression或classification trees,當前樹的建立是基於前麵所有樹的建立的。Gradient Boosted Trees對於異構數據(不同尺度上的數據)非常好,可以檢測非線性特征的相互作用,這在我們的任務中是非常有用的。這種模式的一個有趣的屬性是,我們可以分析每個功能的重要性的整體分類。通過查看每個特征在回歸樹上的位置,我們可以檢查哪些特征在預測中的貢獻最大。

 

20170401094236672.jpg

 

因此正如你所看到的,常規賽季的勝利同球隊是否贏得比賽有很大的關係。直觀地說,它不需要一個先進的ML模型或一個專家分析,球隊有更多的勝利當然更有可能獲勝。

 

然而,有趣的是,看看列表中的後續特性。以下兩個特點是SOS(賽程強度)和位置。SOS也會產生直覺的感覺。即使一個團隊沒有大量的獲勝,但他們本身很厲害,隻是運氣不好碰到了發揮更好的對手,這很有可能的。 比賽場地也是一個眾所周知的影響因素,這是“主場優勢”。

 

下一步

 

76.37%的準確率很高了,但我們能達到80%或85%嗎?這是作為一個ML從業者的一個棘手的部分,沒有一套明確的指導方針來改善你的模型。對於決策樹,可以嚐試增加樹的深度。對於神經網絡,你也可以嚐試新的架構或經典的“隻需添加另一層”的心態。有無窮多個參數你可以試試。

 

我將更多地關注數據的表示和模型本身。這裏有一些調整,可能會產生更好的結果。

 

  • 除了依靠共同的統計特征(PPG,APG,等等),可以嚐試量化專家的意見,球迷投票,或投注線。

  • 使用SVD或PCA降維和模型學習的簡單功能從數據集預測。

  • 考慮比賽結果的曆史信息(12號種子種在第一輪季後賽戰勝5號種子)。

  • 用不同的方式把兩個隊的因素整合到一起(如concantenating,平均,等)。

  • 使用RNN模型,關注時間序列數據。而不是把一個賽季作為一個單一的向量,可以嚐試建模作為一個時間序列的團隊的進展。因此,我們將能夠找出哪些球隊做得特別好。

 

關於ML模型中偏差的討論

 

我現在想花一點時間來解決一個我認為對所有機器學習者來說非常重要的問題,這是訓練集偏見。就像我在文章開頭提到的,當我們談到預測時,我們都是有偏見的。

 

在體育比賽中,我們對隊伍都有自己的偏愛,有時候和統計的結果會有衝突。使用機器學習使我們能夠利用大量的數據與預測任務。然而仍然會有偏見的問題影響我們。

 

偏見影響ML模型的方式是通過我們使用的訓練集。作為ML從業者,我們有意識地決定用哪些訓練數據使用。對於這個特殊的模型,我決定使用1993年以後所有的常規賽季和比賽的比賽數據。我可以決定隻包括最近幾年的數據,或者可以在1993之前查找有關的數據集。

 

在選擇特征時也是同樣的。我可以添加一些如罰球命中率或主場獲勝次數等,但我沒有。我創建的特征是因為我認為,這些是與一個隊伍的勝利最相關的統計數據。

 

這種對數據集和特征選擇的控製意味著我們對模型輸出的責任比我們想象的要多。

 

雖然體育預測隻是一個有趣的任務,有許多領域(醫療保健,法律,保險等)的機器學習模型的結果是非常重要的。我們需要時間來確保我們使用的訓練數據是代表整個人口,不歧視某些人,該模型非常適合訓練集和測試集的大多數例子。

 

ML模型對2017比賽預測

 

對於今年的比賽的預測,我使用Gradient Boosted Classifier model跑了每一輪比賽,並找到較高的概率提前到下一輪的團隊。然後我重複了所有後續回合的過程,結果如下:

 

20170401094246637.jpg

 

寫在最後

 

四強大戰將在42號打響,分別是岡薩加對決黑馬南卡羅萊納,北卡遭遇俄勒岡。祝願明年Adit能改進模型取得勝利!

原文發布時間為:2017-04-01

本文來自雲棲社區合作夥伴DBAplus

最後更新:2017-05-16 11:32:35

  上一篇:go  永不落幕的數據庫注入攻防戰
  下一篇:go  當紅架構Cloud Native,怎麼搭建才能成為上雲助攻手?