IBM Cloud上で機械学習モデルを簡単に作れる「Watson Machine Learning」を使ってみた★2017/11 Update

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/53e27b0d-d550-4557-02ce-0cc9dd3d4b27.png)

###### <Font color="red">【注】当記事は2017/08にアップしたのですが、2017/11に機能強化や画面変更がありましたので、2017/11月時点の情報でアップデートしました。</font>
- Bluemix→**IBM Cloud**に呼称を変更しました
- DSXを含め色々なサービスが「**Watson Data Platform**」の冠の下に統合されました。それに伴い画面が変わったので画像を取り直しました。
- WMLの2017/11月の機能拡張の詳細は[Automate the deployment workflow with Watson Machine Learning](https://www.ibm.com/blogs/bluemix/2017/11/deployment-workflow-watson-machine-learning/)をご参照ください。当記事では分量の関係もあり、全てを網羅していませんが、要は下記です。
    1. **継続的な学習( Continuous Learning )**
    2. 機械学習モデルのバージョン管理
    3. xgboost モデルのサポート
    4. Python clientの提供
- 以前の記事との差分として新機能に言及した箇所は :new:で表記します。

# はじめに
こんにちわ！以前「[IBM Cloud上のLiteプラン(ずっと無料)でData Science Experience(DSX)が使えるようになったので、触ってみた　★2017/11 Update](http://qiita.com/ishida330/items/db496801290279aa015d)」の最後で少しだけご紹介した**Watson Machine Learning(以下WML)**が2017/08/01付でIBM Cloud上で[GA(正式提供開始)になりました。](https://www.ibm.com/blogs/IBMCloud/2017/08/ibm-watson-machine-learning-general-availability/) 無料のLiteプランでもご利用頂けます。触ってみたので、どんなサービスなのか簡単にご紹介しますね。

（以下は記事執筆時点(2017/11月）のものです。Flowなど一部機能がベータなので先々、画面が変わっていたり機能が強化されていたらすいません。）

# Watson Machine Learningとは？

昨今流行の**機械学習の「モデル作成」から「性能評価～デプロイ～利用(スコア)～フィードバック」までのフル・ライフサイクルの生産性向上**を目指した製品/サービスです。データサイエンティストの方はDSX上のUIから迅速・簡単に使うこともできますし、デベロッパーの方はAPIを使ってアプリに組み込むこともできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/23c2d036-0b0f-f8d8-4782-b88272f7d29e.png)

- 昨年、SPSSベースのスコアリングサービス「Predictive Analytics」が「Watson Machine Learning」と改名しました。今回は同サービスにSpark/Scikit-Learnベースのサービス群が追加になったものです 
- Watsonという名前が付いていますが、**Watson Developer Cloud(WDC)上のWatson API群とは違うもの**です。WDC上のAPI群はチャットボットに代表されるような言語や画像など非構造化データの処理が得意ですが、Watson Machine Learningはもっとデータ・サイエンス寄りで、機械学習モデルを使って顧客の離反や融資可否の判断などの「予測」を行うモノです
- 分野としては（身もふたもない言い方をすれば）「Amazon Machine Learning」や「Azure Machine Learning」と同じカテゴリーのもの、と思っていただいてよいかと思います

# WMLの目指す姿と現状(2017/11月時点)

WMLは最終的に「**チームでのデータ分析プロジェクトの全ライフサイクルをカバーする**」ことを目指しています。つまり単に機械学習モデルを作るだけではなく、モデルを評価/デプロイ/スコアリングし、モデルの品質を監視し、劣化があればモデルにフィードバックするまでを視野に入れています。（カッコ良く言うと「Self-Learning」でしょうか）:new: 2017/11の機能強化で**モデルの品質を裏でモニタリングし、所定のしきい値以上に劣化した場合には通知したり再トレーニングしてくれる機能**が追加されました。（ご興味あれば記事[Watson Machine Learningの継続的学習システム( Continuous Learning System )を試してみた](https://qiita.com/ishida330/items/7bdbf180b0f523d84d50)をご参照ください）またDSX上で簡単にモデルを構築できるUIやウイザードが提供されていますが、これらはベータとの位置づけです。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c48f5974-0ec7-7b93-8ba1-0a933df77c77.png)

以下、現時点利用可能な機能の前提環境や制約の主なものを[Supported Frameworks](https://console.bluemix.net/docs/services/PredictiveModeling/pm_service_supported_frameworks.html#supported-frameworks)から抜粋・列挙します

- Spark 2.0 MLlib(※1) / Anaconda 4.2.x for Python 3.5 Runtime with scikit-learn 0.17 / :new: XGBoost 0.6 with Python 3.5
- 現在利用できる機械学習モデルは**「クラス分類(Classification)」と「回帰(Regression)」**のみ。つまり「教師あり学習」として様々な「予測」（例. 離反可能性の予測や購入代金の推定）はできますが、「クラスタリング」(例. 似ている顧客をグループ化する) や、「パターン発見」(例. おむつとビールの関係を見つける)はできません
- スコアリングのモードと利用可能な環境
:new:2017/11の強化で自動モデル構築でバッチやストリーミングも指定できるようになってました！

| モード | 自動モデル構築 | フロー   | API    | ドキュメント |
|:---|:--------:|:--------:|:--------:|:---|
| リアルタイム | ○ | ○ | ○ | [Deploying online models](https://console.bluemix.net/docs/services/PredictiveModeling/pm_service_api_spark_online.html?pos=2#deploying-online-models) |
| バッチ | :new:○ | × | ○ | [Deploying batch models](https://console.bluemix.net/docs/services/PredictiveModeling/pm_service_api_spark_batch.html?pos=2#deploying-batch-models) |
| ストリーミング | :new:○ | × | ○ | [Deploying streaming models](https://console.bluemix.net/docs/services/PredictiveModeling/pm_service_ui_spark_streaming.html?pos=2#deploying-streaming-models) |

※Spark 2.0 MLlibにはRDDベースのSpark MLlib(古い)とDataFrameベースのSpark ML(新しい)の両方が含まれますが、新しいSpark MLも当然利用できます

# で何がいい？

1. 品質・性能の高いモデルを迅速に作成できます
    - データに最もフィットしたアルゴリズムを迅速に最適化(Cognitive Assistant for Data Scientists (CADS) )
    - モデルに最適なパラメーターを自動的に提示(Hyper Parameter Optimization (HPO) )
1. 専門家でなくとも簡単にモデルを作れます
    - DSXからウイザード形式でモデルを簡単に作成・トレーニング(Model Builder)
1. :new: 継続的にモデルをモニターし、改善します(2017/11機能強化)
    - モデルの正確さを継続的にモニターし、過去の実績からデータをフィードバック
1. モデルを既存のアプリやツールと簡単に統合できます
    - データ・サイエンティストやデベロッパーなど、分析チームでのコラボを簡単に行えます(DSX / REST API )
1. モデルの管理プロセスをシンプルに行えます
    - エンタープライズ環境での多数のモデルの簡単なデプロイ( UIから1クリック、または REST API） 

# 具体的にどんな環境？

DSXと同様に「役割・好みに応じた適切なツール」をご提供します。データサイエンティストの方向けには自動モデル構築のウイザードやSPSSのような感じのフローがあり、デベロッパーの方向けはJupyter Notebookなどでガンガンとコーディングしていただくことが可能です。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a0d0b551-9ca0-92de-0194-1694e9a1345b.png)

# プログラミングについての補足

現状、WMLが独自にご提供するのはプラットフォーム上にモデルを公開・デプロイするためのREST API群やモデル最適化のためのライブラリー群であり、業務に直結する機械学習モデルの作成自体はSparkならSpark MLの、SKLearnならSKLearnの**標準のAPIを使ってコーディングすればよいだけ**です。つまり、業務に関わるロジックについてはオープンであり、プロプラエタリな環境にロックインされるような懸念はありません。（このあたりはDSX上に公開されている各種のNotebookのコードを見ていただけばご理解いただけるかと思います）

以下は整理のための絵ですが
①機械学習モデルの構築時に利用可能な言語
②機械学習モデルの本番デプロイや管理を行う際に利用可能な言語（＝WMLのREST APIをたたく言語)
③デプロイした機械学習モデルを使ってRESTでスコアリング要求を出す言語 
は異なります。
①は環境に依存しますのでSparkならScalaかPython, Scikit-learnならpythonを使う必要がありますが、②③はREST APIであり任意の言語を使えます。（まあJupyter Notebook上でコーディングする場合は①②は一連のものとして同じ言語になることが多いでしょうが)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/756d5bf3-b5d0-aabe-2642-f5b69b3ed277.png)

# ご提供形態

WMLはパブリック・クラウド上のSaaSだけでなく、プライベート・クラウドも含めた様々な形態でご利用頂けるが特長です
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/95701e85-d5e0-5d56-e24e-b199e4e39809.png)

# プランや価格は?

以下は記事執筆時点での[プランをカタログから抜粋](https://console.bluemix.net/catalog/services/machine-learning)しますが、先日発表された**「ずっと無料」のライト・プランでもモデルを5つまでデプロイできる**のでお試しには十分でしょう。DSXもライトプランの対象ですので、両方使って無料で色々試せます。ただライトプランでの予測が5000件/月までなので、本格的なスコアリングを業務で使うには足りなそうですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/38bde07a-703d-229e-78e5-d483fa24c9a6.png)

# ということでやってみる
一番皆様がご興味あるであろう、自動モデル構築（Model Builder)をやってみます。
ネタ: [Tutorial: Build a logistic regression model with Watson Machine Learning](https://datascience.ibm.com/docs/content/analyze-data/ml-example-log-regress.html)

### 1. シナリオ

アウトドア商品を販売している会社が、ロジスティック回帰のモデルを使って顧客がテントを買うか/買わないか、その期待度を予測します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/91576f78-f86c-efbe-ca25-ec5977400e4a.png)

データは以下のような簡単なもので、①性別(GENDER) ②年齢(AGE) ③婚姻状況(MARIAL_STATUS) ④職業(PROFESSION)から 買うか・買わないか( IS_TENT)を予測します。 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/70b23f14-c024-3e6f-46e5-144b1cccbfed.png)

### 2. IBM Cloud上でWMLサービスを作成する

まずIBM CloudのカタログからMachine LearningのLite Planを選択してサービスを作成します。(DSX内で新規作成もできますが、まあ一応先に)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/98dc4294-cd76-4370-599d-4913bc8805a4.png)

サービスの名前はお好みで。
:warning: Liteプランの時は「デプロイする地域」は「米国南部」にしてください。2017/11月時点ではLiteプランで利用できるのは「米国南部」のみです。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ad93aefa-95d0-5ea2-1b10-9004668b77fd.png)

### 3. サンプルデータを準備する

 [ここ](https://apsportal.ibm.com/exchange/public/entry/view/ba9a3008817bbf458eea4980294e618b)からGoSales_Tx_LogisticRegression.csvをPCにダウンロードします( ログインするとダウンロードのボタンが出てきます)
 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2d141afd-4c40-914b-9514-03643b367eb8.png)

ダウンロードしたファイルをDSXのプロジェクトに追加しましょう。DSXで①プロジェクトを開き　②「Asset」タブを選択し　③右側で「Load」タブ　を選んだら、今ダウンロードしたファイルを(Object Storageに)アップロードできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0959b6ad-a8a1-5fb3-d8cf-3e6b3f097006.png)

プロジェクトにデータが追加できました。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c096ea01-ce93-72e8-ea6b-8ce4def0c96c.png)

### 4. DSXのプロジェクトでWMLを使えるようにする

IBM Cloud上のData Science Experienceにログインしてコンソールを開きます。(サービスを未作成の場合は[この記事](http://qiita.com/ishida330/items/db496801290279aa015d)など参考にDSXのサービス・インスタンスを作成してください)
その後、「New Model」をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c5c1850a-57e3-5509-a944-359683b246e0.png)

お好きなモデル名とモデルを格納するプロジェクトを選びます。（プロジェクトが無ければ作成します）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/049df048-02a0-8dc4-e7d6-c46b7bfe76c3.png)

初回はプロジェクトにWMLのインスタンスが関連付けられていませんので、「Associate a Machine Learning service instance」のリンクをクリック。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b442051c-ffc0-f2bb-3a1b-aa5b2b2ebc23.png)

WMLのインスタンスを指定する別パネルが開きます。既にインスタンスは作成済なので「Exsisting」を選択し、先程作成したインスタンスを指定して「Select」ボタン。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/efca26a3-8349-6fd1-a419-2d3eb49f7619.png)

パネルが閉じ、元の画面に戻るので「Reload」すると指定が反映します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e9e47dbe-f6e9-97a4-27d5-53e556ef10cb.png)

DSXで定義されているSparkのインスタンスを選択し、モデルの構築方法として今回は「Manual」を選択して「Create」ボタン。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c47c7394-0b2a-6ce2-b90a-1f9468300679.png)


### 5. モデルを作り評価する

ここからは実際にモデルを作ります。まずは右上「Add Data Assets」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3e0259bc-146b-368c-7805-d2586c48d434.png)

先程アップロードしたファイルを選択して「Next」ボタン。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/734abf8e-ba01-4143-7b6c-0999f68155cd.png)


しばしお待ちください。内部的にはここで[Automatic Data Preparation](https://datascience.ibm.com/docs/content/analyze-data/ml-pipelines.html)が行われます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/532fd9ee-5253-06c6-55e2-b66c8ad638e8.png)

次のパネルでトレーニング内容を指定します。① 予測したいフィールドの指定で「IS_TENT」を選択します。②は入力となるフィールド群で、そのままにします。すると③で自動的に「Suggested technique」として「Binary Classification」がお勧めされます。WMLはAutomatic Data Preparationで各フィールドの値や傾向をサンプリングでチェックし、IS_TENTフィールドは「TRUE/FALSE」の2値しかないことを知っています。なので「二値の予測ならBinary Classificationがいいんじゃね？」と推奨できるわけです。これでいいので、このまま進みます。④右上の「Add Estimators」をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b5c9629a-3fe7-938f-ea45-4f404e4f874f.png)

次のパネルではEstimatorを選択します。Estimatorとは実際のモデル構築手法です。WMLは様々なEstimatorを提供していますが、今は「Logistic Regression」を選択して「Add」します。ここで複数のEstimatorを選択することもでき、その場合はそれぞれについてモデルの評価が行われますので「一番成績のいいモデル」を選ぶこともできます。とりあえず今は１つだけとします。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4284e0c4-941f-d86d-5074-58e2ee90683c.png)

ご参考) 以下が手法とEsitimatorのサマリーです。色々ありますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/591413d9-8963-aacb-8003-6db6ffe3b388.png)

Estimatorが選択されると下部にValidation Splitが表示されます。入力データを自動的に①モデル構築用②モデル品質評価用(Holdout)③テスト用に分割してくれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a7277411-df70-01a1-5876-b538c3a988f9.png)

「Next」ボタンでパネルが切り替わりモデルの構築と評価が行われます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/bb2bbd05-bb42-38ee-66bc-1080edfd115e.png)

できました。PERFORMANCE欄は「Fair」になっています。これは「モデルの品質がまあ、いい」ということを意味しています。「Poor（いまいち）」「Fail（ダメダメ」などの値が表示されることもあります。これらはモデルの品質に関する指標であり、いずれにせよデプロイは可能です。(特に「Fail」は「処理が失敗した」のではなく「品質が良くない」ことを示しているだけで処理は完了していますので誤解なきよう！）他にもROCやPRなどモデル品質に関する評価結果が見られます。このまま、「Save」します。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4e0e6987-6961-d0f7-eefc-3e96afaca14d.png)

### 6. モデルをデプロイする

Saveできたら以下の画面になります。モデルの評価やデプロイメントのタブがありますね。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/84dcb2bc-b424-a083-2106-fa362a434f83.png)

「Deployments」で「Add Deployment」

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2c4c5b3c-ed04-662a-38c3-bbd01014bce3.png)

2017/11の拡張でデプロイメントの形式として①WebService ②Batch Prediction ③Real-time Streaming Predictionsの3種類が選べるようになりました。今回はRESTのWebサービスにしましょう。「WebService」タブでサービスにお好みの名前をつけて「Save」ボタン。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4490b79b-dd6d-c2cd-fe0d-d5a3f99b8fa3.png)

これで実行環境へのモデルのDeployが成功しました。マジで１クリックですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b8dd006b-2f24-e81a-6dc5-8c83242499f4.png)

### 7. モデルを使う(スコアリングを行う)

すでにモデルは本番環境に反映していますので、任意のアプリケーションからのREST呼び出しでスコアリングを行うことができます。DSXではAPIをテストする機能がありますので、これでスコアリングをしてみます。

デプロイされたモデル名をクリックします

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b06f7cc1-9264-85a0-d3d8-cf1b9bf252a1.png)


次のパネルで「Test」タブを選択するとIS_TENTの値を予測するための入力データが指定できるようになるので、適当なデータを入力して「Predict」ボタンを押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/230e8257-49ac-5d25-1579-fb087e6f5bfe.png)

すると右側に予測結果と確信度が表示されます。この例では、予測結果は「FALSE（買わない）」で、その確信度は84.24%です。よろしければフィールドの値を変えて、色々試してみてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/89628fa2-b03d-8b00-99c9-876daeb02b02.png)

【ご参考】
右上のマークで右側をクリックするとチャートではなく実際のjsonのレスポンスが表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2aee2026-559b-f6f4-6b46-4cbd3bd70efc.png)

当該サービスをプログラムから呼び出したい場合は「Implementation」タブを見ればAPIのエンドポイントや言語別のコードスニペットが見られます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/700ca6e6-cd67-fd13-ae1d-b23aa5b0c377.png)


以上、簡単ですが自動モデル構築の例でした。
（「フロー」もご紹介したかったんですが、長くなったので[別の記事](http://qiita.com/ishida330/items/f36c6206637fbc97cf07)にて公開しました。）

# デベロッパーの方向けには? (Jupyter環境でのプログラミングによるモデル作成やAPIの使いかたなど）

[このBlog](https://www.ibm.com/blogs/bluemix/2017/08/ibm-watson-machine-learning-general-availability/)の「Integration with Data Science Experience」のところに以下のNotebookへのリンクがあります。DSXにアップロードして実際に動かすことももちろんできますよ。特に上の２つは題材が今回の「テントの予測」と同じものなので、今回の操作をプログラム的にどうやるか、を知るにはもってこいの教材です。

- [Scala Jupyter Notebook end-to-end tutorial: Train, Save and Deploy a SparkML model](https://dataplatform.ibm.com/exchange/public/entry/view/d80de77f784fed7915c1435351309e93)
- [Python Jupyter Notebook end-to-end tutorial: Train, Save and Deploy a SparkML model](https://dataplatform.ibm.com/exchange/public/entry/view/d80de77f784fed7915c14353512ef14d)
- [Scala Jupyter Notebook Auto-Modeling with Cognitive Assistance (CADS)](https://dataplatform.ibm.com/analytics/notebooks/e56e3449-a2a4-43e9-80e5-6d05de49f162/view?access_token=cb3be1025c544c805d5762f308c7cc0877aa39e21e666b9f36a4d5a5a98ab0c9)
- [Building Predictive Apps on Bluemix Sample application “Customer interest in sport products prediction using Spark MLlib](https://github.com/pmservice/product-line-prediction)

# :new: 新機能Continuous Learning Systemについて

2017/11に強化された注目機能「継続的学習」については[Watson Machine Learningの継続的学習システム( Continuous Learning System )を試してみた](https://qiita.com/ishida330/items/7bdbf180b0f523d84d50)で書きましたが、以下URLだけご紹介しときます。特に「ドキュメント」については具体的な使いかたが書いてある唯一のページにもかかわらず、なぜかWMLのドキュメントの左側の目次からは辿れず、ページが埋もれています!   (=この直のURLを知らないとアクセスできないんです。:worried:）ので、とりあえずここに書いておこうと思った次第です。
:warning:あ、あと日本語の文書は更新日が古いことがあるので、必ず本文の下にある言語選択では英語を選んでから読んでくださいね！
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/64400d79-9886-b30a-b945-158ce13382f7.png)

ブログ:[Lifelong (machine) learning: how automation can help your models get smarter over time](https://www.ibm.com/blogs/bluemix/2017/10/lifelong-machine-learning-automation-can-help-models-get-smarter-time/)
ドキュメント:[Continuous learning system](https://console.bluemix.net/docs/services/PredictiveModeling/pm_service_api_spark_learning_system.html#continuous-learning-system)
プログラミング:[Use of Continuous Learning System to select the best heart drug with IBM Watson Machine Learning](https://dataplatform.ibm.com/analytics/notebooks/57bd0753-ccee-42bd-9d11-099a981e4fbe/view?access_token=40b77775b209dab516811a695ba1d5dbcab2dfb260c910daf3d985c9d4570325)

あ、ちなみにIBM Cloud(Bluemix)の全ドキュメントはGitHubにも公開されているんで、そっちを見る、って手もありますよ。[こんなの](https://github.com/IBM-Bluemix-Docs/PredictiveModeling/blob/master/pm_service_api_spark_learning_system.md)、です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/67880bb2-fbd7-8514-1c9e-066dc681a045.png)

# ご参考) ドキュメントやURL
- [Getting started with Machine Learning](https://console.bluemix.net/docs/services/PredictiveModeling/index.html) 
    - 英語ドキュメント~日本語版は古いようなので英語を見たほうがよさそうです
- [IBM CloudカタログのWatson Machine Learning](https://console.bluemix.net/catalog/services/machine-learning?env_id=ibm:yp:us-south&taxonomyNavigation=apps) 
    - プランや価格など
- [Service API](http://watson-ml-api.mybluemix.net/) 
    - APIについてのドキュメント
- [Watson Machine Learning overview](https://datascience.ibm.com/docs/content/analyze-data/ml-overview.html) 
    - DSXでのWMLのドキュメント

以上です。