OracleのAutoMLを使ってみる

## 1. 本記事について
2020年2月よりOracle Cloud上でAutoMLが利用できるようになっています。
本記事では、以下の内容について記述します。
・OracleのAutoMLを利用した機械学習モデルの構築、評価までの手順 (実施時間目安:2~3h)
・他AutoMLサービスとの性能比較

※AutoMLとは？
機械学習におけるアルゴリズム選択、ハイパーパラメータのチューニング、モデル評価の一連のタスクを自動化するサービス

## 2. 学習用の題材について
GoogleやMicrosoftが提供する主要なAutoMLサービスの比較を行ってくださっている
Qiita記事が既に存在するため、対象の記事から以下の2ケースをピックアップして実施し、
OracleのAutoMLと比較ができるようにします。
[AutoMLがすごいと聞いたので色々使って比べてみた](https://qiita.com/highno_RQ/items/71595fc402e5b3a55665 "AutoMLがすごいと聞いたので色々使って比べてみた")
・[ローン審査(2クラス分類)](https://qiita.com/highno_RQ/items/71595fc402e5b3a55665#521-%EF%BC%92%E3%82%AF%E3%83%A9%E3%82%B9%E5%88%86%E9%A1%9E "・2クラス分類")
・[サッカー選手のポジション判定(多クラス分類)](https://qiita.com/highno_RQ/items/71595fc402e5b3a55665#522-%E5%A4%9A%E3%82%AF%E3%83%A9%E3%82%B9%E5%88%86%E9%A1%9E "・多クラス分類")

## 3. Oracle Cloud アカウント登録
本記事では割愛します。
参考となる記事を記載しておきます。
[【OCI】oracle cloud -アカウントの登録編-](https://qiita.com/manaki/items/d8684f8e15ccf09bdc4e "【OCI】oracle cloud -アカウントの登録編-")
[Oracle Cloud Free Tierにアカウントを登録してみる(2020年1月版)](https://qiita.com/hrkt/items/223b02461bed5cee9d19 "Oracle Cloud Free Tierにアカウントを登録してみる(2020年1月版)")

※要クレジットカード情報
※無料トライアル枠があります

## 4. クラウド環境構築
### 4.1 コンパートメント作成
コンパートメントとは、Oracle Cloud上のネットワークやサーバーリソースを
論理的に区分して管理するための概念です。
※作成することで課金は発生しません
以下のページがわかりやすいです。
[コンパートメント – Oracle Cloud Infrastructure特有の概念](https://cosol.jp/techdb/2018/12/compartment_oracle_cloud_infrastructure/ "コンパートメント – Oracle Cloud Infrastructure特有の概念-")

・左上タブから[アイデンティティ]⇒[コンパートメント]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/317a7d57-8657-4fab-dad0-9b2df4bcb6db.png)
・[コンパートメントの作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/cc7b44ca-aef1-7c49-1636-fa81d21733b8.png)
・任意の名前、説明を入力し、[コンパートメントの作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/9ba6892b-ea36-3a3d-dc86-833b59326773.png)

### 4.2 ネットワークリソース作成
AWSでのVPCにあたるリソースを作成します。
※作成することで課金は発生しません。

・左上タブから[ネットワーキング]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/f2fece7c-6ac9-45e1-4d6f-a7d0c835689f.png)
・[インターネット接続性を持つVCNの作成]の下の[VCNウィザートの起動]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/149feac7-5a45-e941-3558-b3c454933d8d.png)
・任意のVCN名を入力し、先ほど作成したコンパートメントを選択、[次]を選択
※各CIDRブロックはデフォルトで入力されている値のままでも可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/53ee736a-2483-0ed3-e4da-5353746cac7e.png)
・[作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/7af7f77c-562a-3a50-a233-0926ff218082.png)
・完了画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/d5c141a6-7c2d-195f-8678-ce9894918c8b.png)


### 4.3 ポリシー作成(権限設定)
現在Oracle Cloudの管理コンソールにログインしているユーザに対し、
AutoMLを利用するためのサービスであるData Science Cloudに対する権限を付与します。
※設定することで課金は発生しません。
・左上タブから[アイデンティティ]⇒[ポリシー]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/dfd3febe-3d65-d52e-6b08-6624584507a8.png)
・[ポリシーの作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/603667c5-26dc-c01e-f676-8bb1c21ae361.png)
・任意の名前、説明を入力し、作成したコンパートメントを選択
・ポリシー・ビルダー欄にある[カスタマイズ(拡張)]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/fe959451-0860-ec91-8d89-2d7bedc8f832.png)
・出てきたウィンドウに以下のステートメントを入力し、[作成]を選択

```
allow group Administrators to manage data-science-family in compartment automl-test
allow group Administrators to use virtual-network-family in compartment automl-test 
allow service datascience to use virtual-network-family in compartment automl-test
```

### 4.4 機械学習環境構築
Data Science Cloudサービスを使用すると、
AutoMLを実行するための各種機械学習ライブラリがインストール済の
インスタンス(サーバー)を構築できます。
※インスタンスのシェイプ、起動時間に応じて課金が発生します。

・左上タブから[データ・サイエンス]⇒[プロジェクト]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/450d518e-9bdc-64d2-f7d4-2c2c20e46475.png)
・[プロジェクトの作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/fbd12732-252d-337b-add0-9826e71f2c9a.png)
・任意の名前を入力し、[作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/3672a447-f6f3-ae38-6bed-24277d18c9c4.png)
・プロジェクト作成完了画面から、[ノートブック・セッションの作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/e06b848e-1264-f21b-7696-338a8222bc86.png)
・任意の名前を入力し、学習用に使うインスタンスシェイプとストレージサイズを入力
 - VM Standard E2.2 ※2CPU
 - 50GB
・[作成]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/b9481d47-e574-7412-d1e4-04abebd1288f.png)
・作成完了画面から、[開く]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/9853549a-a263-c4c6-8faf-627b77d27cfb.png)
・Oracle Cloudへのログイン認証画面へ遷移するので、ユーザ名とパスワードでログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/a544ef38-3b5f-f6b1-003e-04aec9cbff09.png)
・Jupyter Notebook画面
※Scikit-learnなどの機械学習向けライブラリはインストール済の状態で起動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/3be2af37-40a9-1f83-e105-104b24513995.png)

## 5. 学習タスクの実施
ローン審査(2クラス分類)から実施します。
### 5.1 データロード
以下からcsvデータをダウンロードします。
・[データセット: ローン審査(2クラス分類)](https://github.com/ishida330/AutoAISampleData/blob/master/Tree_Credit.csv "・2クラス分類")

・Jupyter Notebookの[↑]アイコンを選択し、csvファイルをアップロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/561310df-8d34-9100-d433-bd981f30cbe3.png)

・Python 3のNotebookを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/58657b8b-e6a9-79d8-4f59-7430465d4204.png)

・各種ライブラリの読み込み

```python
%matplotlib inline
%load_ext autoreload
%autoreload 2
import csv
import pandas as pd
import logging
from ads.dataset.factory import DatasetFactory
from ads.automl.provider import OracleAutoMLProvider
from ads.automl.driver import AutoML
```
・csvをデータフレームに読み込み

```python
credit_df = pd.read_csv('credit.csv')
```
・データフレーム変換
※AutoML関連のライブラリを呼び出すための"ADS"と呼ばれるOracleのフォーマットに変換しています。

```python
credit_ads = DatasetFactory.open(credit_df).set_target('Credit')
```

### 5.2 データセットの確認
・以下のコマンド1つでデータセットの統計値と分布が表示されます。

```python
credit_ads.show_in_notebook()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/91b73550-1a2d-6191-f7a5-aef170b054e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/f04be59d-628b-03c2-fee9-b5ef0b1689b6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/951a748e-963f-556a-83b4-a2eda22101ad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/7a4cc72f-3a8f-f14c-5755-d09852f75dbd.png)


### 5.3 特徴量エンジニアリング
Data Science Cloudでは、欠損値を補完したり、不均衡データをサンプリングによって調整したり、といった特徴量エンジニアリングの作業を自動化できます。
今回は陽性のラベルとして"Good"(ローン審査をパス)を設定する点だけ推奨されています。

・推奨事項の確認

```python
credit_ads.suggest_recommendations()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/6147b444-5117-4679-8866-7057ac3d2ab1.png)
・推奨事項の適用

```python
credit_ads.set_positive_class("Good", missing_value=False)
```

### 5.4 AutoMLの実行
・学習データとテストデータに分割(比率9:1)

```python
train, test = credit_ads.train_test_split(test_size=0.1)
```
・AutoMLの実行

```python
## n_jobs...CPU数を指定 -1で学習に全てのCPUリソースを使用
## score_metric...最も優先する評価指標を指定
ml_engine = OracleAutoMLProvider(n_jobs=-1, loglevel=logging.ERROR)
oracle_automl = AutoML(train, provider=ml_engine)
automl_model1, baseline = oracle_automl.train(score_metric='accuracy')
```
・実行が完了するとサマリ画面が表示されます
※アルゴリズムはAdaBoostClassifierが選択されたようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/af1151fc-f641-03e3-9207-734724285ae3.png)

### 5.5 精度評価
・構築した学習モデルの各評価指標を確認します。
⇒ [各評価指標の意味](https://docs.cloud.oracle.com/en-us/iaas/tools/ads-sdk/latest/user_guide/eval/Binary.html "各評価指標の意味")

```python
from ads.common.model import ADSModel
from ads.evaluations.evaluator import ADSEvaluator
from ads.common.data import MLData

evaluator = ADSEvaluator(test, models=[automl_model1], training_data=train, positive_class='Good')
evaluator.metrics
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/6bc1ed08-962a-fbad-7c9a-24eaf7c88fa5.png)
※サッカー選手のポジション判定(多クラス分類)についても同様の手順で学習させます。
csvデータは以下からダウンロードします。
・[データセット: サッカー選手のポジション判定(多クラス分類)](https://www.kaggle.com/karangadiya/fifa19 "サッカー選手のポジション判定(多クラス分類)")
※予測対象のカラムが"Credit"⇒"Position"に変更となる点に注意してください。

## 6. 他AutoMLとの性能比較
・ローン審査(2クラス分類)  ※2CPUで学習
精度についてはほとんど変わらず、トレーニング時間は最短となりました。

|ツール  |F値  |適合率 | 再現率 |ROC AUC|トレーニング時間(min)|トレーニング費用(¥)|
|---|---|---|---|---|---|---|
|Google/AutoML Tables|0.805|0.861|0.756|0.850|40|1,415.5|
|IBM/AutoAI|0.832|0.834|0.831|0.888|5|92.0|
|Microsoft/AutomatedML|0.805|0.805|0.805|0.880|20.0|24.3|
|Sony/Prediction One|0.847|0.800|0.899|0.886|0.85|0.0|
|H2O Driverless AI|0.8513|0.809|0.898|0.851|12.3|---|
|<font color="Red">Oracle/AutoML</font>|0.8571|0.8716|0.8431|0.8809|0.66|12|
・サッカー選手のポジション判定(多クラス分類)  ※16CPUで学習
こちらも精度はそこまで大きく変わらずですが、トレーニング時間が最短。

|ツール  |F値  |適合率 | 再現率 |ROC AUC|トレーニング時間(h)|トレーニング費用(¥)|
|---|---|---|---|---|---|---|
|Google/AutoML Tables|0.574|0.774|0.456|0.972|5.53|11,655|
|IBM/AutoAI|0.585|0.585|0.585|---|17|19,040|
|Microsoft/AutomatedML|0.493|0.493|0.493|0.918|55.8(打ち切り)|4,068|
|Sony/Prediction One|0.437|0.526|0.374|---|0.78|0|
|H2O Driverless AI|0.613|0.602|0.625|0.967|1.67|---|
|<font color="Red">Oracle/AutoML</font>|0.5828|0.5828|0.5828|---|0.67|127|

## 7. まとめ
今回は2ケースのみの検証ですが、精度についてはそこまで大きな差は出ないという結果でした。
OracleのAutoMLについて注目すべき点としては、他のクラウド型のAutoMLサービスと比較して学習にかかる時間と費用が大幅に少ないという点でしょうか。
PaaS型のサービスにもかかわらず非常に安いです。

なお、Oracle以外は2020年1月時点の結果を拝借しているため、現時点では同じ検証でも結果が異なる可能性があります。

## 8. 参考
・[Data Science Cloud マニュアル](https://docs.cloud.oracle.com/ja-jp/iaas/data-science/using/data-science.htm "Data Science Cloud マニュアル")
・[Oracle AutoML マニュアル](https://docs.cloud.oracle.com/en-us/iaas/tools/ads-sdk/latest/user_guide/automl/automl.html#oracle-automl "AutoML マニュアル")