王瑞華 宋薇
摘要:隨著籃球賽事的廣泛開展,傳統(tǒng)數(shù)據(jù)處理分析已不能滿足籃球運動訓(xùn)練指標(biāo)優(yōu)化和培訓(xùn)狀態(tài)評估需求,制約了籃球數(shù)據(jù)的數(shù)字化管理與發(fā)展進程。本文基于Spark框架與云計算pyspark接口技術(shù)構(gòu)建數(shù)據(jù)計算平臺,通過統(tǒng)計網(wǎng)站與Scrapy抓取框架獲取運動數(shù)據(jù),利用Logistic Distribution與ELO算法實現(xiàn)成績預(yù)測,提高籃球運動大數(shù)據(jù)運算與分析的效率。為運動員、教練員、體育運動管理者提供教學(xué)訓(xùn)練與競賽決策支持。
關(guān)鍵詞:籃球 數(shù)據(jù)分析 Spark ELO
Research on Basketball Performance Prediction Analysis Based on Spark Framework and ELO Algorithm
WANG Ruihua1 ?SONG Wei2
(Hubei Open University,Wuhan,Hubei Province,430074 China; Wuhan Sports University, Wuhan,Hubei Province,430079China)
Abstract:With the extensive development of basketball events, traditional data processing and analysis can no longer meet the needs of basketball training index optimization and training status evaluation, which has restricted the digital management and development process of basketball data. This paper builds a data computing platform based on Spark framework and cloud computing pyspark interface technology, obtains sports data through statistical website and Scrapy grab framework, and realizes performance prediction by Logistic Distribution and ELO algorithm, improving the efficiency of basketball big data operation and analysis. Provide teaching training and competition decision support for athletes, coaches and sports managers.
Key Words: Basketball; Date analysis; Spark; ELO
研究背景
隨著籃球賽事的廣泛開展,傳統(tǒng)數(shù)據(jù)處理分析方法已無法實現(xiàn)籃球運動數(shù)據(jù)的深入挖掘與分析需求,制約了訓(xùn)練指標(biāo)優(yōu)化和運動員訓(xùn)練狀態(tài)評估的數(shù)字化管理進程。籃球運動數(shù)據(jù)分析研究,也因此成為體育統(tǒng)計方向的研究[1]。當(dāng)前籃球運動大數(shù)據(jù)分析存在以下問題。
(1)缺乏對數(shù)據(jù)計算分析平臺與框架的應(yīng)用研究[2]。隨著計算機存儲設(shè)備與運動數(shù)據(jù)采集設(shè)備功能日益強大,籃球運動數(shù)據(jù)存儲量與計算量都在不斷飛速增長,目前的數(shù)據(jù)分析平臺無法滿足籃球運動大數(shù)據(jù)分析需求[3]。
(2)缺乏對深度學(xué)習(xí)建模與機器學(xué)習(xí)算法研究,局限于個別動作數(shù)據(jù)查詢和競技水平統(tǒng)計描述,對數(shù)據(jù)的挖掘與分析不夠深入,無法提供籃球運動信息預(yù)測與策略支持[4]。
(3)缺乏對數(shù)據(jù)可視化技術(shù)的運動訓(xùn)練應(yīng)用研究,當(dāng)前運動數(shù)據(jù)可視化技術(shù)主要應(yīng)用于體育新聞傳播[5],著重娛樂性和趣味性,而用于運動訓(xùn)練領(lǐng)域的可視化工具對人工操作依賴程度較高,因此存在可視化結(jié)果輸出效率低等問題[6]。
研究方法
2.1構(gòu)建Spark大數(shù)據(jù)分析開源計算平臺
Hadoop MapReduce技術(shù)廣泛應(yīng)用于籃球運動大數(shù)據(jù)平臺,但由于MapReduce需要將任務(wù)產(chǎn)生的中間結(jié)果寫回磁盤,需要從網(wǎng)絡(luò)中的各個節(jié)點進行數(shù)據(jù)拷貝,耗費大量的時間在網(wǎng)絡(luò)磁盤輸出過程中。因此Hadoop MapReduce技術(shù)實現(xiàn)大數(shù)據(jù)分析與計算的運算速度有限,只適合離線的數(shù)據(jù)計算任務(wù),從而制約了籃球運動數(shù)據(jù)實時分析與計算。為解決此問題,美國加州伯克利AMPLAB提出基于Hadoop MapReduce開源接口的并行計算框架Spark。Spark框架直接在內(nèi)存中保存中間運行數(shù)據(jù)結(jié)果,因此進一步提高了大數(shù)據(jù)挖掘與分析中的數(shù)據(jù)迭代算法計算效率。如圖1所示,Spark平臺支持多場景的通用大數(shù)據(jù)計算,用于解決批處理與交互查詢等核心問題,數(shù)據(jù)的存儲在生產(chǎn)環(huán)境中由Hadoop分布式文件系統(tǒng)HDFS承擔(dān)。Spark可以從多數(shù)據(jù)源讀取數(shù)據(jù),并且擁有不斷發(fā)展的機器學(xué)習(xí)庫和圖計算庫供開發(fā)者使用。
2.1.1彈性分布數(shù)據(jù)集RDD
為避免計算的中間結(jié)果會被重復(fù)使用,Spark提供了基于RDD cache機制和checkpoint機制來支持容錯。通過將RDD數(shù)據(jù)集的操作結(jié)果緩沖到內(nèi)存中,并直接從內(nèi)存中輸入下一次操作,從而省去了大量Map Reduce磁盤操作,提升了機器學(xué)習(xí)中迭代算法與交互式數(shù)據(jù)挖掘的計算效率。本文以文件形式從Hadoop文件系統(tǒng)生成RDD,通過RDD的to DebugString來查看其遞歸的依賴信息,核心代碼如下:
// 創(chuàng)建RDD
def RDDtextFile(path: String, minSplits: Int = defaultMinSplits): RDD[String] = {
hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable],
classOf[Text], minSplits) .map(pair => pair2.toString) }
// 創(chuàng)建HadoopRDD
new HadoopRDD(this, conf, inputFormatClass, keyClass, valueClass, minSplits)
2.1.2 pyspark接口應(yīng)用
依據(jù)計算需要,Spark內(nèi)核會繪制一張計算路徑有向無環(huán)圖(DAG)?;贒AG圖,Spark內(nèi)核將計算過程劃分成任務(wù)集stage,然后將stage任務(wù)提交到計算節(jié)點實施計算?;赟park框架下Python編程接口pyspark實現(xiàn)python與java的互操作,核心代碼如下:
from pyspark import SparkContext
sc = SparkContext("local", "MyPySparkJob Name", pyFiles=['MyPySparkFile.py', 'MyPySparklib.zip', 'app.egg'])
words = sc.textFile("/user/MyPySparkshare/MyPySparkdict/words")
words.filter(lambda w: w.startswith("spar")).take(5)
2.2.籃球運動數(shù)據(jù)獲取
2.2.1使用統(tǒng)計網(wǎng)站數(shù)據(jù)
獲取Basketball Reference.com網(wǎng)站數(shù)據(jù)[6],包括:每支隊伍平均每場比賽的表現(xiàn)統(tǒng)計;每支隊伍的對手平均每場比賽的表現(xiàn)統(tǒng)計;綜合統(tǒng)2019-2020年NBA常規(guī)賽以及季后賽的每場比賽的比賽數(shù)據(jù)。使用的是以下三個數(shù)據(jù)表格。
Team Per Game Stats:每支隊伍平均每場比賽的表現(xiàn)統(tǒng)計,包括排名、參與場數(shù)、平均比賽時間、投球命中次數(shù)(三分球、二分球、罰球)、投籃次數(shù)、投球命中率、籃板球總數(shù)、助攻、搶斷、封蓋、失誤、犯規(guī)、得分。
Opponent Per Game Stats:所遇到的對手平均每場比賽的統(tǒng)計信息,所包含的統(tǒng)計數(shù)據(jù)與 Team Per Game Stats 中相同,只是代表的是該球隊對應(yīng)的對手的統(tǒng)計信息。
Miscellaneous Stats:綜合統(tǒng)計數(shù)據(jù),包括排名、隊員的平均年齡、勝利次數(shù)、失敗次數(shù)、基于畢達哥拉斯理論計算的贏的概率、基于畢達哥拉斯理論計算的輸?shù)母怕?、(添加)贏球次數(shù)的平均間隔、評判對手選擇與其球隊或是其他球隊的難易程度對比(0為平均線,可以為正負(fù)數(shù))、每100個比賽回合中的進攻比例、每100個比賽回合中的防守比例、48min內(nèi)大概會進行多少個回合、罰球次數(shù)所占投籃次數(shù)的比例、三分球投籃占投籃次數(shù)的比例、二分球、三分球和罰球的總共命中率、有效的投籃百分比(含二分球、三分球)、每100場比賽中失誤的比例、球隊中平均每個人的進攻籃板的比例、罰球所占投籃的比例、對手投籃命中比例、對手的失誤比例、球隊平均每個球員的防守籃板比例、對手的罰球次數(shù)占投籃次數(shù)的比例。
2.2.2基于Scrapy抓取框架與AJAX技術(shù)
AJAX(Asynchronous JavaScript And XML),即使用JS語言與服務(wù)器進行異步交互,傳輸數(shù)據(jù)格式為XML。AJAX除了支持異步交互,另一個特點就是瀏覽器頁面的局部刷新,由于不需要重載整個頁面,不僅提高了性能,還提升了用戶體驗。JSON對象是JS對象的子集,它包含JS中的6種數(shù)據(jù)類型:number、string、Boolean、array、null、object。JSON字符串格式簡單且字符量小,與XML相比在網(wǎng)絡(luò)傳輸方面更具優(yōu)勢。目前,JSON已經(jīng)成為各大網(wǎng)站交換數(shù)據(jù)的標(biāo)準(zhǔn)格式。
基于Python中json模塊,通過json.dumps()方法,可以將python中的基本數(shù)據(jù)類型序列化為一種標(biāo)準(zhǔn)格式的字符串,進而可以存儲或通過網(wǎng)絡(luò)傳輸。通過json.loads()方法,又可以將這些標(biāo)準(zhǔn)格式的字符串反序列化為原數(shù)據(jù)類型。給服務(wù)器發(fā)送用戶輸入的數(shù)據(jù),服務(wù)器將驗證的結(jié)果用JSON格式的字符串發(fā)回響應(yīng),前端用JS來解析JSON數(shù)據(jù)。
Python語言體系使用Scrapy框架技術(shù)來抓取web站點與提取數(shù)據(jù),實現(xiàn)數(shù)據(jù)挖掘與數(shù)據(jù)監(jiān)測。我們采用AJAX技術(shù)獲取球員鏈接的網(wǎng)頁,再基于Scrapy框架進行網(wǎng)絡(luò)數(shù)據(jù)抓取,獲得球員數(shù)據(jù),導(dǎo)出CSV文件代碼如下:
Import requests
Url=”https://cba.hupu.com/teams/shanghai”
Del getHtml(url)
Try:
R=request.get(url)
raise_for_status()
encoding=R.apparent_encoding
Return R.text
Except:
Return ‘’
2.3基于Logistic Distribution與ELo算法實現(xiàn)成績預(yù)測
2.3.1 ELO評分算法
ELO等級分制度是由匈牙利裔美國物理學(xué)家Elo創(chuàng)建的一個衡量各類對弈活動選手水平的評分方法,是當(dāng)今對弈水平評估的公認(rèn)權(quán)威方法,很多競技運動都會采取 Elo 等級分制度對選手進行等級劃分,如足球、籃球與棒球比賽。根據(jù)Logistic Distribution計算 PK 雙方(A 和 B)對各自的勝率期望值計算公式。R_A表示A當(dāng)前的積分,R_B表示B當(dāng)前的積分,E_A表示A當(dāng)前的勝率期望值,E_B表示B當(dāng)前的勝率期望值,計算公式如下:
E_(A=1/(1+〖10〗^(((R_B-R_A))?400) ))
E_(B=1/(1+〖10〗^(((R_A-R_B))?400) ))
S_A表示實際勝負(fù)值(勝為1,平為0.5,負(fù)為0),如果S_A與A當(dāng)前的勝率期望值E_A不相同,則A的Elo評分需要重新計算為R_A^new,計算公式如下:
R_A^new=R_A^old+K(S_A-R_A^old)
其中 K 值是一個常量系數(shù),K值的大小直接關(guān)系到一局競技活動的結(jié)束,通常水平越高的比賽中其K值應(yīng)越小,從而避免少數(shù)幾場比賽就能改變頂級隊伍的積分排名。為讓積分盡可能保持標(biāo)準(zhǔn)正態(tài)分布,將歷史積分值R_A^old分為三個區(qū)間,K分別取值16、24、32。
2.3.2 特征向量提取與回歸模型建立
獲取數(shù)據(jù)后,利用每支隊伍過去的比賽情況和Elo等級分來判斷每支比賽隊伍的可勝概率。在評價到每支隊伍過去的比賽情況時,將使用到Team Per Game Stats、Opponent Per Game Stats和Miscellaneous Stats(以下簡稱為 T、O和M表)這3個表格的數(shù)據(jù),作為代表比賽中某支隊伍的比賽特征。由兩支隊伍的以往比賽統(tǒng)計情況和兩個隊伍各自的Elo等級分構(gòu)成。使用 Python 的pandas、numpy、scipy和sklearn庫Logistic Regression方法建立回歸模型,計算每支比賽隊伍的Elo socre,利用這些基本統(tǒng)計數(shù)據(jù)評價每支隊伍過去的比賽情況,預(yù)測結(jié)果將顯示勝算較大一方的隊伍能夠贏另外一方的概率。研究思路如下。
(1)數(shù)據(jù)初始化,設(shè)置回歸訓(xùn)練時所需用到的參數(shù)變量,從T、O和M表格中讀入數(shù)據(jù),去除一些無關(guān)數(shù)據(jù)并將這三個表格通過Team屬性列進行連接。
(2)獲取每支隊伍的Elo Score等級分函數(shù),當(dāng)在開始沒有等級分時,將其賦予初始base_elo值。
(3)計算每支隊伍的Elo等級分,假設(shè)獲勝方提高的Elo等級分與失敗方降低的Elo等級分?jǐn)?shù)值相等。為了體現(xiàn)主場優(yōu)勢,主場隊伍的Elo等級分在原有基礎(chǔ)上增加100。
(4)基于數(shù)據(jù)內(nèi)容前三項和Elo等級分建立每場比賽的數(shù)據(jù)集。
(5)在main 函數(shù)中調(diào)用這些數(shù)據(jù)處理函數(shù),使用sklearn中的LogisticRegression函數(shù)建立回歸模型。
(6)利用訓(xùn)練好的模型對比賽結(jié)果進行預(yù)測,利用模型對一場新的比賽進行勝負(fù)判斷,并返回其勝利的概率。
(7)在CSV文件中保存預(yù)測結(jié)果。
研究結(jié)果與分析
3.1 球隊贏分概率預(yù)測
使用Python語言中pandas、numpy、scipy和sklearn庫,計算每支NBA比賽隊伍的Elo socre,利用這些基本統(tǒng)計數(shù)據(jù)評價每支隊伍過去的比賽情況,并且根據(jù)國際等級劃分方法Elo Score對隊伍現(xiàn)在的戰(zhàn)斗等級進行評分,最終結(jié)合這些不同隊伍的特征判斷在一場比賽中,哪支隊伍能夠占到優(yōu)勢。預(yù)測結(jié)果將顯示勝算較大一方的隊伍能夠贏另外一方的概率,如表1所示。
結(jié)論
在下一步的研究工作中,為避免計算代價異常增大的突變,將基于Spark框架,進一步探索緩存與廣播技術(shù),提升計算并行度,并通過預(yù)處理降低預(yù)定義類的訓(xùn)練依賴性。本文的研究中給出勝算較大一方的隊伍能夠贏另外一方的概率,由于性能評價數(shù)據(jù)量有限,為實現(xiàn)更加準(zhǔn)確和系統(tǒng)的判斷,需要從統(tǒng)計數(shù)據(jù)網(wǎng)站中獲取更加全面和系統(tǒng)的數(shù)據(jù),并結(jié)合不同的回歸、決策機器學(xué)習(xí)模型,搭建一個更加全面、預(yù)測準(zhǔn)確率更高的模型。為此,建議中國職業(yè)籃球聯(lián)賽(CBA)能順應(yīng)大數(shù)據(jù)時代的發(fā)展趨勢,利用先進的數(shù)據(jù)采集與統(tǒng)計設(shè)備,健全我國籃球運動數(shù)據(jù)統(tǒng)計類型,加強競技運動高階數(shù)據(jù)的統(tǒng)計[7],為球隊組建、教練用人和人才培養(yǎng)提供科學(xué)的指導(dǎo)。
參考文獻
[1]馬振嘉.人工智能在籃球運動中的運用分析[J].延安大學(xué)學(xué)報:自然科學(xué)版,2021,40(1):109-112.
[2]康冬陽,王曉蓉.大數(shù)據(jù)時代背景下洛陽市高校籃球隊建設(shè)的促進研究[J].體育科技,2020,41(6):117-118
[3]高國賢,練碧貞,任弘.大數(shù)據(jù)時代我國籃球運動員選材理論范式危機及路徑轉(zhuǎn)換[J].沈陽體育學(xué)院學(xué)報,2020,39(2):101-107.
[4]張銘鑫,王新雷,練碧貞,等.“全數(shù)據(jù)”驅(qū)動下籃球教練員科學(xué)決策的案例分析——以2018-2019賽季CBA聯(lián)賽廣東男籃為例[J].成都體育學(xué)院學(xué)報,2020,46(6):100-106.
[5]楊瑩,易卓.大數(shù)據(jù)時代下籃球運動的發(fā)展——以銅仁市為例[J].體育世界(學(xué)術(shù)版),2020(3):31-32.
[6]單曙光.籃球大數(shù)據(jù)[M].北京:世界圖書出版公司,2017.99-120.
[7]蔣雪辰,左小五,陳勝,等.基于因子分析和K-Means算法對NBA得分后衛(wèi)的功能性分析[J].體育研究與教育,2020,35(5):73-79.