Azure Machine LearningのJupyter Notebookを使ってみる

[Azure Machine Learning](http://azure.microsoft.com/ja-jp/services/machine-learning/)はMicrosoftが提供しているクラウドベースの機械学習のサービスです。

Azure Machine LearningではGUIを使って様々な機械学習の手法を実行することができますが[Jupyter](https://jupyter.org/)を使用することも可能となっています。

# Azure Machine LearningでJupyter Notebookを使う

Azure Machine LearningのはMicrosoftアカウントをもっていれば無料で試すことができます。Jupyterも無料のプランで使えます。

価格についての詳細は下記のリンクを参照してください。

[料金 - Machine Learning | Microsoft Azure](http://azure.microsoft.com/ja-jp/pricing/details/machine-learning/)

## Microsoftアカウント作成

Microsoftアカウントをもっていない場合にはリンク先から作成します。

[ホーム｜Microsoft アカウント](http://www.microsoft.com/ja-jp/msaccount/default.aspx)

## ワークスペース作成

下記リンクを開き「Get Started」ボタンをクリックし、Microsoftアカウントにサインインします。

[Microsoft Azure Machine Learning Studio](https://studio.azureml.net/)

「Workspace Not Found」と表示された画面になったら再びブラウザで[Microsoft Azure Machine Learning Studio](https://studio.azureml.net/)を開いて「Get Started」ボタンを押します。

成功していれば無料のワークスペースが作成されており以下のような画面が開きます。

![スクリーンショット 2015-09-06 21.28.26.png](https://qiita-image-store.s3.amazonaws.com/0/15114/d8b1d625-fa4b-18d9-1034-f09ef35cd630.png)

## Jupyter Notebookの作成

画面左下の「+NEW」をクリックすると以下のような画面が開くのでNOTEBOOKからPythonのバージョンを選択します。

![スクリーンショット 2015-09-06 21.32.36.png](https://qiita-image-store.s3.amazonaws.com/0/15114/98900bfd-3fd7-ca42-02f0-1d019b2490ee.png)

今回はPython2を選択してみます。Notebookの名前を訊かれるので適当に入力します。

NOTEBOOKSに作成したJupyter Notebookが表示されているのでクリックして開きます。

![スクリーンショット 2015-09-06 21.34.39.png](https://qiita-image-store.s3.amazonaws.com/0/15114/85d76bae-35b3-da70-b17c-31f41627093b.png)

空のNotebookが開きます。この後は通常通り使用できます。

![スクリーンショット 2015-09-06 21.37.55.png](https://qiita-image-store.s3.amazonaws.com/0/15114/16cd620b-7776-d38f-9677-de45b83e284c.png)

## 使用可能なライブラリ

Azure Machine LearningのJupyterは[Anaconda](https://store.continuum.io/cshop/anaconda/)を使用しており、以下のリストのパッケージが使用可能となっています。

[Anaconda Package List — Continuum documentation](http://docs.continuum.io/anaconda/pkg-docs)

Anacondaのバージョンが2.1と少し古くパッケージによっては最新ではない場合があります。

# Azure Machine LearningとJupyter Notebookの連携

Azure Machine LearningのJupyter NotebookにはAzure Machine LearningのPythonクライアントがインストールされています。これを利用してAzure Machine Learningの操作やデータのやり取りが可能です。

[Azure/Azure-MachineLearning-ClientLibrary-Python](https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python)

## ワークスペースに接続する

まず現在使用しているワークスペースに接続します。接続のために必要なワークスペースのIDとトークンはstudioのSETTINGSから確認することができます。

```py
from azureml import Workspace
ws = Workspace(
    workspace_id="YOUR_WORKSPACE_ID", 
    authorization_token="YOUR_AUTHORIZATION_TOKEN",
    endpoint="https://studio.azureml.net"
)
```

## データセットを使用する

使用できるデータセットは以下のようにして確認できます。

```py
ws.datasets
```

使用したいデータセットの名前を指定してデータを取得し、```to_dataframe```でデータフレームに変換することができます。

```py
df = ws.datasets['Bike Rental UCI dataset'].to_dataframe()
```

## Experimentからデータを取得する

Experimentの中間データをJupyterで取得するためには「Convert to CSV」にデータを入力します。

![スクリーンショット 2015-09-19 15.22.39.png](https://qiita-image-store.s3.amazonaws.com/0/15114/82664b08-ff56-a00f-4a41-81b1a2d4970f.png)

「Convert to CSV」の出力ポートをクリックし「Generate Data Access Code」を選択すると中間データをデータフレームとして取得するためのコードが表示されます。
（ワークスペースへの接続のコードも表示されますがendpointが設定されていないとエラーがでました。[上記](#ワークスペースに接続する)のようにendpointを追加したら動きました。）

## JupyterのデータをAzure Machine Learningのデータセットに追加する

Jupyterで操作しているデータをAzure Machine Learningのデータセットに追加することができます。

データセットに追加する際には```add_from_dataframe```を使用します。

```py
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston

boston = load_boston()
df = pd.DataFrame(
  np.column_stack([boston.data, boston.target]),
  columns=boston.feature_names
)

dataset = ws.datasets.add_from_dataframe(
    dataframe=df,
    data_type_id='GenericCSV',
    name='boston',
    description=boston.DESCR,
)
```

## Webサービスを作成する

JupyterからWebサービスを作成することもできます。

例えば次のコードを実行するとaddというするWebサービスが作成されます。

```py
from azureml import services

@services.publish(ws.workspace_id, ws.authorization_token)
@services.types(a = float, b = float)
@services.returns(float)
def add(a, b):
    return a + b
```

## 既存のWebサービスを使用する

既存のWebサービスをJupyterから使用することもできます。

Jupyterで作成したWebサービスを使用すると認証が通らずうまくいかなかったためGUIで
足し算をするサービスを作成しJupyterから使ってみます。

![スクリーンショット 2015-09-20 0.39.27.png](https://qiita-image-store.s3.amazonaws.com/0/15114/9d2c183a-81da-6346-a596-9df937cd49fa.png)

「Execute Python Script」の中身は次のようになっています。

```py
def azureml_main(dataframe1 = None):
    dataframe1['c'] = dataframe1.a + dataframe1.b
    return dataframe1
```

これをWebサービスとしてデプロイすると次のように2つの数字を足し算してくれるサービスができます。

![スクリーンショット 2015-09-20 0.42.41.png](https://qiita-image-store.s3.amazonaws.com/0/15114/32305a32-b3c1-a687-527d-977fc9603b34.png)

![スクリーンショット 2015-09-20 0.43.37.png](https://qiita-image-store.s3.amazonaws.com/0/15114/8718c0a9-a11b-1738-2da4-9ac1eeeac147.png)

このWebサービスをNotebookから使用するためには次のようにデコレータを使って関数を定義します。
urlとapi_keyは作成したWebサービスのダッシュボート、REQUEST/RESPONSEのヘルプページから取得できます。

```py
from azureml import services

url = 'WEB_SERVICE_URL'
api_key = 'WEB_SERVICE_API_KEY'
@services.service(url, api_key)
@services.types(a = float, b = float)
@services.returns(float)
def add(a, b):
    pass
```

この関数をWebサービスとして使用することができます。（初回は実行まで少し時間がかかります。）

![スクリーンショット 2015-09-20 0.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/15114/c0609a08-0333-9b87-1647-b8dca1ffd488.png)

# 最後に

まだクライアント・Jupyterからできないことも多いですが、今後連携機能が強化されていきそうなので楽しみです。Azure Machine Learningは例が多く用意されているのでJupyterで途中結果を詳しくみたり、グラフを書いたりすると面白そうです。

# 参考資料

* [Introducing Jupyter Notebooks in Azure ML Studio - Machine Learning - Site Home - TechNet Blogs](http://blogs.technet.com/b/machinelearning/archive/2015/07/24/introducing-jupyter-notebooks-in-azure-ml-studio.aspx)
* [Machine Learning Python クライアント ライブラリを使って Python のデータ セットにアクセスする | Microsoft Azure](https://azure.microsoft.com/ja-jp/documentation/articles/machine-learning-python-data-access/)