預測30系列Python中的高校籃球得分
再次在辦公室的March Madness游泳池中完成最後一次?金毛獵犬或你鄰居的女兒的寵物搖滾選擇了比你更好的支架嗎?創造一個勝利的支架是很難的,甚至絆倒大學籃球的專家分析師。而不是讓猜測工作每個賽季都有命運或觀看數千小時的籃球(我想無論如何我都是這樣做的,但那不是重點),為什麼不訓練一臺電腦為你做預測呢?
在Python和一些很棒的庫的幫助下,你可以構建自己的機器學習演算法,用不到30行程式碼預測NCAA Men's Division-I College Basketball遊戲的最終得分。本教程旨在解釋建立機器學習應用程式所需的所有步驟,包括設定,資料檢索和處理,培訓模型以及列印最終預測。
要學習本教程,強烈建議您對Python有基本的瞭解,但不是必需的。瞭解匯入模組,獲取和設定變數,字典和例項化類的目的是一個很好的基礎,而使用經驗Pandas
andsklearn
is a huge plus.
現在我們已經設定了開發環境,讓我們開始構建實際的應用程式。
對於那些喜歡直接跳到程式碼的人來說,上面的要點是我們將要使用的最終程式。如果你已經熟悉了pandas
andsklearn
,您可以跳到本教程的底部,瞭解該程式的執行方式以及如何擴充套件它以獲得更高的準確性,更快的執行時間和更高的可用性。對於其他想要進一步解釋此程式碼的人,請繼續閱讀下面的內容,瞭解每個步驟的目的。
幾乎每個Python程式都以一個開頭import
包含所需依賴項的部分,稍後將在模組中使用。對於這個專案,我們需要匯入我們之前安裝的以下包:
沒有資料集,任何機器學習應用程式都不會完整。為了幫助我們預測NCAAB比賽的最終得分,我們想要建立一個包含所有單個比賽統計資料的資料集(例如投籃命中率,失誤數和蓋帽次數,反彈率等等),然後我們可以使用這些資料來預測這些因素如何與最終得分相關聯。
要建立此資料集,我們首先需要初始化一個空資料集Pandas DataFrame
我們將用於儲存我們的最終資料。接下來,我們初始化Teams
class fromsportsreference
其中包含當前或最近一個賽季NCAA男子組的每個籃球隊的資訊,並允許我們輕鬆地逐個佇列地獲取統計資料。
在提取資料之前,我們需要通過執行來遍歷每個團隊for team in teams:
每次迭代都對應聯盟中一支獨特的球隊。sportsreference
公開每個團隊的日程安排和箱子評分資訊,使我們能夠編寫類似的程式碼team.schedule.dataframe_extended
它為團隊在當前賽季參加的每場比賽收集每場比賽的統計資訊。該dataframe_extended
屬性返回一個pandas DataFrame
每個索引對應一個不同的遊戲。
在收集每個遊戲的盒子比分資訊後,我們希望將其新增到我們的整體資料集中,以便我們擁有一個單一的資料來源。這可以通過將我們現有的資料集與本地資料集連線來完成DataFrame
包含當前團隊的完整箱子比分資訊。通過用結果連線覆蓋我們現有的資料集,我們確保資料集不僅包括最近團隊的資訊,還包括之前查詢過的所有團隊的資訊。
在我們的資料集完成構建之後,我們需要過濾掉幾個類別(或features
因為它們經常在機器學習中被稱為我們不想使用的資料集 - 即那些有的string
type (orcategorical
)喜歡球隊名稱或日期和地點。有時,基於字串的特徵可能是有用的,例如在預測房屋價值的情況下,並且確定列為“海濱”的房產具有比分類為“內陸”的房產更高的價值。雖然此功能對房價預測很有用,但大多數機器學習演算法無法處理基於字串的資料。稱為替換這些型別的特徵的一種方法one-hot encoding
它使用唯一的特徵列自動替換類似的分類值,其中屬於該特徵的每個索引的值都為1,否則為1。通過將類別更改為1和0,機器學習演算法能夠更有效地處理這些功能。
然而,出於我們的目的,我們將簡單地刪除這些功能,因為它們要麼太多(即可能在遊戲中播放的可能場所很大),沒有意義(它不應該really 無論是在11月18日還是12月2日根據統計資料確定比賽結果,或者會引入偏見(我們希望演算法根據球隊的比賽來確定最終得分 - 不僅因為他們的名字是“杜克”) “)。因此,我們將刪除所有這些類別。
在這一點上,有些人可能想知道為什麼我包括在內home_points
andaway_points
在要刪除的欄位列表中。這兩個欄位是最終輸出(通常稱為labels
)我們想要預測,所以我們不希望它們包含在我們的主要功能中,而應該專門為我們的輸出標籤保留它們。
單步執行上面的程式碼,我們首先從資料集中刪除所有不需要的功能,並將修剪後的輸出儲存為X
。刪除未使用的功能後,我們接下來刪除所有不完整資料的行。如果資料沒有在sports-reference.com上正確填充,或者團隊沒有執行某些統計操作,例如沒有阻擋投籃或罰球,有時會發生這種情況。我們可以通過兩種方法處理這些不完整的資料,方法是設定缺失值和設定數(例如類別的平均值或預設為零)或刪除任何無效的行。由於我們的資料集中無效單元格的數量非常少,因此我們將刪除任何具有不完整資料的行,因為它不會影響我們的最終結果。
因為探戈需要兩個(錯誤,兩個參賽隊伍可以參加比賽),所以每個比賽都會有一個副本,因為兩個球隊的賽程都被拉出來(一次是主隊,一次是客隊) 。這只是汙染我們的資料集,並沒有提供任何值,因為行完全相同,所以我們想要刪除任何副本並保留每個遊戲的一個例項。為此,我們只需新增drop_duplicates()
到我們的資料集,以確保每個索引都是唯一的。
接下來,我們需要建立輸出標籤,用於在訓練時確定模型權重的準確性,並測試最終演算法的準確性。我們可以通過建立一個僅包含主點和離點的兩列向量來生成我們的標籤,並將結果設定為y
.
最後,通常的做法是將資料集拆分為訓練和測試子集,以確保訓練有素的模型是準確的。理想情況下,我們希望使用大約75%的資料集進行培訓,並保留剩餘的25%進行測試。應隨機採用這些子集以防止模型偏向於特定的資訊集。在使用訓練資料集訓練模型之後,應該針對測試資料集執行模型以確定模型的預測效能並檢視其是否過度擬合。
Luckily,sklearn
有一個內建函式,將為我們建立這些子集。通過餵養我們的X
andy
frames intotrain_test_split
,我們能夠檢索具有預期分割的訓練和測試子集。
現在我們的資料集已經處理完畢,是時候建立和訓練我們的模型了。我決定用一個RandomForestRegressor 對於這個例子,由於演算法的易用性和相對準確性以及與標準決策樹相比減少過度擬合的適當處理。隨機森林演算法建立了幾個決策樹,其中一些隨機性被注入到特徵權重中。然後將這些決策樹組合起來建立一個森林(因此arandom forest of decisiontrees )在訓練,驗證或推斷時用於最終分析。該演算法支援兩者classification as well asregression ,使其適用於各種應用。
分類確定屬於固定數量類別的輸出標籤,例如學生在測試中收到的字母等級(“A”,“B”,“C”,“D”或“F”)。只能有五個類別(或classes ),因此模型只會嘗試將輸出放入這五個類別中的一個。另一方面,迴歸確定可以採用無限期值的輸出標籤,例如房屋的價格。雖然房價往往會有一系列標準房價,但房屋的價格沒有限制,任何正數都是有效的。由於籃球比賽的最終得分在技術上可以是任何正數(或零!),我們希望使用迴歸。
在我們構建和訓練模型之前,我們首先需要設定一些模型hyperparameters 。超引數是在訓練之前輸入到模型的引數,並且影響它的構建和優化方式。對於機器和深度學習領域的大多數初學者來說,這些引數往往是最大的障礙,因為這些設定通常沒有“完美”的價值,如果有的話,它可能會讓人難以確定應該放什麼。
一般的經驗法則是最初堅持使用這些超引數的預設值,然後一旦模型被訓練並完成並且您能夠測試它,就開始使用反覆試驗方法調整值,直到您滿意為止最後的結果。對於我們的模型,我選擇了六個不同的超引數,並找到了這組特定的值,以提供效能和準確性之間的最佳平衡。有關這些特定設定的更多詳細資訊,請參閱官方scikit-learn文件 .
選擇我們的超級演算法後,終於可以建立我們的模型了。首先,我們需要例項化RandomForestRegressor
我們之前匯入的類,包括我們的超引數。通過使用(**parameters)
,我們將字典的鍵值對擴充套件為類的命名引數,該引數在功能上與以下內容相同:
現在我們的模型已經例項化了,剩下的就是訓練它。sklearn
通過包含,使這變得非常容易fit
method withRandomForestRegressor
,所以我們只需要使用輸入功能和相應的輸出標籤來執行它。這個方法就地執行,所以我們的model
變數現在將自動指向我們可用於預測的訓練模型!
我們的應用程式的最後一步是針對我們的測試子集執行預測,並將它們與我們的預期結果進行比較。該列印語句將預測結果以及我們的實際預期結果輸出為兩個不同的兩列向量。
最後,我們一直在等待的那一刻!我們的應用程式現已完成,我們剩下的就是執行演算法。我命名了我的程式ncaab-machine-learning-basic.py
,所以我只需要執行以下命令來啟動演算法:
Please note that該計劃可能需要很長時間
to complete
因為大部分處理時間用於為Division-I College Basketball中的所有350多個團隊構建資料集。如果您只是想檢視一個有效的演算法,可以通過新增一個來提前停止資料建立break
資料連線行後的第一個迴圈中的語句。
一旦程式完成,它將輸出類似於以下內容的東西(我減少了行數以節省空間):
此輸出包含兩個部分:預測輸出後跟預期輸出。一切都來自array([[86, 86]
to[68, 65]])
是預測的輸出array([[83, 89]
to[66, 65]])
是實際資料。如前所述,第一列是指預期的點數home
球隊將得分,第二列是預計得分away
team.
預測輸出中的行也與預期輸出中的行匹配,因此[86, 86]
correlates with[83, 89]
等等。如果我們比較列表,我們會發現我們的預測並不太糟糕!在大多數情況下,預計得分僅與實際結果相差幾個點。另一個有希望的跡象是,當實際得分與大約70分的典型結果不同時,我們的演算法能夠識別差異併產生高於或低於正常的分數。
如果這是您的第一個機器學習計劃,恭喜!希望本教程足以讓您入門並展示基本的機器學習應用程式不需要多年的教育或數千行程式碼。
雖然這個程式是一個很好的開始,但我們有很多方法可以擴充套件它以使其更好。以下是我將對應用程式進行的一些改進,以提高效能,準確性和可用性:
現在您已經有了一個有效的應用程式,請嘗試實施其中一些建議,以提高模型的準確性和效能。如果您生成一個您滿意的模型,您可以使用它來為NCAA錦標賽或可能建立預測enter a competition .
雖然擊敗金毛獵犬或莎莉的寵物搖滾仍然很難,但這種演算法可能會讓你在今年的公司游泳池中獲得競爭優勢。為什麼不在今年3月份yours 吉姆來自會計?