Databricks経由Machine Learningの旅 第二話 -Notebookを触ってみよう！-

# はじめに
「Databricks経由Machine Learningの旅」2回目になります。
前回は、[ETLツールのTROCCO®を用いて外部データを取得し、Databricksにデータを準備するお話](https://qiita.com/wakama1994/items/17be09bb78165cefae11)をしました。

今回から複数回に渡り、実際にNotebookを用いて機械学習モデルの構築をしていきたいと思います。
今回はまずNotebookの使い方に焦点を当てて説明します。

いきなり難しいモデルの説明を....となると学習の敷居が上がってしまうと感じました。
なのでPythonのAutoMLライブラリである[PyCaret](https://pycaret.org/)を使用します。
このライブラリでは「データの取り込み〜モデル構築〜パラメータチューニング〜予測」といった機械学習の流れを、比較的簡素なコーディングで実行することができます。

筆者自体もDatabricks環境でNotebookを初めて触ることから、PyCaretを用いてNotebookの基本的な操作方法について、今回はご紹介したいと思います。

# 対象読者
- DatabricksのNotebookをこれから触ってみたい方
- 機械学習の一連の流れの外観を知りたい方

# やったこと
### ① サンプルコードをNotebookで動かす
まず、お手本としてWEBで公開されているサンプルコードがDatabricksのNotebook上でも回るかを検証してみようと思います。
今回はQiitaで紹介されていた、[「簡単にできる機械学習 ～PyCaretを使ってみた～」](https://qiita.com/Takumi_Fukuda/items/99e60793ac700974cfc4)に添付されているコードを抜粋し、Notebook環境で回したいと思います。

なお今回、機械学習のモデルや評価指標の細かな説明は省きます。
詳しく知りたい方は、参考にしたQiitaの記事をベースに専門書等での深い学習をお勧めします。

#### 新規Notebookの作成
まずNotebookの作成です。「新規>ノートブック」から新規のNotebookを作成します。
※jupyterが提供するNotebookと同様のUIになっています。

![スクリーンショット 2024-08-25 2.38.19 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/cc05f00e-5d79-7f4c-bc01-8d53dde23bf6.png)

なお、コンピューティングリソースが未選択な方は、下記のように求められるため設定をお願いいたします。

![スクリーンショット 2024-08-24 20.40.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/ad4e9319-05ed-9142-8dc8-382cdb5e9715.png)


#### ライブラリインポート、データ取得と前処理
まずライブラリのインポートとデータの読み込み、前処理を行います。下記スクショのように回します。
デフォルトで入っている`diamond`のデータを読み込んでおります。

![スクリーンショット 2024-08-24 21.13.22 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/db4c0306-a2a7-951a-77b2-8239d66cf033.png)

次にモデル構築とモデルの選定を行います。
PyCaretでは同じ特徴量を使って、複数のモデルで複数の評価指標を表示してくれます。
その中で精度の良さそうなモデルを選定し、最終的な予測に使っていきます。

![スクリーンショット 2024-08-25 10.40.59（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/79ce9e3b-186b-26f1-bb97-460751aea5ce.png)
※モデル・評価指標の説明は、参考Qiita記事の[「予測モデル分析、選定」](https://qiita.com/Takumi_Fukuda/items/99e60793ac700974cfc4#%E4%BA%88%E6%B8%AC%E3%83%A2%E3%83%87%E3%83%AB%E5%88%86%E6%9E%90%E9%81%B8%E5%AE%9A)をご確認ください。

#### パラメータチューニング、残差確認、特徴量プロット
次にパラメータチューニングと、モデル設定後の残差確認と特徴量プロットを実行します。
scikit-learnや可視化のmatplotlib等に比べ、非常に少ないコーディングで確認することができますね。
予測結果を素早くみることができます。

![スクリーンショット 2024-08-25 12.38.00（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/1aa3a70e-4760-44ed-3a65-8badff17868f.png)


#### 予測結果の出力
最後に構築したモデルを、testデータで予測結果を出力する処理をすれば完成です。

![スクリーンショット 2024-08-25 12.35.22 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/d6b4d784-6787-88e0-b743-b8ac06c17e6e.png)

### ②Databrick上のデータをPyCaretに読み込む

①ではPyCaretのデフォルトで入っているデータを使ってみました。
では実際にDatabricks上のデータを読み込めるか？について検証したいと思います。

読み込むデータは、第一話でTROCCO®を用いてDatabricksに転送した、[Titanicのデータ](https://www.kaggle.com/competitions/titanic/overview)を使います。

#### csvファイルの場合
pandasを用いて機械学習する方も多くいると思いますので、まずcsvファイルでできないか？について検証してみようと思います。
上記Titanicデータをローカルにcsvでダウンロードし、　スキーマに「ボリューム」を作成したのち、csvデータをアップロードしていきます。

![スクリーンショット 2024-08-25 15.01.08 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/e0d934ef-e5a9-65e2-c2d8-8ca95313cede.png)

データの読み込みについてですが、Dataframe型であれば対応できたので、pandasで`read_csv`関数を使えばいけました。
ディレクトリーのパスは以下のように指定すればできました。

```
import pandas as pd 
dataset = pd.read_csv('/Volumes/{catalog_name}/{schema_name}/{table_name}/train.csv'
,encoding='utf-8')
```

写真のようにモデル間の比較までできたので、予測モデルの出力まで可能だと思います。

![スクリーンショット 2024-08-25 15.19.02 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/56e4b0d9-1922-9a0a-5928-0bb9d71d9b89.png)

#### テーブルの場合
第一話でTROCCO®のHTTPコネクタを活用して転送したテーブルの場合でも実施してみます。
下記のように、テーブルを読み出して、`Pyspark.Dataframe`から`Pandas.Dataframe`に変換します。（直接データを読み出せなかったのでやや面倒でした。）

```
df= spark.read.table('{catalog_name}.{schema_name}.{table_name}')
dataset = df.select("*").toPandas()
```

:::note warn
ただし今回の処理がベスプラとは限らないと思っております。
`Pyspark.Dataframe`の場合、csvデータ読み込みと同じコードでは失敗しました。
そのため、`.toPandas()`で変換したのち、csvと同じ処理で実施しました。
PyCaretで、`PySpark.DataFrame`用のコーディングが存在している可能性も考えられます。
:::

CSVファイルの時と同様に、モデル間の比較までできたため、予測モデルの出力まで可能だと思います。

![スクリーンショット 2024-08-25 15.42.03 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/faab1779-70e4-ac32-1bab-a565533752b9.png)


### 実装したコードについて
今回実装したコードは下記GitHubの[qiita_2nd_test_notebook.py](https://github.com/wakama1994/qiita_databricks_ml/blob/main/qiita_2nd_test_notebook.py)になります。
ご興味ある方は参考にしてみてください！

https://github.com/wakama1994/qiita_databricks_ml/tree/main

# DatabricksのNotebookに初めてふれた感想
筆者自身、今回初めてDatabricksのNotebookを触ってみました。
他の環境下でNotebookを4-5年使ってきたため、個人的に特徴的な機能だな感じた点について紹介したいと思います。

### AIによるコーディングアシスト機能が存在し、エラー修正を手伝ってくれる
エラーがでたコードに関して、AIが解決策を提示してくれました。こちらに関してはデフォルトで入っている機能となります。

例えば下記写真のように`import pycaret`と実行してもモジュールなしのエラーが出てしまいます。
しかし、右のようにAIが「モジュールがないので下記コードを実行してください」といったアシストをしてくれ、こちらを実行すると無事にimportすることができました。

![スクリーンショット 2024-08-24 20.40.46 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/e9646e60-1ca1-d2e3-67ab-0d6179f67a8a.png)

Databricks環境のNotebookでどのように `pip install`すべきか？若干迷っていたので、このようなアシストがあるとかなり便利に感じました。
また何も設定することなく、この機能が使えるの点も良いなと感じました。

### 簡便的なGitHub連携
GitHubとの連携も比較的やりやすいなと感じました。
まず、「新規>Gitフォルダー」から作成したGitHubのリポジトリの登録を行います。

:::note warn
GitHub上にリポジトリが存在するのを前提とします。
:::

![スクリーンショット 2024-08-25 2.38.19 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/cc05f00e-5d79-7f4c-bc01-8d53dde23bf6.png)

![スクリーンショット 2024-08-24 23.09.30 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/0daff466-8f8b-e553-96d8-a3372f7d3cad.png)

またGitHubとの連携についても、「設定＞リンク済みのアカウント」でGitHub連携するのと、GitHub側の設定で「Integration>Application」でDatabricksを設定する、たったの二つだけの設定でできました。

![スクリーンショット 2024-08-25 13.43.41 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/f82d9291-66d0-330b-b5f2-6cfda6cf322e.png)

![スクリーンショット 2024-08-25 13.51.56 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/70fbb8af-b521-74f3-49e6-d3327faa3a37.png)

また、設定が足りない部分に関しては、Push時にエラーが出力され、具体的にどこでエラーになっているのか？（どこが不足しているのか？）を教えてくれます。
上記二つについても、こちらから設定方法がわかりました。

![スクリーンショット 2024-08-25 13.50.48 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/faba3994-06ae-c0fe-880c-fab8cb00fcb0.png)

※Pushした後、GitHub上には一般的なNotebookの拡張子である`.ipynb`ではなく、`.py`
で設定されました。
そのまま実行できるか？は未検証ですが、運用に載せる際、わざわざpyファイルに書き換える手間も省けるのでいい機能だなと思っています。

# まとめと次回予告
今回はPythonで実装されている、PyCaretを用いて、DatabricksのNotebook環境で実行できるか？についてやってみました。
PyCaretも使ってみたいと思っていたので触れて良かったですし、GitHubとの簡便的な連携やAIアシスト機能についても気がつくことができ、いいNotebookの操作練習となりました。

次回は、特徴量エンジニアリングを題材に、予測精度がどこまで向上するかについてお話ししたいと思います。
またその際には、データガバナンスのカタログ機能についても併せて紹介していきたいと思っております。

次回のお話をお楽しみに！！