大家好,我是野球革命的工程師 LiHsuan,在上一篇文章有提到去年 MLB 在 Baseball Savant 釋出了打者揮棒相關的數據。今天會根據這些新數據,搭配 Driveline 的另一篇文章,使用機械學習技術來透過這些數據幫打者分類。並且試試看能不能也看中職打者分別被分在哪一類。這次的文章內容可能會需要點機械學習知識才比較好閱讀,不過我也會盡量能用比較好懂的方式介紹,希望能讓大家有更多認識。
- 上篇文章:https://blog.rebas.tw/articles/3056
- 參考文章:Using MLB Bat Tracking Data to Better Understand Swings – Driveline Baseball
MLB 揮棒追蹤數據 (Bat Tracking Data)
首先先來介紹 Savant 上面有哪些揮棒相關的數據,這次使用到的兩個重要數據分別是 揮棒速度 (Bat Speed) 以及 揮棒軌跡長度 (Swing Length),文章裡會選用這兩項數據的原因我自己解讀是:
- 最直接的揮棒物理數據,不需要其他多餘的計算,讓球迷更快理解
- 可以利用物理公式延伸到後面會介紹到的 Blast Metrics 揮棒數據
其他還有像是 Fast Swing Rate、Blasts、Swords 等進階數據,不過這次的文章不會使用到這些進階數據,大家有興趣的話可以在大聯盟的官方數據介紹有更詳細解釋。
運用機械學習的分群演算法為打者分類
確定好使用的數據後,我們可以利用 散布圖 (Scatter Plot) 來看資料的分布,這邊我們使用 揮棒速度 當作 X 軸,揮棒軌跡 當作 Y 軸來畫,會有以下的結果 (來源為 Baseball Savant 揮棒追蹤數據排行頁):

通常我們可以畫出 X 軸數據與 Y 軸數據的平均線,來看哪些打者
- 揮棒速度與軌跡皆高於聯盟平均
- 揮棒速度低於聯盟平均、揮棒軌跡高於聯盟平均
- 揮棒速度高於聯盟平均、揮棒軌跡低於聯盟平均
- 揮棒速度與軌跡皆低於聯盟平均

這樣子是最快找到差異的方法之一,不過我們也可以看到,資料的分布不一定均勻,會可能有幾個離群值,或是很多資料都在平均附近。因此,如果我們想讓我們的分類更準確,就可以使用機械學習來幫助我們。
在 Driveline 的文章中,他們使用了一個叫做 K-means clustering 的聚類演算法,來對資料進行分群 (Clustering),藉此來找到資料中,最適合的族群。
簡單介紹 K-means 演算法,他會有以下步驟:
- 一開始會指定要把資料分成 K 群,然後就會先隨機產生 K 個聚類中心
- 開始計算各資料與聚類中心的距離,把資料分配到距離最近的聚類中心
- 把同一群計算平均產生新的聚類中心
之後就是反覆執行 2 跟 3 的步驟,直到聚類中心的位置不再變動為止,有點像是我們找一個圖形的重心點的感覺。
這個演算法有幾個優點,一個是算法好理解,基本上就是算資料與中心的距離,反覆操作。再來就是他執行速度很快,缺點的話是因為每次一開始的中心點都是隨機的,不同的起始點很容易讓每次的結果浮動,可能需要多執行幾次驗證,不過這次自己實際操作的結果我覺得缺點影響不大,這通常會看資料集的資料分布情況。
參考閱讀:學習如何應用K-means進行非監督學習 – iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
實際使用 2024 大聯盟打者數據,進行跟 Driveline 文章裡一樣的操作把打者分成 4 群的結果後結果會如下圖:

可以看到 4 顆黑色比較大的點,就是我剛剛介紹的聚類中心,剩下的是打者資料,會用 4 種不同的顏色分成 4 個群組,分別為:
- 橘色:揮棒速度快、軌跡長
- 綠色:揮棒速度慢、軌跡短
- 藍色:揮棒速度平均、軌跡短
- 紅色:揮棒速度平均、軌跡長
會發現其實跟一開始分成四個象限的群組分布情況雖然稍有不同但差距不大,這時候我們可以有幾種方式來產生變化:
- 增加使用的數據
- 增加要分類的群組數量 (就是 K 值)
在 Driveline 的文章中,他們是兩個同時進行,多加了兩個數據 揮棒加速度 (Swing Acceleration) 跟打者 擊中球的時間 (Time to Contact),並把資料分成 6 群,接下來我會照著他們的方式繼續實作,不過通常我們在使用 K-means 的時候會使用像是 手肘法 (Elbow method) 的方式進行群數的選取。大家自己在試的時候可以試試看。
Blast Metrics
在進一步使用機械學習繼續分析前,要來介紹他們新加入的揮棒加速度與擊中球時間,會使用這兩個數據的原因,是 Driveline 平常在訓練的時候,會使用 Blast Motion 這個工具,對打者進行檢測,這兩項數據就會是他們常看的數據,另外他們也跟揮棒速度與揮棒軌跡一樣,是很直接的物理數據,我們甚至可以用物理公式去推導出他們之間的關係,利用加速度公式,把揮棒速度當成速度 v,揮棒軌跡當成移動距離 Δx。在假設初始速度 v0 是 0 的情況下,並且揮棒的環境都是一樣的情況下,就能推出 揮棒加速度 a,以及 擊中球的時間 t。

最後結果會變成 (常數為單位轉換所產生):
- 揮棒加速度 = 0.03343 x ( 揮棒速度的平方 / 揮棒軌跡 )
- 擊中球時間 = 1.3636 x ( 揮棒軌跡 / 揮棒速度的平方)
這樣就算不用裝 Blast,也能透過揮棒速度與揮棒軌跡去算加速度與花費時間,並用這算出來的數據,進一步使用機械學習來幫打者分類。
在加入新的數據後,並且把資料增加到分成 6 群,結果會如下:

因為多分了兩組出來,原本四種的打者會變成六種,分別為:
- 綠色:揮棒速度最快、軌跡最長,但因為軌跡長擊中球的時間稍長。在 Driveline 的整理下,這群組能有效率地把揮棒速度產生出力量而獲得好的打擊結果,但也可能造成相對高的揮空率。代表打者:Aaron Judge, 大谷翔平
- 藍色:揮棒速度次高、軌跡較短,有更快的揮棒加速度與更少的擊中球花費的時間。這類型的打者的擊球效率能發揮最好,有夠快的揮棒速度,跟在平均的揮棒軌跡長度,但這群組裡也可能會因為把球帶太近來 (軌跡短的原因) 而產生比較不好的打擊結果。代表打者:Juan Soto, Bobby Witt Jr.
- 紅色:相對平均的群組,各個數據都比較靠近聯盟平均,聯盟大多數的打者都在這裡面。在 Driveline 的文章裡認為在這類別中,表現好的打者通常都是拉打好的打者。代表打者:Kyle Tucker, Christian Bethancourt
- 紫色:揮棒速度較低、軌跡最短,在這群組表現好的球員,擊球技巧十分優秀,擁有最低的揮空率,但跟藍色組一樣,有可能會帶太近來而缺少長打,實際上統計結果也是純長打率次低的族群。代表打者:Luis Arraez, Mookie Betts
- 橘色:揮棒速度較低、軌跡最長,這類型的打者能做好強力的拉打,產生長打,而表現差的打者會因為最長的揮棒軌跡,產生高的揮空率且無法確實擊球。代表打者:Cody Bellinger, Marcus Semien
- 棕色:揮棒速度最低、軌跡最短,通常分在這類的打者打擊成績都相對不佳,只有少數人因為良好的擊球技巧,能有好成績。代表打者:Charlie Blackmon, Nicky Lopez
以上是整合 Driveline 裡的文章,跟我一些自己的解讀的結果,也附上文章中整理的打擊數據比較在下方:

運用大聯盟分類結果來推測中職打者屬於什麼類別
分好了大聯盟打者,接下來,我想透過剛剛的分組來看能不能也幫中職打者們進行相同的分類。一樣會用使用機械學習幫助我們,步驟如下:
- 取得大聯盟打者的 (wOBA, Whiff%, 打擊率 (BA), ISO) 當作訓練資料 (Training data),以及剛剛得到的分類編號 (1-6) 當作我們的標註 (Label)
- 將訓練資料進行標準化 (Standardization),讓各欄位的資料比例保持一致性。
- 把獲得的資料丟進監督式機械學習中的分類演算法 (Classification Algorithms) 計算,這次使用的分類演算法是 隨機森林 (Random Forest) 訓練出機械學習模型 (Model) 。基於篇幅問題就先不做演算法介紹,有興趣的可以用關鍵字去搜尋。
- 從野球革命官網的 2024 中華職棒例行賽排行頁 (打席數 > 55) 裡取得剛剛的訓練資料欄位 (wOBA, Whiff%, 打擊率, ISO) 後餵给剛剛訓練出來的結果,獲得機械學習推測出的中職打者分類。
最後結果會如下:
- 綠色:張育成、陳子豪、吉力吉撈.鞏冠
- 藍色:林安可、朱育賢、蔡佳諺
- 紅色:王正棠、陳傑憲(偏紫)、王柏融(偏藍)
- 紫色:江坤宇、董子恩、郭天信
- 橘色:吳念庭、林子偉、郭阜林
- 棕色:葉子霆、張祐銘、林哲瑄
不知道這些最後分出來的類型,有沒有符合大家的印象。老實說,我實際跑訓練模型的時候,大聯盟數據的推測準確率大概只有 25 – 30% 左右 (會把原本的大聯盟訓練資料分成訓練組 (80%) 與驗證組 (20%) 來看模型準不準確),更不用說中職打者的分類是用去年現有的數據回推的,所以最後關於中職打者的分類可以先當個參考就好,不知道大家依照這些分組,會有哪些球員的印象呢,也歡迎一起來討論。
在沒有實際的物理數據下,單靠機械學習推測還是滿難分的,不然就是要再多花時間去調整訓練模型。另外還有就是使用的特徵欄位是不是真的有相關性,wOBA, Whiff%, 打擊率, ISO 這四個數據跟揮棒追蹤數據是否真的有重要性,也是需要再去研究的,甚至一開始使用的資料量也許也有其他討論空間。還有就是演算法的選用,這次使用的都是可以快速出現結果的類型,或許可以選用其他的演算法來增加準確度,這也是資料分析困難與有趣的地方。
總結
選手的分類一直以來都是一個很有趣的話題,像是選秀的時候會有模板,或是我們在看球的時候會聽到球評分析球員是什麼類型的選手,這讓我們可以更快了解某一位選手。這次使用揮棒追蹤數據,希望可以用不同的角度去分類球員,我覺得也是一個有趣的研究,可惜中職還尚未有公開的揮棒物理數據可以使用,少了一些特徵去評估。
除了打者的分類,投手同樣的也可以進行分類,像是我之前參加棒球數據競賽就有使用投手使用的球種比例,一樣使用 K-means 演算法進行分類,也滿有趣的,有機會的話大家也可以試試看不同可能。不過也想說,機械學習並不是萬能的,會需要反覆驗證與嘗試,才能找到最佳的解法。
這次的文章內容可能偏程式演算法相關一點,不是那麼好理解,但還是感謝大家耐心地看完。Driveline 的文章其實還有一些延伸,但我後來想實作看看中職的分類部分所以就沒有全部翻完,如果有想更完整的認識歡迎找我們討論。不知道大家對這類型的文章有什麼看法,也歡迎在我們粉絲專頁留言。連兩篇都在介紹打擊相關,如果還有下一篇應該會來找找跟投球或捕手相關的文章來介紹。