BigqueryMLで作成したモデルをGoogle Data Studioで可視化してみた 

ちょっと前にBigqueryMLが発表され、記事を書きました。

[**「BigQuery ML」でSQLを書いて機械学習モデルを構築&予測できる！**](https://qiita.com/s_yaginuma/items/b692d3716dcb06416ce0)
>  BigQuery上でpythonなどを使わずにSQLを用いてそのまま機械学習を回せるBigQuery MLという機能がベータ版で出ました！
公式のチュートリアルを回してみて、かなり手軽に機械学習モデルを回せるのと、pythonよりも簡単にモデルの評価ができるので感動しました。
チュートリアルではBigQueryのサンプルデータを用いていたのですが、この記事ではKaggleのtitanicデータを対象にモデル構築、評価、KaggleへSubmitまでやってみようと思います。...

9/19, 20で開催されたGoogle cloud next tokyoでもBigqueryML関連のセッションがあり、将来性を感じたので、もう少し深めたいと思いました。
今回は、Bigquery上にモデルを置いておけ、SQLで予測結果などを呼び出すことができるメリットを活用するため、同じくGoogleが提供しているData Studioと言うBIツールを使って可視化していきたいと思います！！

公式ドキュメント（検索してもあんまり出てこない...） → [**すべての BigQuery ML ドキュメント**
](https://cloud.google.com/bigquery/docs/bigqueryml)
[**Google Data Studio**](https://datastudio.google.com/overview)：Google提供の無料で使えるBIツール。GA, BigQueryなど色んなデータソースにアクセスできます。

##BqML, DataStudioって何？
はじめに、BqML, DataStudioについて全く知らない方の為に、それぞれ三行でまとめます。

###BigQuery ML：
- Bigqueryのクエリエディタ上で機械学習の予測モデルを構築できる
- モデルの評価、学習過程、特徴量の重みなど、モデルの情報をSQLを書いて呼び出すことができる
- SQLで機械学習を行えるので、 Tableau, DataStudioなどのBIツールと相性が良い

###Google Data Studio：
- Googleが提供しているBIツール
- GUI上でのドラッグ&ドロップ、ボタンぽちぽちによる直感的な操作、ページネーションもできる。
- Google系のデータソースにはほぼほぼ対応していてカスタムSQLも書ける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/7170d305-bd31-2adf-b272-bfcba7d7a620.png)
↑例：https://datastudio.google.com/u/0/reporting/0B7GT7ZlyzUmCZHFhNDlKVENHYmc/page/dizD
こんな綺麗なダッシュボードも割と簡単に作成できます！

つまりこの記事は、折角BigqueryMLでSQL通して機械学習モデルの情報を出力できるので、SQLと親和性高くて誰でも使えるData Studioで可視化してみたいな！という思いつきから書かれています。

##こんなダッシュボード作った
最初にこんな感じになったと言うのを書いてしまおうと思います。
BigqueryMLだと、学習曲線、ROC曲線を書くようのデータや、正解率、再現率、AUCなどの評価指標、特徴量の重みなどを出力できるので、それらの情報をこってりとダッシュボード化してみました。
可視化するモデルは、[前回の記事](https://qiita.com/s_yaginuma/items/b692d3716dcb06416ce0)のタイタニックの生存者予測をロジスティック回帰により行ったものです。

https://datastudio.google.com/open/1bhMMuTaBEqmqd8Z1ExYzcwoy8PHe42aV

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/99ae2fa4-d147-fb83-24db-bce39dd2b5dc.png)

はい、切って貼った感が強いです笑
構成要素は、
- 各評価指標
- 学習曲線
- ROC曲線
- 特徴量の係数
と言った感じになってます。
それでは、次章からそれぞれの構成要素をみていきましょう。

####ちなみに、どうやってモデルを作った？
[CREATE MODEL ステートメント
](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-create)

```sql
CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    ls_init_learn_rate=.15,
    l1_reg=1,
    max_iterations=5 ) AS
SELECT
  column1,
  column2,
  column3,
  label
FROM
  `mydataset.mytable`
WHERE
  column4 < 10
```

こんな感じで作れます。

##各評価指標

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/c1256f4b-33d1-b5e2-4efc-63fe69ca4fba.png)

これは、[ML.EVALUATE 関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-evaluate)で出力されます。

```sql
SELECT
  *
FROM
  ML.EVALUATE(MODEL `mydataset.mymodel`,
    (
    SELECT
      custom_label,
      column1,
      column2
    FROM
      `mydataset.mytable`)
```

このように記述するだけで、pythonでは別個書かなくてはならない評価指標を一気に主要なものを出力できます。（正解率、再現率、適合率、AUC、F1値、logloss）

これをSQLで出力し、DataStudio上で「スコアカード」と言うコンポーネントを使用して可視化しました。

##学習曲線

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/8134f0d3-cafb-a6c2-f74d-34b7132daebd.png)

学習曲線とは、計算の繰り返し回数に対して訓練データに対する損失、評価用データに対する損失をプロットしたものです。
これによって、学習がどのように進んでいるのか、収束しているのかなどを判断できます。

BigqueryMLでは、[ML.TRAINING_INFO 関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-train)を使用して出力できます。

```sql
SELECT
  *
FROM
  ML.TRAINING_INFO(MODEL `mydataset.mymodel`)
```

このように記述するだけで、描画に必要なデータは全て出力できます。

今回は、「混合グラフ」と言うコンポーネントで可視化しました。

##ROC曲線

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/2948890d-d742-bb6e-7a9f-5b1db4e26015.png)

ROC曲線とは、[【統計学】ROC曲線とは何か、アニメーションで理解する。
](https://qiita.com/kenmatsu4/items/550b38f4fa31e9af6f4f)こちらの記事が破格にわかりやすいのでぜひご覧ください！僕は正直あんまりわかっていません汗
とりあえず、ROC曲線の下部の面積がAUCに対応すると言うことだけはわかってます汗汗

　BigqueryMLでは、[ML.ROC_CURVE 関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-roc)で必要なデータを出力できます。

ここは正直言うと、出力できるのでノリで可視化してみました。

##特徴量の重み

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/5034a4c2-85f1-57ad-4fdc-2c9bc731154d.png)

線形回帰であれば、y=ax+by+czみたいな各特徴量がどのくらいyに影響を与えているのかを示す、それぞれの特徴量の重みを出力できます。この例だと、負の係数を持つものが混じっているため、少し見づらいですね汗

これは、[ML.WEIGHTS 関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-weights)で必要なデータを出力できます。

```sql
SELECT
  processed_input,
  weight
FROM
  ML.WEIGHTS(MODEL `model_titanic`)
```

こんな感じでSQLでかけます。
やはり可視化すると、より理解が直感的にできますね。

##まとめ
いかがだったでしょうか？
今回は手段ありきで無理矢理やって見ましたが、個人的には手応えがありました。
今後は時系列の予測を簡単に線形回帰でやって見て、予測結果をBIツール上で可視化することなど、他のユースケースも思いついたら試してみようと思います。

　ちなみに、今回作成したダッシュボードは、弊社で開催している[**グロービスもくもくし放題 @麹町**](https://globis.connpass.com/event/100852/)
の時間内でサクッと作って見たものになります。軽食、お酒を頂き、少し談笑交えながらのもくもくと言う感じで楽しく開発？させて頂きました。
もしご興味ある方がいらっしゃいましたらご参加ください〜！
ここまでお読み頂きありがとうございました！