Write a query to determine available seasons and games
進行状況を確認
/ 10
Create a labeled machine learning dataset
進行状況を確認
/ 10
Create a machine learning model
進行状況を確認
/ 20
Evaluate model performance and create table
進行状況を確認
/ 10
Using skillful ML model features
進行状況を確認
/ 10
Train the new model and make evaluation
進行状況を確認
/ 10
Run a query to create a table ncaa_2018_predictions
進行状況を確認
/ 10
Run queries to create tables ncaa_2019_tournament and ncaa_2019_tournament_predictions
進行状況を確認
/ 20
Quick tip: Review the prerequisites before you run the lab
Use an Incognito or private browser window to run this lab. This prevents any conflicts between your personal account and the student account, which may cause extra charges incurred to your personal account.
SELECT
season,
COUNT(*) as games_per_tournament
FROM
`bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games`
GROUP BY season
ORDER BY season # デフォルトは昇順(低から高)
# 勝利チームの行を作成する
SELECT
# 特徴
season, # 例: 2015 シーズンに 2016 年 3 月のトーナメント試合が含まれる
round, # sweet 16
days_from_epoch, # 試合後の経過日数
game_date,
day, # 金曜日
'win' AS label, # ラベル
win_seed AS seed, # ランキング
win_market AS market,
win_name AS name,
win_alias AS alias,
win_school_ncaa AS school_ncaa,
# win_pts AS points,
lose_seed AS opponent_seed, # ランキング
lose_market AS opponent_market,
lose_name AS opponent_name,
lose_alias AS opponent_alias,
lose_school_ncaa AS opponent_school_ncaa
# lose_pts AS opponent_points
FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games`
UNION ALL
# 負けたチーム用の別の行を作成する
SELECT
# 特徴
season,
round,
days_from_epoch,
game_date,
day,
'loss' AS label, # ラベル
lose_seed AS seed, # ランキング
lose_market AS market,
lose_name AS name,
lose_alias AS alias,
lose_school_ncaa AS school_ncaa,
# lose_pts AS points,
win_seed AS opponent_seed, # ランキング
win_market AS opponent_market,
win_name AS opponent_name,
win_alias AS opponent_alias,
win_school_ncaa AS opponent_school_ncaa
# win_pts AS opponent_points
FROM
`bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games`
次の出力が表示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ラベル付き ML データセットを作成する
注: 分類タスクを実行するにあたり、複雑さが異なる多数の ML モデルが存在します。Google でよく使用するモデルの 1 つにニューラル ネットワークを使用したディープ ラーニングがあります。
BigQuery ML を使用して ML モデルを作成する
BigQuery では、SQL ステートメントである CREATE MODEL を記述していくつかのオプションを指定するだけで、分類モデルを作成できます。
ただし、モデルを作成する前にその保管場所をプロジェクト内に確保する必要があります。
[エクスプローラ] タブで、プロジェクト ID の横にある「アクションを表示」アイコンをクリックし、[データセットを作成] を選択します。
これにより、[データセットを作成する] ダイアログが開きます。データセット ID を bracketology に設定して、[データセットを作成] をクリックします。
次にクエリエディタで次のコマンドを実行します。
CREATE OR REPLACE MODEL
`bracketology.ncaa_model`
OPTIONS
( model_type='logistic_reg') AS
# 勝利チームの行を作成する
SELECT
# 特徴
season,
'win' AS label, # ラベル
win_seed AS seed, # ランキング
win_school_ncaa AS school_ncaa,
lose_seed AS opponent_seed, # ランキング
lose_school_ncaa AS opponent_school_ncaa
FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games`
WHERE season <= 2017
UNION ALL
# 負けたチームの行を別に作成する
SELECT
# 特徴
season,
'loss' AS label, # ラベル
lose_seed AS seed, # ランキング
lose_school_ncaa AS school_ncaa,
win_seed AS opponent_seed, # ランキング
win_school_ncaa AS opponent_school_ncaa
FROM
`bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games`
# ここで、データセットを WHERE 句で分割して、データのサブセットでトレーニングし、モデルがトレーニング データを記憶したり過学習したりしないように、予約済みのサブセットに対するモデルのパフォーマンスを評価およびテストできる。
# 1985 年から 2017 年までのトーナメント シーズン情報
# ここで 1985 年から 2017 年までをトレーニングして 2018 年を予測する
WHERE season <= 2017
SELECT
category,
weight
FROM
UNNEST((
SELECT
category_weights
FROM
ML.WEIGHTS(MODEL `bracketology.ncaa_model`)
WHERE
processed_input = 'seed')) # 'school_ncaa' のような他の特徴を試す
ORDER BY weight DESC
これが ML の素晴らしい点です。SQL でハードコードされた IF THEN ステートメントを山ほど作成せずにすみます。つまり(IF)シードが 1 の場合(THEN)チームに 80% 以上の勝率を付与するようにモデルに指示する必要はありません。ML にはハードコードされたルールとロジックは必要ありません。これらの関係は自動的に学習されます。詳しくは、BQML の WEIGHTS 構文のドキュメントをご覧ください。
2018 年の March Madness のトーナメント結果は判明しているので、モデルがどのように予測したかを見てみましょう(ヒント: 今年の March Madness トーナメントを予測する場合は、2019 年のシードとチーム名を含むデータセットを渡すだけです。当然ながら、今予測しているこれらの試合はまだ行われていないのでラベルの列は空になります)。
タスク 10. 2018 年の NCAA トーナメントでのモデルの正解数を確認する
クエリエディタで次のコマンドを実行します。
SELECT * FROM `bracketology.predictions`
WHERE predicted_label <> label
SELECT
model.label AS predicted_label,
model.prob AS confidence,
predictions.label AS correct_label,
game_date,
round,
seed,
school_ncaa,
points,
opponent_seed,
opponent_school_ncaa,
opponent_points
FROM `bracketology.predictions` AS predictions,
UNNEST(predicted_label_probs) AS model
WHERE model.prob > .8 AND predicted_label <> predictions.label
BigQuery ML を使用した ML モデルの構築方法について理解できたところで、今度はデータ サイエンス チームによって提供されている新しいプレイバイプレイ データセットを見ていきましょう。このデータセットでは、モデルによる学習用に新しいチーム指標が作成されています。指標には以下が含まれます。
過去のプレイバイプレイの分析に基づく、時系列の得点効率。
時系列のバスケットボールのポゼッション。
これらの効果的な特徴によって新規 ML データセットを作成する
クエリエディタで次のコマンドを実行します。
# トレーニング データセットを作成する:
# 勝利チームの行を作成する
CREATE OR REPLACE TABLE `bracketology.training_new_features` AS
WITH outcomes AS (
SELECT
# 特徴
season, # 1994 年
'win' AS label, # ラベル
win_seed AS seed, # ランキング # 今回はシードなし
win_school_ncaa AS school_ncaa,
lose_seed AS opponent_seed, # ランキング
lose_school_ncaa AS opponent_school_ncaa
FROM `bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` t
WHERE season >= 2014
UNION ALL
# 負けたチームの行を別に作成する
SELECT
# features
season, # 1994 年
'loss' AS label, # ラベル
lose_seed AS seed, # ランキング
lose_school_ncaa AS school_ncaa,
win_seed AS opponent_seed, # ランキング
win_school_ncaa AS opponent_school_ncaa
FROM
`bigquery-public-data.ncaa_basketball.mbb_historical_tournament_games` t
WHERE season >= 2014
UNION ALL
# 一般公開データセットに含まれない 2018 トーナメント試合の結果を追加する:
SELECT
season,
label,
seed,
school_ncaa,
opponent_seed,
opponent_school_ncaa
FROM
`data-to-insights.ncaa.2018_tournament_results`
)
SELECT
o.season,
label,
# チーム
seed,
school_ncaa,
# 新規ペース指標(バスケットボールのポゼッション)
team.pace_rank,
team.poss_40min,
team.pace_rating,
# 新規効率指標(時系列の得点効率)
team.efficiency_rank,
team.pts_100poss,
team.efficiency_rating,
# 対戦チーム
opponent_seed,
opponent_school_ncaa,
# 新規ペース指標(バスケットボールのポゼッション)
opp.pace_rank AS opp_pace_rank,
opp.poss_40min AS opp_poss_40min,
opp.pace_rating AS opp_pace_rating,
# 新規効率指標(時系列の得点効率)
opp.efficiency_rank AS opp_efficiency_rank,
opp.pts_100poss AS opp_pts_100poss,
opp.efficiency_rating AS opp_efficiency_rating,
# 少量の特徴量エンジニアリング(統計の差異を取得)
# 新規ペース指標(バスケットボールのポゼッション)
opp.pace_rank - team.pace_rank AS pace_rank_diff,
opp.poss_40min - team.poss_40min AS pace_stat_diff,
opp.pace_rating - team.pace_rating AS pace_rating_diff,
# 新規効率指標(時系列の得点効率)
opp.efficiency_rank - team.efficiency_rank AS eff_rank_diff,
opp.pts_100poss - team.pts_100poss AS eff_stat_diff,
opp.efficiency_rating - team.efficiency_rating AS eff_rating_diff
FROM outcomes AS o
LEFT JOIN `data-to-insights.ncaa.feature_engineering` AS team
ON o.school_ncaa = team.team AND o.season = team.season
LEFT JOIN `data-to-insights.ncaa.feature_engineering` AS opp
ON o.opponent_school_ncaa = opp.team AND o.season = opp.season
すぐに次のような出力が返されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ML モデル用の効果的な特徴を使用する
CREATE OR REPLACE TABLE `bracketology.ncaa_2018_predictions` AS
# 参考までに他のデータ列を再度追加
SELECT
*
FROM
ML.PREDICT(MODEL `bracketology.ncaa_model_updated`, (
SELECT
* #(すでにモデルのトレーニングで使用した)すべての行を組み込む
FROM `bracketology.training_new_features`
WHERE season = 2018
))
SELECT
CONCAT(school_ncaa, " was predicted to ",IF(predicted_label="loss","lose","win")," ",CAST(ROUND(p.prob,2)*100 AS STRING), "% but ", IF(n.label="loss","lost","won")) AS narrative,
predicted_label, # モデルの予想
n.label, # 実際の結果
ROUND(p.prob,2) AS probability,
season,
# 自チーム
seed,
school_ncaa,
pace_rank,
efficiency_rank,
# 対戦チーム
opponent_seed,
opponent_school_ncaa,
opp_pace_rank,
opp_efficiency_rank
FROM `bracketology.ncaa_2018_predictions` AS n,
UNNEST(predicted_label_probs) AS p
WHERE
predicted_label <> n.label # モデルが間違えた
AND p.prob > .75 # 75% を超える信頼度
ORDER BY prob DESC
結果は次のようになります。
大番狂わせは前のモデルで検出されたものと同じ UMBC 対バージニア大の試合でした。2018 年が全体的にどれほど大番狂わせの多い年だったかについては、「Has This Been the “Maddest” March?」の記事で詳細をご確認ください。2019 年も大荒れが予想されるでしょうか。
SELECT
CONCAT(opponent_school_ncaa, " (", opponent_seed, ") was ",CAST(ROUND(ROUND(p.prob,2)*100,2) AS STRING),"% predicted to upset ", school_ncaa, " (", seed, ") and did!") AS narrative,
predicted_label, # モデルの予想
n.label, # 実際の結果
ROUND(p.prob,2) AS probability,
season,
# 自チーム
seed,
school_ncaa,
pace_rank,
efficiency_rank,
# 対戦チーム
opponent_seed,
opponent_school_ncaa,
opp_pace_rank,
opp_efficiency_rank,
(CAST(opponent_seed AS INT64) - CAST(seed AS INT64)) AS seed_diff
FROM `bracketology.ncaa_2018_predictions` AS n,
UNNEST(predicted_label_probs) AS p
WHERE
predicted_label = 'loss'
AND predicted_label = n.label # モデルは正しく理解していた
AND p.prob >= .55 # 55% 以上の信頼度
AND (CAST(opponent_seed AS INT64) - CAST(seed AS INT64)) > 2 # シードの違いの強度
ORDER BY (CAST(opponent_seed AS INT64) - CAST(seed AS INT64)) DESC
SELECT
NULL AS label,
team.school_ncaa AS team_school_ncaa,
team.seed AS team_seed,
opp.school_ncaa AS opp_school_ncaa,
opp.seed AS opp_seed
FROM `data-to-insights.ncaa.2019_tournament_seeds` AS team
CROSS JOIN `data-to-insights.ncaa.2019_tournament_seeds` AS opp
# 自チームとは対戦できない
WHERE team.school_ncaa <> opp.school_ncaa
2018 年のチーム統計(ペース、効率)に追加する
CREATE OR REPLACE TABLE `bracketology.ncaa_2019_tournament` AS
WITH team_seeds_all_possible_games AS (
SELECT
NULL AS label,
team.school_ncaa AS school_ncaa,
team.seed AS seed,
opp.school_ncaa AS opponent_school_ncaa,
opp.seed AS opponent_seed
FROM `data-to-insights.ncaa.2019_tournament_seeds` AS team
CROSS JOIN `data-to-insights.ncaa.2019_tournament_seeds` AS opp
# 自チームとは対戦できない
WHERE team.school_ncaa <> opp.school_ncaa
)
, add_in_2018_season_stats AS (
SELECT
team_seeds_all_possible_games.*,
# 各チームの 2018 のレギュラー シーズンの特徴を提供する
(SELECT AS STRUCT * FROM `data-to-insights.ncaa.feature_engineering` WHERE school_ncaa = team AND season = 2018) AS team,
(SELECT AS STRUCT * FROM `data-to-insights.ncaa.feature_engineering` WHERE opponent_school_ncaa = team AND season = 2018) AS opp
FROM team_seeds_all_possible_games
)
# 予測で使用する 2019 年のデータの準備
SELECT
label,
2019 AS season, # 2018~2019 年トーナメント シーズン
# 自チーム
seed,
school_ncaa,
# 新規ペース指標(バスケットボールのポゼッション)
team.pace_rank,
team.poss_40min,
team.pace_rating,
# 新規効率指標(時系列の得点効率)
team.efficiency_rank,
team.pts_100poss,
team.efficiency_rating,
# 対戦チーム
opponent_seed,
opponent_school_ncaa,
# 新規ペース指標(バスケットボールのポゼッション)
opp.pace_rank AS opp_pace_rank,
opp.poss_40min AS opp_poss_40min,
opp.pace_rating AS opp_pace_rating,
# 新規効率指標(時系列の得点効率)
opp.efficiency_rank AS opp_efficiency_rank,
opp.pts_100poss AS opp_pts_100poss,
opp.efficiency_rating AS opp_efficiency_rating,
# 少しの特徴量エンジニアリング(統計の違いを取得)
# 新規ペース指標(バスケットボールのポゼッション)
opp.pace_rank - team.pace_rank AS pace_rank_diff,
opp.poss_40min - team.poss_40min AS pace_stat_diff,
opp.pace_rating - team.pace_rating AS pace_rating_diff,
# 新規効率指標(時系列の得点効率)
opp.efficiency_rank - team.efficiency_rank AS eff_rank_diff,
opp.pts_100poss - team.pts_100poss AS eff_stat_diff,
opp.efficiency_rating - team.efficiency_rating AS eff_rating_diff
FROM add_in_2018_season_stats
予測を実行する
CREATE OR REPLACE TABLE `bracketology.ncaa_2019_tournament_predictions` AS
SELECT
*
FROM
# より新しいモデルを使って予測しましょう
ML.PREDICT(MODEL `bracketology.ncaa_model_updated`, (
# 2019 年 3 月のトーナメントの試合で予測しましょう
SELECT * FROM `bracketology.ncaa_2019_tournament`
))
SELECT
p.label AS prediction,
ROUND(p.prob,3) AS confidence,
school_ncaa,
seed,
opponent_school_ncaa,
opponent_seed
FROM `bracketology.ncaa_2019_tournament_predictions`,
UNNEST(predicted_label_probs) AS p
WHERE p.prob >= .5
AND school_ncaa = 'Duke'
ORDER BY seed, opponent_seed
Labs create a Google Cloud project and resources for a fixed time
Labs have a time limit and no pause feature. If you end the lab, you'll have to restart from the beginning.
On the top left of your screen, click Start lab to begin
Use private browsing
Copy the provided Username and Password for the lab
Click Open console in private mode
Sign in to the Console
Sign in using your lab credentials. Using other credentials might cause errors or incur charges.
Accept the terms, and skip the recovery resource page
Don't click End lab unless you've finished the lab or want to restart it, as it will clear your work and remove the project
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
One lab at a time
Confirm to end all existing labs and start this one
Use private browsing to run the lab
Use an Incognito or private browser window to run this lab. This
prevents any conflicts between your personal account and the Student
account, which may cause extra charges incurred to your personal account.
このラボでは、BigQuery を使用して NCAA 一般公開データセットを分析し、BigQuery ML を使用して NCAA のトーナメントの組み合わせを予測します。