【はじめての Databricks】金融取引データから異常検知 #1 導入/環境構築

## はじめに
データ分析プラットフォームである Databricks は、その特性上、主に処理速度やコストの面で他のサービスと比較されがちです。もちろんそれらの点において高く評価されているからこそ欧米でのデファクトスタンダードになっているわけですが、私自身は、サービスとしての完成度の高さが一番の強みだと感じています。例えば、

- 知識の共有がしやすい
- ユーザビリティを強く意識して作られている GUI
- 他のサービス (データベースとかBIツール) との連携性がいい
- モデルの利用や継続的な改善に至るまでの導線がスムーズ

といった点です。つまり、

- 分析チームの生産性を上げやすく、
- 学習コストが低い

サービスに仕上がっていると言えます。ただ、日本語の情報が少なかったり技術難易度が高いレクチャーが多かったりと、初心者にとってはまだまだハードルが高いのが現状です。本連載がそのハードルを下げるものになれば幸いです。


#### テーマ選定の背景
本連載は、Databricks 社が展開している以下のコンテンツをベースにしています。
モバイル決済のログデータから、各決済が正常取引か不正取引かを判定しよう、というものです。

[Detecting Financial Fraud at Scale with Decision Trees and MLflow on Databricks](https://databricks.com/blog/2019/05/02/detecting-financial-fraud-at-scale-with-decision-trees-and-mlflow-on-databricks.html)
[※翻訳まとめ](https://qiita.com/Yoshiyuki03/items/245094b1de6ed8bab73d)

このコンテンツを選んだ理由は以下の通りです。

- テーマが異常検知
    - どの業界でも普遍的なテーマ
    - 手元のデータだったらどうかという想像がしやすい
    - 継続的な改善が不可欠で、Databricksの利点が生きる (異常の定義は時々刻々と変わる)
- 決定木のアルゴリズムを使う
    - モデルの説明性・透明性が高く、既存のルールとの比較が容易
    - リモデルに要する工数が低い
    - ドメイン知識を反映しやすい
- データを入手しやすい
    - Kaggle に登録すればすぐに使える

公式ドキュメントでは、既存の異常検知ロジックをコードで記載、その結果を正解ラベルに用いて機械学習モデルを構築しています。実ビジネスでは最初にこのようなプロセスを踏むのが定石のようですが、今回利用するデータには通常/異常の判定情報が付与されています(詳細は連載#2で触れます)。そこでリモデルまでの流れの見通しをよくするために、本連載ではこれを正解ラベルとしています。

また、データ探索の一部に Azure Anomaly Detector (時系列データから異常を見つけるマネージドAIサービス) を利用してみたり、作成したモデル2種それぞれの使い方を考えてみたりと、ちょっとアレンジを加えています。


#### 連絡目次
1. [導入/環境設定](https://qiita.com/Catetin0310/items/28706cf7e6ae86b55ba1)  → 本稿
2. [Collaborative Notebook でデータ可視化](https://qiita.com/Catetin0310/items/b5bda50982cfc132f75c)
3. [Anomaly Detector をデータ探索ツールとして使ってみる](https://qiita.com/Catetin0310/items/d29b5fb00e047a7c107e)
4. [1つ目のモデル構築 (データの偏り 未考慮)](https://qiita.com/Catetin0310/items/a46ba6b1ee6e6290512a)
5. [2つ目のモデル構築 (データの偏り 考慮)] (https://qiita.com/Catetin0310/items/0780b4e0f1ba07509930)



#### Azure Databricks とは
過去書いた記事のリンクです。

- [Azureアーキテクチャガイドまとめ 7 【ビッグデータアーキテクチャ】](https://qiita.com/Catetin0310/items/b6030d3ad0fde16e57ab)
    - Microsoft Azure でビッグデータ分析基盤を作る際のガイドをまとめた記事
    - データ分析基盤回りのサービスのご参考に
- [Azureデータ分析入門 #4 【ツール比較 Databricks編】](https://qiita.com/Catetin0310/items/b6030d3ad0fde16e57ab)
    - 同じ処理を Excel、Azure Noitebook、Databricks 3つのパターンで同じ処理を無理やりやってみて比較した記事
    - 実際に発生した費用もまとめてあります
- [Databricks Community Edition で Notebook を立ち上げる](https://qiita.com/Catetin0310/items/252582f4f2bd8231ebf4)
    - Dataricks の無償版を使えるようにする手順をまとめた記事
    - オープンデータ使うのであればこれ使ってもOK。利用感は十分体感できる
    - 実務で使う場合は有償版利用必須なので注意

前置きが長くなりました。
では環境構築していきます。

## ワークスペースの作成
以下の URL から Azure ポータルへログイン
https://azure.microsoft.com/ja-jp/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/997d1edf-72b6-0a15-46fc-9f6d51986398.png)

左上の``` ＋ ```をクリックし、検索窓に Databricks と入力し、候補に出てきた Azure Databricks をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/c1599b51-7afc-9fc2-75b5-b1c1f5b905c4.png)

作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/7615cd58-a9c3-46fe-3f82-88913eb63c38.png)

以下のようにワークスペースを設定、作成をクリック
(ワークスペースの展開に2-3分を要します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/7df6eca0-e178-b6cd-3598-4a093c64dd7b.png)

しばらくするとワークスペース展開完了の通知が届くので、リソースに移動をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/306df9e2-8e94-76c4-251e-ee88e01ee4c9.png)

こちらの画面に遷移すればワークスペースの作成完了
![2020-08-21_13h49_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/717f31be-455d-d560-66d3-44c5de8065c6.png)


## クラスタの作成
Cluster タブを選択し、Create Cluster をクリック
![2020-06-26_12h08_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/6591d8fe-7637-13c9-8f4f-a6bd437b1a88.png)

任意でクラスタ名を設定し、Creater Cluster をクリック
有償版であれば詳細を設定できます。今回はオートターミネーションを 60分 に設定。

![2020-06-28_11h18_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/618bb4d8-efa7-8f49-f01f-aa77949f2c32.png)

しばらく待つと Status が Running に。これで完了。
![2020-06-28_11h25_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/aa12b7ba-9c4e-7034-71e0-789b9a6630b4.png)





## データのアップロード
以下サイトからデータをダウンロードします。※ Kaggle のユーザーアカウントが必要
[Kaggle - Synthetic Financial Datasets For Fraud Detection](https://www.kaggle.com/ntnu-testimon/paysim1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/73d566ab-d55c-89de-aa0e-2b17bafce646.png)

Data タブを選択し、Add Data をクリック
![2020-06-26_12h01_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/aabec683-8992-44aa-dfe4-fb2515095df8.png)

Upload File → browse と進み、ダウンロードしたファイルを選択
![2020-06-26_12h03_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/287f39ea-231a-07c8-9d50-f8e0f8a59c9b.png)

アップロードが完了するとこちらの画面に。デフォルトでは File Store にデータが格納されます。
Create Table with UI をクリック
![2020-06-26_12h05_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/2ee87739-3e07-12f4-44e6-85784a7882c8.png)

先ほど作成したクラスターを選択し、Preview Table をクリック
![2020-06-26_12h53_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/91885bdd-d3dd-7a47-9734-b4c524152e1a.png)

デフォルトではアップロードしたファイル名がそのままテーブル名になっているので、これを ```sim_fin_fraud_detection```に変更します。
オプションは、First row is header (最初の行をカラム名として読み取り)と Infer Schema (各カラムのデータ型自動類推)にチェックを入れ、Create Table をクリック
![2020-06-26_12h56_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/75fe4ee9-181c-3f57-c55d-1f0a753ec41b.png)



## mlflow experiment 設定
機械学習のライフサイクル管理にとても便利な mlflow ですが、今回はモデルの比較という用途に絞って最低限の設定を行います。

Workspace → ユーザー名 → プルダウンで Createと進み、MLflow Experiment をクリック
![2020-06-26_13h40_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/2640438f-ab65-83c5-3a9c-26457b361eac.png)

名称を任意で指定、Create をクリックします。Artifact Loacation は特別に指定しなくてOK
![2020-06-26_13h41_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/d18b7d8d-addd-57a8-ef8a-8c7bcb9a3ae8.png)

以下の画面に遷移します。```Experiment ID``` は Notebook の中で使うのでメモしておきます。
![2020-06-26_13h42_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/7860351c-1ad1-a976-9edc-bad41e25db6d.png)




## Collaborative Notebook 作成
実際にコードを記載して分析ロジックをくみ上げたり、その中にメモを残したりする Collaborative Notebook を作成します。使い勝手は Jupyter Notebook にかなり近いです。

トップ画面から、Create a Blank Notebook をクリック
![2020-06-28_12h17_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/b3137eba-97e2-2284-f0f6-d8b279f20628.png)

任意で名称を変更、作成したクラスタを選択して、Create をクリック
![2020-06-28_12h20_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/a3f2e27b-e304-7bbf-248d-174828ec7458.png)

以下の画面になればOKです。
![2020-06-28_12h21_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/02d0e27a-8207-87df-fd98-85c3575655ee.png)

#### 使用方法
灰色のエリア(セル)にコードを書き、shift + enter を押すことで、セルが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/cefc9f0a-50e6-0db4-a64f-f83676f23fde.png)

%md の後に文章を入力、セルを実行することで、markdown 形式で Notebook 上にメモを残すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/77026120-9cbe-12fe-f21d-4ce2398cd0b9.png)

セル中央部の下もしくは上にマウスカーソルを当て、＋ をクリックすると新しいセルを追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/b1ae7c03-3caf-501f-275f-dcfe8ebdb0e3.png)

セル左上のプルダウンより、対象のセルから上、もしくはセルより下のセルを実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/2fb1f45d-9a4a-c873-e580-b9a156b6e94c.png)

セル上部の消しゴムアイコンから clear result を選択することで、実行結果をクリアできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/7e39da38-4d39-df41-c5f2-7530def2d9c2.png)

クラスタが停止した場合は、クラスタアイコンから、Start Cluster をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/33aa0d23-1f1c-48de-de27-60801ab6c555.png)


#### mlflow 初期設定 
クラスタに mlflow をインストールするために、 Notebook 上に以下のコマンドを実行します。

```python
dbutils.library.installPyPI("mlflow")
```

```=``` の後に、先ほど作成した mlflow experiment の id を入力、同じく実行します。 

```python
mlflow_experiment_id = {your_experiment_id}

import mlflow
import mlflow.spark
import os

print("MLflow Version: %s" % mlflow.__version__)
```
> 結果
MLflow Version: 1.9.1

以上の2つのセルを実行しておくことで、この Notebook 上で行うモデリング処理が mlflow に記録されるようになります。


#### 備考：Notebook のインポート
Databricks の公式事例ページや Github には、そのまま活用できる Collaborative Notebook がアップロードされています。以下の方法でインポート可能です。

Workspace から User を選択し、以下のプルダウンから Import をクリックします。
![2020-06-26_13h58_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/95b1ac09-d4b9-695d-03a3-f7dd46a71292.png)

URL を選択し、インポートしたい Notebook の URL を張り付け、Import をクリックします
![2020-06-26_14h00_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/41d07b8f-2b78-b1c5-240d-e4329fe7bc7c.png)



## まとめ
次回はインポートしたデータの中身を見ていきます。お楽しみに！

## 参考リンク
[Detecting Financial Fraud at Scale with Decision Trees and MLflow on Databricks](https://databricks.com/blog/2019/05/02/detecting-financial-fraud-at-scale-with-decision-trees-and-mlflow-on-databricks.html)
[Detecting Financial Fraud at Scale with Decision Trees and MLflow on Databricks　翻訳まとめ](https://qiita.com/Yoshiyuki03/items/245094b1de6ed8bab73d)
[Azure Databricks: 1. リソースの作成](https://qiita.com/KcMichael/items/eb17285a46bda68f9c64)
[Azure Databricks で、他の Notebook を呼び出す、基礎: Hello World レベル](https://qiita.com/dahatake/items/6eb35e31bc503e33ab32)
[pysparkでデータハンドリングする時によく使うやつメモ](https://qiita.com/paulxll/items/1c0833782cd4e1de86e2)