3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

深層学習以外の機械学習と応用技術 by QuantumCoreAdvent Calendar 2019

Day 15

QoreSDKを使ってNBA選手の活躍予測をしたい

Last updated at Posted at 2019-12-15

これは深層学習以外の機械学習と応用技術 by QuantumCore Advent Calendar 2019の15日目の記事です。

やりたいこと

時系列情報を用いてNBA選手の活躍予測をする。

今回はユタ・ジャズ所属のDonovan Mitchell選手の「出場分あたり得点数」を予測します。

Donovan Mitchell (Basketball Reference)

ちなみに僕はバスケットボール初心者です。

仮定

「シーズンでの活躍の浮き沈みって毎シーズン同じになるんじゃない?」


例えば、「シーズンはじめは不調だけど途中で調子を取り戻し、シーズン終盤で活躍のピークを迎える」

かなり粗い仮定ですが、これとQoreSDKでどこまでできるか試してみました。

データと予測内容

データ

Basketball Referenceをスクレイピングして、各試合における選手のBox Score(出場記録)を取得。

なおBaketball Referenceには1954年頃からの試合データがあり、一応全データをスクレイピングしました。もし内容が気になる方はご連絡ください。

予測するもの

  • 説明変数: 開幕からの日数
  • 目的変数: 出場分あたり得点数 (PTS/MP)

11月中旬までのDonovan Mitchellの出場分あたり得点数は以下のようになります。

スクリーンショット 2019-12-16 0.03.53.png

今回は18/19シーズンのデータを使ってTrainを、19/20シーズンの途中まででValidationをします(モデルの変更は行いませんが)。その後、実際の試合に対してDonovanの活躍予測をします。

コード

接続

from  qore_sdk.client import WebQoreClient
client = WebQoreClient(username="", password="p@$$w0rd", endpoint="")

データ準備

Donovan.csvにはスクレイピングした選手の成績があるとします。

import pandas as pd
donovan = pd.read_csv('Donovan.csv', parse_dates=['date'], index_col='date')

(再出)

  • 説明変数: 開幕からの日数
  • 目的変数: 出場分あたり得点数 (PTS/MP)

# シーズン開始前の10月1日を規準とする。
# 開幕の日のほうが良いかもしれない

X = donovan[(datetime.datetime(year=2019, month=10, day=1)>donovan.index) & (donovan.index>datetime.datetime(year=2018, month=10, day=1))].index
X = X - datetime.datetime(year=2018, month=10, day=1)

y = donovan[donovan.index.year==2018]['PTS per mn']

データ分割

import sklearn.model_selection as model_selection
X_train, X_valid, y_train, y_valid = model_selection.train_test_split(
    X, y, shuffle=False, random_state=44
)

学習と予測

# Train
res = client.regression_train(X=X_train.values, Y=y_train.values)

# 予測
pred = client.regression_predict(X=X_valid.values)

バリデーション(という名の確認)

import sklearn.metrics as metrics
rmse = metrics.mean_squared_error(y_valid, pred["Y"])**.5
mae = metrics.mean_absolute_error(y_valid, pred["Y"])

print("RMSE=", rmse)
print("MAE=", mae)
print("RMSE/MAE=", rmse/mae)

結果

学習の時点でHTTPError: HTTP Error 500: INTERNAL SERVER ERRORが発生。解決次第、記事をアップデートします。

予想される課題

  • 仮定が単純すぎる
    • 時間以外の要素を考慮するべきかもしれない
  • そもそもパフォーマンス評価に軸が「出場分あたりの得点数」だけはおかしい
  • まずは、結果を出そう。

QoreSDKの使い心地

別データセットで学習・予測をすると、確かにお手軽さ・楽チンさがあります。Reservoir Computingのような、利点をもつが複雑な計算を簡単に再現できるツールというのはもっと知られるべきだと思いました。

一方、その分ブラックボックス的印象を受けることがあり、運営の初日記事ドキュメンテーションを始めとした説明をしっかりと理解する必要があります。特に、ドキュメンテーションには初日記事にあるような、背景・理論の説明ページがあってもいいのかなと感じました。

いずれにしても、このようなツール開発に時間を注くQuantumCoreの皆様に敬意を示します。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?