OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)を試してみた

# はじめに
Oracle Machine Learning for Python (OML4Py)は、Oracle Autonomous Databaseのデータに対して統計および機械学習分析を実行するためのPython APIです。
本記事は[Oracle, Live Labs](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=786&p210_wec=&session=3370094538240)を参考にしています。

# 本記事の前提条件 
* OCI Always Freeのアカウントを取得していること
* サンプルデータをダウンロードしていること
[Oracle, Live Labs, Lab1, Task2](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=786&p210_wec=&session=3370094538240)の「CLICK HERE」と書かれているリンクからダウンロードできます。
# 作業の大まかな流れ

- [ADWインスタンスの構築](#adwインスタンスの構築)
- [OML4Pyを始める](#oml4pyを始める)
- [透過層を使用したデータの選択および操作](#透過層を使用したデータの選択および操作)
- [データベース内アルゴリズムおよびモデルの使用](#データベース内アルゴリズムおよびモデルの使用)
- [Pythonオブジェクトおよびユーザー定義関数の格納および管理](#pythonオブジェクトおよびユーザー定義関数の格納および管理)
- [Embedded Python Executionsを使用したユーザー定義の関数の実行](#embedded-python-executionsを使用したユーザー定義関数の実行)
- [AutoMLの使用](#automlの使用)

# 実際にOML4Pyを使ってみた

### ADWインスタンスの構築

1. コンパートメントの作成
OMLという名前でコンパートメントを作成します。OCIのコンソール画面のハンバーガーメニューから、コンパートメントを選択します。「コンパートメントの作成」ボタンから以下のように、作成を行います。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた0-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/706a6c1a-258c-2604-d016-5810fea6f385.png)

1. ADWインスタンスを作成
再び、ハンバーガーメニューからAutonomous Databaseを選択します。以下の画像の左側のように、OMLコンパートメントを選択し、「Autonomous Databaseの作成」ボタンを押します。

    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた0-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/0813cdee-547f-aba3-867e-9c2d18f714f8.png)

    詳細情報を以下のように入力し、ADWを作成します。

    |  入力項目       |       入力内容 |   
    |:-----------------:|:------------------:|
    | 表示名      |  OML_LABS  |   
    | データベース名      |  OMLLABS |   
    | ワークロード・タイプの選択 | データ・ウェアハウス | 
    | デプロイメント・タイプの選択 |  共有インフラストラクチャ| 
    |データベースを構成します  |    Always Freeのトグルをオンにする  |
    | パスワード |  Welcome12345# (例)|
    |ネットワーク・アクセスの選択|	すべての場所からのセキュア・アクセス|
    |ライセンスとOracle Databaseエディションの選択|	ライセンス込み|


1. OMLユーザーを作成
ADWが使用可能になったら、詳細画面からデータベース・アクションに接続します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた0-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/f9f36db5-c866-89df-99d8-844c25d46cec.png)

以下のようにSQLの項目を押して、OMLUSERを作成するSQL文を入力していきます。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた0-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/cb37592a-35ce-f2dd-0da7-94deffe3b810.png)

以下のSQL文をワークシートに入力します。

```
-- The following commands should be run before running the labs, 
-- since it creates the OML users required to 
-- sign-in to OML Notebooks 

-- Click F5 to run all the scripts at once

-- Drop the schema OMLUSER
BEGIN
      EXECUTE IMMEDIATE 'DROP USER OMLUSER CASCADE';
      EXCEPTION WHEN OTHERS THEN NULL;
END;
/  

-- Drop the schema OMLUSER2
BEGIN
      EXECUTE IMMEDIATE 'DROP USER OMLUSER2 CASCADE';
      EXCEPTION WHEN OTHERS THEN NULL;
END;
/

CREATE USER OMLUSER IDENTIFIED BY "Welcome12345#";
GRANT DWROLE TO OMLUSER;
GRANT OML_DEVELOPER TO OMLUSER;
ALTER USER OMLUSER GRANT CONNECT THROUGH OML$PROXY;
ALTER USER OMLUSER QUOTA UNLIMITED on DATA;

CREATE USER OMLUSER2 IDENTIFIED BY "Welcome12345#";
GRANT DWROLE TO OMLUSER2;
GRANT OML_DEVELOPER TO OMLUSER2;
ALTER USER OMLUSER2 GRANT CONNECT THROUGH OML$PROXY;
ALTER USER OMLUSER2 QUOTA UNLIMITED on DATA;
```

   ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた0-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/e8510dc5-4a48-079d-8ab0-d39337eaa17b.png)

 ユーザーOMLUSERとOMLUSER2が、初期化された状態で作成されます。

### OML4Pyを始める
1. 起動パッドに戻り、「ORACLE MACHINE LEARNING」の項目を押します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/28f298b4-533b-5173-b5bf-24e0fc082cee.png)

1. 以下のようなログイン画面が出るので、ユーザー名: OMLUSER、パスワード: Welcome12345#を入力します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/90913325-e782-55e8-6320-d6b1092f4f49.png)

1. Oracle Machine Learningのホーム画面が表示されます。クイック・アクションメニューの「ノートブック」を選択します。

    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/4c8c0926-4c83-23c6-a381-55b99d6ec9df.png)

1. 事前にダウンロードしたノートブックファイルをOMLノートブックにインポートします。
   ・インポートを押します。
   ・今回使用するノートブック(JSONファイル)を1度にすべて選択し、「開く」をクリックします。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/765c7220-1ce1-d7e5-7f47-00f93fbb571a.png)

1. ノートブックが正常にインポートされたら、Lab1をクリックして表示します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/5c6fa099-6735-bfae-5150-2e1a2439d683.png)
    OMLノートブックはセッションをロードし、ノートブックを編集可能にします。


1. OMLノートブックおよびインタプリタを使用してみます。
OMLノートブックには、インタプリタ・バインディングのデフォルトのリストが含まれており、接続されているAutonomous Databaseに対してスクリプトを実行するために使用します。本記事では、インタプリタ・バインディングを"データベース名_medium"に設定します。
ノートブックの右上隅にあるインタプリタ・バインディングのアイコン(歯車)をクリックして、使用可能なインタプリタ・バインディングを表示します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/bed413bd-34c3-caa4-829e-0fa47ae7f965.png)
    
1. デフォルトのサービスはlowです。ここで、mediumインタプリタを上へドラッグし、リストの最初に表示されるようにして、デフォルトにしました。Saveを押して、設定を保存します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/a7931319-66c0-5747-493b-a7cbb50a0084.png)

インタプリタは、Oracle Machine Learningノートブックで特定のデータ処理言語を使用するためのプラグインです。
段落を複数追加でき、各段落はSQL、PL/SQL、Pythonなどの異なるインタプリタを使用できます。
1. Python用のインタプリタを使います。
まず、各段落の結果を確認できるように、ノートブック全体を実行します。ノートブックの名前の前にあるRun all paragraphsアイコンをクリックし、OKをクリックして確定すると、下記のように内容が更新されます。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/d70707f8-ae4f-ff0c-4c46-f50a74ea36cf.png)
    
    
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/616d8391-bd95-0b91-6cc9-31611bd81b4f.png)
 
1. 実行した結果を画面をスクロールしながら、確認していきます。
OML4Pyモジュールを使用するためには、omlモジュールをインポートする必要があります。以下のPythonコマンドを入力して、omlモジュールをインポートし、実行アイコンをクリックします。(すでに実行済みなので、ここでは特に何も操作する必要はありません)
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/3d7427a7-fdfe-0153-2f5a-a9e1df1d49dc.png)

1. デフォルトのインタプリタバインディングを使用すると、OMLノートブックは自動的にノートブック用のデータベース接続を確立します。
Pythonインタプリタがomlモジュールを介してデータベース接続を確立したことを確認するには、次のコマンドを実行します。


    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/8f9a821e-e832-c78a-e5db-9029bd6ebfa3.png)

    ノートブックが接続されると、Trueを返します。

1. サンプルデータを表およびビューにロードし、すべてのユーザーにアクセス権を付与します。

    ノートブック「Lab 1a: Run Me First - OML4Py table created and grant」を開きます。

    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/b1ff74de-7098-704c-a61d-9c4c7488eec4.png)
    
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/a4fa56c7-d8df-1d16-11f6-957bab893fa8.png)

1. 先ほどと同様に、デフォルトのインタプリタの設定を変更し、ノートブック全体を実行してください。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/0cb3f873-eebd-b313-176e-97d61727012f.png)

1. すべての段落の実行が終了し、「PL/SQL procedure successfully completed」というメッセージが表示されているの最後の段落に、現在の時刻が表示されるまで待ちます。

    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた1-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/81a50ad1-56bb-2f80-8fc0-6e624031e3bf.png)


### 透過層を使用したデータの選択および操作

透過層クラスを使用してデータを操作し、データの探索的分析を実行する方法を見ていきます。

透過層クラスを使用すると、選択したPythonオブジェクトをOracle Autonomous Databaseオブジェクトに変換できます。これにより、ユーザーは、オーバーロードされた一連の使い慣れたPython関数を呼び出して、データベース内の表の対応するSQL文を起動できます。

このチャプターでは、次のことを確認できます。
・oml.push関数を使用して一時表を作成します。
・プロキシ・オブジェクトを使用した表の行および列の操作
・pandas.DataFrameオブジェクトの操作
・append、concatおよびmerge関数を使用したデータの操作
・split関数とKFold関数を使用したデータのパーティション化
・OML DataFrameプロキシでのクロス集計およびpivot_table関数の使用
・oml.boxplotおよびoml.hist関数を使用したプロットの作成
・OML4Py Transparency Layer関数を使用したデータの管理と探索
・cx_Oracle関数を使用したPythonからのSQL問合せの送信

1. Lab2をクリックし、開きます。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/d1fc549a-f858-0ba5-7921-743b50a4ac13.png)

1. 再びインタプリタの設定を変更し、ノートブックを実行します。
1. 実行ができたら、画面をスクロールして実行結果を確認します。
* Task1: ライブラリのインポートおよびOracle Machine Learning DataFrameプロキシ・オブジェクトの作成
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/de98bf36-e164-2699-c024-4f8effe523cf.png)
    
* Task2: プロキシ・オブジェクトCUST_DFを使用した表の列の選択
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/1d1a355e-5cff-0f8b-3d1b-811be37d2f26.png)
    
* Task3: プロキシ・オブジェクトCUST_DFを使用した表の行の選択 
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/c23311fd-03c3-c3b6-456d-e924a7967189.png)
    
* Task4: OML DataFrameプロキシ・オブジェクトの使用    
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/07bf041a-43e3-9834-4e6b-01413230689e.png)
    
* Task5: split関数およびkfold関数の使用    
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/860b68cc-7c17-4d70-e239-3447afbd7486.png)
    
* Task6: DataFrameプロキシ・オブジェクトでのクロス集計関数およびpivot_table関数の使用     
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/0980efed-1137-b066-8ba1-9df1d4f8eccc.png)
    
* Task7: oml.boxplot関数およびoml.hist関数の使用    
OML4Pyには、データをグラフィカルに表示するための関数が用意されています。oml.boxplotとoml.hist関数は、箱ひげ図やヒストグラムをデータベース内で生成するために必要な統計量を計算します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/c8b02e70-448f-b536-ac49-a0a74c90f35b.png)
    
* Task8: 透過層の機能を使用したデータの管理と探索  
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/e3c6db46-c4b3-65f1-2651-803aeb19b18d.png)
    
* Task9: cx_Oracle関数の使用
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた2-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/de1a609f-5c51-a2b0-015a-787c1c9f6646.png)




### データベース内アルゴリズムおよびモデルの使用
OML4Pyで使用可能な機械学習アルゴリズムと機能(Generalized Linear Models (GLM)、K-Means クラスタリング、パーティション化されたモデル、およびモデルの説明可能性)について見ていきます。

このチャプターでは、次のことを確認します。

・回帰を使用した数値の予測(一般化線形モデル(GLM))
・k-meansを使用したクラスタリングの操作
・パーティション化されたモデルの操作
・モデルの説明可能性機能の使用

1. Lab3をクリックし、開きます。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/b34db428-2b7d-d570-a4e2-36dc49754836.png)

1. これまでと同様に、インタプリタの設定を変更し、ノートブックを実行します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/8054aacf-2a53-b672-1ebf-0badd187f995.png)
 
3. 実行結果を見ていきましょう。
* Task1: ライブラリのインポート
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/51bf3b52-aa6d-bded-596f-2c79aeb20621.png)
    
* Task2: GLMを使用した回帰の処理    
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/c1a265cd-0f4c-ca10-bbbd-fa7a4b3d2c9c.png)
    
* Task3: k-Means法を使用したクラスタリングの処理     
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/08e9a039-1843-9820-d579-f897c276c3d1.png)
    
* Task4: パーティション化されたモデルの処理
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/3aed0875-bfbc-6e68-95f2-e9c79b5a77ec.png)
    
* Task5: モデルの説明可能性を使用した属性評価のランク付け   
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/722d9ea0-aff2-c06c-29bf-773ca78a901a.png)


### Pythonオブジェクトおよびユーザー定義の関数の格納および管理
OML4Pyデータストアおよびスクリプト・リポジトリを使用および操作するステップを確認できます。
詳しくは、[Oracle, LiveLabs, Lab4](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=786&p210_wec=&session=3370094538240)を参照ください。
    
### Embedded Python Executionsを使用したユーザー定義関数の実行
このステップでは、OML4Py Embedded Python Execution関数を使用してカスタムしたPythonコードを実行する方法を確認しました。
詳しくは、[Oracle, LiveLabs, Lab5](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=786&p210_wec=&session=3370094538240)を参照ください。
    

### AutoMLの使用
最後に、AutoML機能を使用するための手順を確認します。

以下のような手順を追います。
・CUSTOMER_INSURANCE_LTVデータベース表のPandas DataFrame(OML DataFrame)プロキシ・オブジェクトを作成し、現在の顧客の行動に基づいて保険を購入する対象者を予測
・automl.AlgorithmSelectionを使用して、BUY_INSURANCEターゲットを分類するための予測スコア・メトリックでデータベース内アルゴリズムをランク付け
・automl.FeatureSelectionを使用して、トレーニング・データおよび選択したアルゴリズムに最も関連する機能サブセットを識別
・automl.ModelTuningを使用して、選択したアルゴリズム・ハイパーパラメータを調整
・automl.ModelSelectionを使用してデータベース内上位アルゴリズムを選択し、チューニングしたモデルを1つの関数で返す

1. Lab6ノートブックを開きます。
これまでと同様に、インタプリタの設定を変更し、ノートブックを実行します。
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/c8f301df-0339-4a19-739e-e02a2d624f85.png)
    
1. 実行結果を画面をスクロールしながら見ていきます。
* Task1: OML4PyおよびAutoMLをサポートするライブラリのインポート  
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた6-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/d4235a70-fcb7-6bb5-6b17-d658222efda9.png)
    
* Task2: アルゴリズムの選択     
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた6-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/ecd64491-8c41-bc66-f172-6df7c391b76e.png)
    
 * Task3: 特徴の選択
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた6-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/b7ac213c-8445-fdda-411d-68817be5b536.png)
    
 * Task4: モデルのチューニング     
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた6-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/f1de7dd6-10d3-2074-cfb5-213d49238ca0.png)
    
* Task5: モデルの選択 
    ![OCIのAlways Free環境で、Oracle Machine Learning for Python (OML4Py)をやってみた6-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/8b82ffc2-b855-ceb2-6830-e19a40b7c01d.png)

サンプルデータを用いてOML4Pyの概要をざっと見ていきました。
# まとめ
本記事ではOML4Pyを用いて、Autonomous Database環境で生成されたPythonエンジンでユーザー定義のPython関数を実行し、自動化されたアルゴリズムと特徴選択、およびモデルの選択とチューニング等を行ってみました。


# 参考資料

* [Oracle, Live Labs, 
Introduction to Oracle Machine Learning for Python on Autonomous Database](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=786&p210_wec=&session=3370094538240)
* [Oracle, Help Center, Oracle Machine Learning for Pythonリリース1.0](https://docs.oracle.com/cd/F44706_01/index.html)