介绍
在学习过机器学习的美国职业棒球大联盟的球迷们研究之后,我们将美国职业棒球大联盟的投手与投球数据(按球类型,球的移动,球的分配比率和平均球速)进行聚类。
我认为分析本身很粗略,因为它很小。我暂时尝试将理论与编码并行进行,但是我希望它会有所帮助。
集群流程
关键字
粉丝图
由FanGraphs操作的MLB数据站点。
FanGraphs是美国职业棒球大联盟类别数据排行榜中排名最高的,尽管它是美国职业棒球大联盟主要的数据站点,与ballet-reference.com并排。
X均值方法
一种扩展K-means方法的算法。
X均值方法自动估计K均值方法中作为参数所需的分割聚类的数量,K均值方法是用于聚类的标准算法,是一种无监督学习。
UMAP
一种降维方法。比PCA,t-SNE等新的方法。
这是一种在保留信息特征的同时将高维数据转换为低维数据的方法,这次我们将其转换为二维数据,以便可以将其绘制为散点图。
程序
1.从FanGraphs
获取并格式化数据
从此页面获取数据。
作为项目,我们获取了在14至18年的5年内清除了规定的投球时间的每个投手的投球率,平均球速以及垂直和水平球的移动。没有特别的审查,这次我决定将投手聚成一团。
单击数据表右上角的\\"导出数据\\"以完成CSV下载。
数据格式在单位%的数据列中包含字符串
2.通过X均值方法
进行聚类
聚类是通过X-means方法执行的。它已通过名为
1 | $ pip install pyclustering |
最重要的是,Python代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import pandas as pd from pyclustering.cluster import xmeans # CSVロード df = pd.read_csv('pitchers.csv', sep=',') labels = df[['Season', 'Name', 'Team']] data = df.drop(['Season', 'Name', 'Team']) data = data.fillna(0) # 配球割合と球速、ボールムーブと異なる単位のデータを用いるため標準化 ndata = (data - data.mean()) / (data.max() - data.min()) ndata = ndata.fillna(0) # Dataframeをarrayに変換 arrdata = ndata.as_matrix() # クラスタリング開始 init_center = xmeans.kmeans_plusplus_initializer(arrdata, 2).initialize() xm = xmeans.xmeans(arrdata, init_center, ccore=False) xm.process() clusters = xm.get_clusters() |
由于
1 2 | print(len(clusters)) # => 8 |
这次将是8个群集。
3.使用UMAP
进行二维数据转换
使用
由于该库也已在此处实现,请点击
1 | $ pip install umap-learn |
1 2 3 | import umap emb = umap.UMAP().fit_transform(arrdata) |
4.情节
为了方便悬停每个绘制点的信息,请使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import plotly import plotly.graph_objs as go # Jupyter Notebook上でオフラインに表示する場合に入れておく設定 plotly.offline.init_notebook_mode(connected=False) # クラスタ単位で色分けするための設定 colors_map = {} for index, cluster in enumerate(clusters): for item in cluster: colors_map[item] = index colors = list(colors_map.values()) # ラベルデータ作成 labels['Season'] = labels['Season'].astype(str) labels['label'] = labels['Season'].str.cat(labels['Team'].str.cat(labels['Name'], sep='/'), sep='/') # プロット data = [ go.Scatter( x = emb[:,0], y = emb[:,1], mode = 'markers', marker = dict(color = colors, colorscale = 'Jet', colorbar=dict()), text = labels['label'] ) ] plotly.offline.iplot(data) |
看来集群正确完成了,
当您将鼠标悬停时,可以检查"谁在何时,在哪个团队中比赛"的每个点。
顺便说一下,根据这个结果,日本投手田中正宏?岩I久志似乎被归类为投手投球手,同类型的22次大满贯,出现在着名书《钱球》中的蒂姆·哈德森它已被提取。
概要
暂时已成为一种形状。因为您可以在Qiita等上访问诸如"如果您想要
#此外,MLB数据已经准备好,因此它很容易在分析之前准备图像
但是机器学习的关键点是相同的,因此您必须学习几丁质和方法的理论背景。我会正确阅读这本书并将其输入。