Oracle Database Cloud Service上で機械学習環境を構築してみた

#機械学習とは?#
過去データから予測するというフローのなかで、機械学習によって予測モデル自体を機械が過去データから学習して自動的に作り上げることができます。
大量のデータの中から、属性の相関を散布図などで見比べて手探りで分析しているケースも多いと思いますが、機械学習を利用することによって、経験や勘だけに頼らずに、数学的なアルゴリズムをベースに自動的に予測モデルを作り上げることができます。

#機械学習プラットフォームを構築するにあたって#
最近はいろいろな言語のライブラリも充実しているため、ノートpcでも簡単に機械学習が実行できる時代になりました。
ただ、実際にプラットフォームとして継続的な使用を考えると学習用データや結果データの格納先がほしくなり、ライブラリだけでなくデータを管理するプラットフォームの必要性がでてきます。

機械学習プラットフォームを構築するにあたってポイントとなることを列挙しました。

+ アルゴリズム
+ 操作性
+ パフォーマンス
+ データ管理
+ ジョブ管理
+ セキュリティ

####アルゴリズム####
アルゴリズムとしては、分析で使用したいアルゴリズムがあるかどうかがポイントとなります。
機械学習をつかえると謳うサービスは多いですが、その中に自分の行いたい分析にマッチしたアルゴリズムがあるかは重要となります。

####操作性####
プログラム言語のAPIからGUIツールまで幅広くあるため、自分のスキルレベルにあった操作方法を持つかは重要になります。

####パフォーマンス####
データ量が多ければ、分析の精度が上がりやすくなります。大量のデータを扱えるパフォーマンスを持つかは重要となります。

####データ管理####
大体のデータがすぐに分析できる形になっていない場合が多いため、データ結合や加工処理、データ連携などが行える環境が必要となります。

####ジョブ管理####
分析が業務に組み込まれていく場合には、ジョブとして定期的に分析フローを回せる状態になっていると運用面がとても楽になります。

####セキュリティ####
分析対象のデータは顧客の過去の行動ログなど一般的な業務データに比べて重要なデータのケースが往々にしてあります。データを格納するプラットフォームがセキュリティを満たせるものかどうかが重要になります。

並べてみると分析というよりもインフラ視点が強いかもしれませんが、分析とは意外と地味な作業が多いものです。

#Oracle Database Cloud Service上で機械学習環境を構築してみよう#
前置きが長くなりましたが、[Oracle Database Cloud Service (DBCS)](https://cloud.oracle.com/ja_JP/database)上に作成されたデータベースに機械学習環境を構築してみようと思います。
構築までの流れは以下の4stepとなります。データベース作成の待ち時間も含めて2時間程度で完了できます。実際に手を動かす時間としては30分程度で完了する手順となっています、

1. DBCS上にデータベースを作成する
2. [Oracle SQL Developer](http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/overview/index.html)をクライアントにインストールする
3. Oracle SQL DeveloperでDBCS上で作成したデータベースに接続する
4. [Oracle Data Miner](http://www.oracle.com/technetwork/jp/database/options/advanced-analytics/odm/dataminerworkflow-168677-ja.html)のプラグインをOracle SQL Developerにインストール

##1. DBCS上にデータベースを作成する##
作成にあたりSSH公開鍵が必要となりますので、事前に暗号鍵を[PuTTy](http://www.putty.org)などで作成しておきます。
[Oracle Database Cloud Service](https://dbaas.oraclecloud.com/dbaas/faces/dbRunner.jspx)のページにログイン後、**サービスの作成**をクリックして必要な情報を記入していきます。

![dbcscreateDB.png](https://qiita-image-store.s3.amazonaws.com/0/108610/a5af2443-b173-ce6a-fbe8-e131f5aae9f3.png)

最初はサービス・レベルを選択します。Virtual Imageの方が請求金額は安いですが、インストール作業をGUIで済ませられる通常の**Oracle Database Cloud Service**を今回は選択します。
![dbcscreateDBstep2.png](https://qiita-image-store.s3.amazonaws.com/0/108610/11e75b71-b57a-6845-a015-313ed868b121.png)

次に課金体系として毎時か毎月[^1]のものかを選択します。今回は**毎月**を選択します。
[^1]: 毎月の場合、月単位でしかクラウド上のインスタンスを止めたりして節約することはできないが、毎時のものをひと月起動し続けた場合に比べて、20%ほど安い価格となります。
![dbcscreateDBstep3.png](https://qiita-image-store.s3.amazonaws.com/0/108610/a4a6bb38-93fd-7a72-7acd-70cf8e4546d1.png)

サービス・レベルと課金体系を選択したら、データベースのバージョンを選択します。機械学習は11gでも使用できますが、今回は最新の**Oracle Database 12cリリース1**を選択します。
![dbcscreateDBstep4.png](https://qiita-image-store.s3.amazonaws.com/0/108610/c2851a4a-619a-69ea-fad8-76385d4a8a85.png)

ここまでは特にどちらを選択しても影響はありませんでしたが、ソフトウェア・エディションの選択には注意が必要です。[^2]
[^2]: Enterprise Edition(EE)では、Oracle Enterprise Editionの全ての機能+表領域暗号化(デフォルトon)が使用できます。Enterprise Edition ― High Performance(EE-HP)では、Real Application Cluster, In-Memory, Active Data Guard以外の全てのオプションが使用できます。Enterprise Edition ― Extreme Performance(EE-EP)では、Real Application Cluster, In-Memory, Active Data Guardを含むすべてのオプションが使用できます。価格は、EE-EP, EE-HP, EE, SEと順に安くなっていきます。
機械学習機能はOracle DatabaseのOracle Advanced Analytics Optionに含まれているため、High Performanceまたは、Extreme Performanceを選択します。今回は**Enterprise Edition ― High Performance**を選択します。
![dbcscreateDBstep5.png](https://qiita-image-store.s3.amazonaws.com/0/108610/2efc84a6-0dd0-64e3-10d3-4cae34a0a7b2.png)

サービスの詳細を記載します。ここでは主にサービス構成やデータベース構成、バックアップの有無を決めていきます。今回は、サービス構成としてはサービス名を**OracleML**として、**1 OCPU 7.5GBメモリ**の最小構成で作成していきます。作成しておいた公開鍵を選択します。データベース構成としては、領域は250GBとして、パスワードを設定し、データベース名(SID)を**ORCL**、PDB名を**PDB1**とします。バックアップは**なし**を選択します。
![dbcscreateDBstep6.png](https://qiita-image-store.s3.amazonaws.com/0/108610/98be3401-9cc6-a439-4376-88bc620ee4cc.png)

最後にこれまで設定した値の確認を行い問題がなければ**作成**ボタンを押してデータベースを作成します。
![dbcscreateDBstep7.png](https://qiita-image-store.s3.amazonaws.com/0/108610/8ec73eeb-19a7-b4c0-bf5d-9ff8ca567c35.png)

[Oracle Database Cloud Service](https://dbaas.oraclecloud.com/dbaas/faces/dbRunner.jspx)のページに先ほど作成したサービス名のものが砂時計のアイコン付きでステータスがIn Progressで表示されているのを確認できると思います。Oracle Databaseのイメージがインストールされるのに1時間程度かかりますが、DBCS上にデータベースを作成する手順はここまでとなります。完了後は砂時計のマークがなくなり、ステータスの項目が消えます。
![dbcscreateDBstep8.png](https://qiita-image-store.s3.amazonaws.com/0/108610/f6dae1fb-ef83-13ee-028f-e6f6946f979b.png)


##2. Oracle SQL Developerをクライアントにインストールする##
Oracle SQL DeveloperはOracle Databaseのフリーの開発環境です。後述するOracle Data Minerというプラグインを入れることによって、Oracle Databaseの機械学習の分析フローを開発するツールとしても利用することができます。

Oracle SQL Developerのインストールには[ダウンロードページ](http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html)からライセンス同意書に対して同意し、クライアントのOS[^3]に対応したものをダウンロードします。
[^3]: 2016年1月時点で最新のバージョン4.1.3はWindows 7,8,10とWindows Server 2008/2012, Linux または Mac OS Xに対応しています。また、実行にはJava version 1.8以上が必要となります。

今回はクライアントはWindowsの環境として、Windows用の[ダウンロードリンク](http://download.oracle.com/otn/java/sqldeveloper/sqldeveloper-4.1.1.19.59-x64.zip)をクリックすると、sqldeveloper-x-x.zipのようなファイルがダウンロードされます。

空のフォルダを作成し、そこで先ほどのzipファイルを解凍すればOracle SQL Developerのインストールは完了です。

##3. Oracle SQL DeveloperでDBCS上で作成したデータベースに接続する##

まずは、DBCS上に作成したデータベースの接続情報を確認します。[Oracle Database Cloud Service](https://dbaas.oraclecloud.com/dbaas/faces/dbRunner.jspx)のページから先ほど作成したサービス名をクリックすると詳細ページを確認できます。ここの**追加情報(show detail)**をクリックすると接続文字列などの情報が確認できます。Oracle SQL Developerの接続で必要な情報は、パブリックIPと接続文字列の1521/以降の文字列となります。下の図の赤い四角で塗りつぶした箇所が該当します。
![dbcscreateDBstep9.png](https://qiita-image-store.s3.amazonaws.com/0/108610/f76c2cea-27d5-b4fe-4db4-6614d41552c7.png)

それでは、先ほどインストールしたOracle SQL Developerを起動します。解凍するとsqldeveloperフォルダがあり、その直下のディレクトリに**sqldeveloper.exe**が存在するはずです。こちらを実行することによって、Oracle SQL Developerを起動できます。

DBCS上のデータベースは初期状態では22番ポートしか空いていないため、sshトンネリングを活用して接続します。Oracle SQL Developerの**表示**タブから、**ssh**を選択するとSSHホストというウィンドウが表示されます。ここから、**SSHホスト**を右クリックすると、**新規SSHホスト**と表示されますので、そちらを選択します。
Nameには任意の名前を指定できますが、今回は**DBCStunnel**と入力し、ホストには先ほどDBCSで作成したデータベースのパブリックIPを記入します。ユーザー名は**oracle**を指定します。鍵ファイルの仕様をチェックし、DBCS上のデータベース作成に使用した公開鍵の対となる**暗号鍵へのパス**を選択します。Oracle Databaseの接続にはリスナー接続を利用するため、1521ポートへのポートフォワードを設定します。**Add a Local Port Forward**のチェックボックスを選択し、名前はそのまま**Default**とし、ホストを**localhost**、ポートを**1521**とします。**OK**を押すとSSHホストウィンドウに今回作成した名前の項目が表示されます。
![sqldeveloper10.png](https://qiita-image-store.s3.amazonaws.com/0/108610/7e83ea73-d12f-da22-0a22-ccef0b744ccc.png)

接続ウィンドウにある接続を右クリックすると、**接続の作成**が表示されますので、そちらを選択します。任意の接続名を入力できますが管理者用の接続をまずは作成したいので、今回は**admin接続**とします。ユーザー名は**sys**とします。パスワードはDBCSでデータベースを作成したときに作成したときと同じものを入力します。パスワードの保存を有効にすると次回から接続の際にパスワードが聞かれなくなります。今回はテスト環境の為、有効にしますがセキュリティ上は有効にしないことを推奨します。
接続タイプから**SSH**を選択し、ロールで**SYSDBA**を選択します。ポート転送の欄から先ほどSSHホストで作成したものを選択します。SID[^4]でなく、**サービス名**を選択し、DBCSで作成した**データベースの接続文字列の1521/以降の文字列**を入力します。
[^4]: SIDに対して接続するには、接続文字列でなく作成したデータベースのSIDを入力します。12cでSIDに接続した場合、PDBでなく、CDBに接続することになります。
**テスト**を選択し、無事に接続ステータスが成功になることを確認できましたら、**接続**を押します。これで、DBCS上に作成したデータベースへの接続は完了です。

![sqldeveloper11.png](https://qiita-image-store.s3.amazonaws.com/0/108610/0a5db54d-c651-5c56-fe64-b16e7f0be882.png)

##4. Oracle Data MinerのプラグインをOracle SQL Developerにインストール##

Oracle Data MinerのプラグインはOracle SQL Developerからインストール可能です。プラグインは特定のユーザーのスキーマに対して、Oracle Data Miner用のリポジトリが作成される形となります。

先ほど作成した、SYSDBA権限を持ったユーザーで接続し、Oracle Data Miner用のユーザーを作成します。先ほど作成したadmin接続の**+**アイコンを選択し表示された項目から、**他のユーザー**を右クリックすると**ユーザーの作成**が表示されますので、そちらを選択します。
ユーザー名、ログイン用パスワード、デフォルト表領域、一時表領域を入力します。**付与されたロールタブ**から、**CONNECT**を選択します。割当て容量から、デフォルト表領域で指定した表の項目で**無制限**を選択します。SQLタブから実際に発行されるSQLが確認できますが、こちらのSQLをデータベースで直接流すことによっても同様のユーザーを作成することができます。今回はユーザー名を**dmuser**、パスワードも仮置きでdmuserとし、デフォルト表領域を**USERS**、一時表領域を**TEMP**とします。**適用**を選択するとSQLが発行され、ユーザーが作成されます。

![sqldeveloper12.png](https://qiita-image-store.s3.amazonaws.com/0/108610/92b594a6-0b74-a70e-f49b-5d24d407e22c.png)

先ほど作成したユーザーに対しても同様の手順で**接続**を作成します。先ほどはロールでsysdbaを選択しましたが、今回はsysdba権限は必要ないので、**デフォルト**を選択します。

Oracle SQL Developerの**ツール**から**Data Miner->表示**と選択します。Data Minerのウィンドウが表示されるので、**接続**を右クリックし、**接続の追加**を選択します。Connectionで先ほど作成したユーザーを選択し、OKを選択します。

選択したユーザー名がData Minerのウィンドウの中に表示されますので、そのユーザーを選択します。一番初めに選択したときは、リポジトリがインストールされていませんというポップアップウィンドウが表示されます。**はい**を選択肢します。

![sqldeveloper14.1.png](https://qiita-image-store.s3.amazonaws.com/0/108610/f5590545-d6c8-3797-ca43-04fc2dd8a9d6.png)
パスワードはDBCSでデータベースを作成したときのものとなります。
![sqldeveloper14.2.png](https://qiita-image-store.s3.amazonaws.com/0/108610/ca4a696f-0d10-f0de-15a9-d66725df2c5e.png)
デフォルト表領域と一時表領域を選択します。
※なぜか一時表領域と表示されるはずのところにもODMRSYSと表示されている。。
![sqldeveloper14.3.png](https://qiita-image-store.s3.amazonaws.com/0/108610/dca304f1-91e1-90fb-2e34-d76f64bb25b8.png)
デモ・データもインストールするかチェックボックスから選択して、開始を押せばあとは待つだけです。大体10分程度の時間でインストールは完了します。
![sqldeveloper14.png](https://qiita-image-store.s3.amazonaws.com/0/108610/1c51b08b-86b2-2a85-28c9-e4781e8d8a54.png)

Oracle Database Cloud Service上で機械学習環境構築はこれで完了となります。
[次回](http://qiita.com/ogamiki/items/68a6fe94389668f1db41)はこの環境で実際に機械学習を行ってみたいと思います。

#注釈#