[Python]机器学习初学者聚集了MLB投手


介绍

在学习过机器学习的美国职业棒球大联盟的球迷们研究之后,我们将美国职业棒球大联盟的投手与投球数据(按球类型,球的移动,球的分配比率和平均球速)进行聚类。
我认为分析本身很粗略,因为它很小。我暂时尝试将理论与编码并行进行,但是我希望它会有所帮助。

集群流程

  • 从FanGraphs获取数据
  • 通过X均值方法聚类
  • 使用UMAP降维
  • 情节
  • 关键字

    粉丝图

    由FanGraphs操作的MLB数据站点。
    FanGraphs是美国职业棒球大联盟类别数据排行榜中排名最高的,尽管它是美国职业棒球大联盟主要的数据站点,与ballet-reference.com并排。

    X均值方法

    一种扩展K-means方法的算法。
    X均值方法自动估计K均值方法中作为参数所需的分割聚类的数量,K均值方法是用于聚类的标准算法,是一种无监督学习。

    UMAP

    一种降维方法。比PCA,t-SNE等新的方法。
    这是一种在保留信息特征的同时将高维数据转换为低维数据的方法,这次我们将其转换为二维数据,以便可以将其绘制为散点图。

    程序

    1.从FanGraphs

    获取并格式化数据

    从此页面获取数据。
    作为项目,我们获取了在14至18年的5年内清除了规定的投球时间的每个投手的投球率,平均球速以及垂直和水平球的移动。没有特别的审查,这次我决定将投手聚成一团。

    单击数据表右上角的\\"导出数据\\"以完成CSV下载。

    Major League Leaderboards ? 2018 ? Pitchers ? Custom Statistics | FanGraphs Baseball 2019-03-03 00-54-15.png

    数据格式在单位%的数据列中包含字符串%,因此我只是使用文本编辑器对其进行了统一剪切。

    2.通过X均值方法

    进行聚类

    聚类是通过X-means方法执行的。它已通过名为pyclustering的库实现,因此,如果尚未下载,请使用pip安装。

    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()

    由于

    clusters包含属于每个簇的簇的原始数据arrdata的索引值,因此len(clusters)是通过自动估计获得的划分簇的数量。

    1
    2
    print(len(clusters))
    # => 8

    这次将是8个群集。

    3.使用UMAP

    进行二维数据转换

    使用UMAP将维降为2D以绘制聚类结果。
    由于该库也已在此处实现,请点击pip install

    1
    $ pip install umap-learn
    1
    2
    3
    import umap

    emb = umap.UMAP().fit_transform(arrdata)

    4.情节

    为了方便悬停每个绘制点的信息,请使用plotly而不是matplotlib进行绘制。 plotly爱。

    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)

    newplot-8.png

    看来集群正确完成了,

    スクリーンショット 2019-03-03 0.39.52.png

    当您将鼠标悬停时,可以检查"谁在何时,在哪个团队中比赛"的每个点。

    顺便说一下,根据这个结果,日本投手田中正宏?岩I久志似乎被归类为投手投球手,同类型的22次大满贯,出现在着名书《钱球》中的蒂姆·哈德森它已被提取。

    概要

    暂时已成为一种形状。因为您可以在Qiita等上访问诸如"如果您想要ほげほげふがふが是好的"和" ふがふが可以用它实现"之类的信息,那么以某种方式使其成为某种形式就可以了。 。
    #此外,MLB数据已经准备好,因此它很容易在分析之前准备图像

    但是机器学习的关键点是相同的,因此您必须学习几丁质和方法的理论背景。我会正确阅读这本书并将其输入。