【AzureML】データの入出力を自作して自由度を上げてみる【Python】

今回はサンプルデータの`Multiclass Classification - Letter Recognition`を利用してみたいと思います。
また、入出力部分をpythonスクリプトにすることでデータストアとして設定していないコンテナのデータも取得できるようにしてみたいと思います。

ワークスペースやクラスターの作成、実行方法等は[最初の記事](https://qiita.com/K-Nomu3/items/6b9c89b958380ea67b64)を参考にしてください。

# サンプルを開く
今まで二項、回帰とやってきましたが今回は多項分類のパイプラインのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/e143f9a4-0a01-b0a3-3862-202a04d79266.png)
一番左のカラムを予測するみたいですね。
多項分類は複数項目のうちどれかを予測するようなモデルになります。
二項の項目が増えた感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/f781f395-152d-aabd-c05e-01a05f0dafff.png)
アルゴリズムが変わった以外は大きな変化はなさそうです。

左では二項のアルゴリズムブロックを利用していますが、`OneVsAllMulticlass`というブロックが二項を利用して複数の項目を予測するモデルを作るアルゴリズムらしいので、おおもとの二項のアルゴリズムを指定してあげてるのだと思います。
それでは実行してみましょう。


# サンプルの内容
データは上部で確認しているので、予測結果と精度について確認してみましょう。
まずは予測結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/10534561-c304-5c4f-184e-654b865acd7e.png)
このような形で取得できていました。
二項のスコアみたいなデータが項目ごとに出力されてますね。
値の一番大きいデータが予測結果となるようですね。

続いて予測の評価についてです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/773444d6-36e0-624f-7dbd-d9b628a81f8b.png)
評価指標がいくつか出力されていますね。これを見ながらモデルの精度を高めていくことになりそうです。


# サンプルをいじってみる

それでは冒頭でもいったようにデータの入出力の部分を変更してみたいと思います。
[こちら](https://docs.microsoft.com/en-us/azure/machine-learning/component-reference/execute-python-script)に標準で利用できるライブラリの一覧がありました。azure.storage.blobがあるので今回はこれを利用して、データストアに登録していないコンテナで入出力したいと思います。
ブロックはこのように繋げました。
importDataを変更し、評価指標を出力できるようにつなげています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/0e2f7ed1-8857-6ba8-94a9-8e7f510ceb56.png)


まずは入力部分のコードです。
```python
import pandas as pd
import io
from azure.storage.blob import BlockBlobService

def azureml_main(dataframe1 = None, dataframe2 = None):
    service = BlockBlobService("<ストレージアカウント名>", "<アクセスキー>")
    data = service.get_blob_to_text("azuremloutput", f'exportdata/multidata.csv').content
    return pd.read_csv(io.StringIO(data)),
```
接続したいストレージアカウントを設定します。
その後、`get_blob_to_text`でコンテナ名、パスを指定し`content`でデータを取得します。
このデータはテキストになっているので、`read_csv`を用いてDataFrameに変換しています。
一時ファイルとしてデータをダウンロードしたくなかったのでget_blob_to_textを利用して、io.StringIOを用いてテキストを変換できるようにしています。

続いてデータの出力部分です。

```python
import pandas as pd
from azure.storage.blob import BlockBlobService

def azureml_main(dataframe1 = None, dataframe2 = None):
    service = BlockBlobService("<ストレージアカウント名>", "<アクセスキー>")
    service.create_blob_from_text("testpythonupload", f"eval/mutli.csv", dataframe1.to_csv())
    return "success",
```
このようにします。
接続したいストレージアカウントを設定し、出力先を`create_blob_from_text`で指定している形になります。
また、渡すデータはテキストである必要があるので`to_csv`を用いて変換しています。

では結果を見てみましょう。
importする部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/c8ee2f48-64c7-9c6c-a9eb-120178d0cbbc.png)

ちゃんとデータが読み込めているようです。
続いてExportの部分です。
こちらはblobが生成されているのかを確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/237051be-e7f9-c6dc-526a-3954e7ad8462.png)
ちゃんとデータが生成されていますね。

# まとめ
今回は多項分類のサンプルを動かしてみました。
また、データの入出力部分をpythonを用いて実装してみました。
これによりデータストアを作成していないコンテナを利用することができるようになりました。
自由度が増したことでいろんなデータを利用したり活用できるようになったかなと思います！