【詳解】Azure Machine Learning Studioで行うデータ分析&機械学習モデル開発

こんばんは。今日は、Azure Machine Learning StudioというAzure上のサービスを使ってデータ分析・機械学習のモデル構築などを行えるようにしていきたいと思います。

このサービス、AWSを使ったことのある方向けの説明としては、Sage Makerに対応するサービス、といえば伝わりやすいかもしれません。

それではさっそくまいります。以下の手順に従って進めていけば、事前に準備しておくべき物は特にはありません。

Microsoft Azureアカウントの取得

こちらは、過去のこちらの記事を参考にしていただければと思います。

Azure Machine Learning ワークスペースの作成

Azureにログインしたら、Azure Machine Learningのリソースを選択して、ワークスペースの作成を行います。設定する情報はリソースグループ、ワークスペース名、リージョンといったベーシックな情報なので、お好きな情報を設定いただければと思います。

Azure Machine Learningワークスペースの作成

ワークスペースを作成して、リソースの概要ページに移動します。

ここで見て分かるのですが、ワークスペースを作成すると、同時にストレージアカウントとKey Vaultが作成されています。

Azure Machine Learningスタジオの起動

Azure Machine Learningスタジオの起動

Azure Machine Learningから、Azure Machine Learningスタジオを起動します。

Azure Machine Learningスタジオのホーム画面

スタジオで、「Notebook」を選択します。この画面は、ローカルのJupyterや、AWS SageMakerでもおなじみの画面です。.ipynb形式ファイルをアップロードすることで、すぐにプログラムの利用が可能になります。

Notebooks画面

と、ここで、プログラムを実行しようとすると、コンピューティングに接続されていません、とのワーニングが表示されます。

画面右上の「+」ボタンを押して、コンピューティングの追加を行います。ここで指定するのは、マシンの種類(CPU/GPU)、マシンのサイズ、ネットワーク設定です。

マシンの種類は、作業の種類によって最適なものを選びます。

コンピューティングの追加画面

コンピュートを作成すると、いよいよNotebookを利用する準備は整いました!

コンピューティングが接続されたNotebook画面

データの準備

さて、Notebookが使えるようになったところで、データセットを準備します。今回は、Kaggleで公開されているタイタニックの生存者データを利用してみたいと思います。

Kaggle Titanic画面

Notebookでデータを使う方法として代表的なものは2つあります。

  • 登録されたデータセットにデータを登録して使う
  • Notebookにデータをアップロードして使う

データセットを登録する

Azure Machine Learningスタジオには、データセットを登録する機能があります。

この機能を使うことで、以下のことができるようになります。

なので、個人のアドホックな分析で利用する範囲であれば、わざわざ登録せずとも後者の、直接NotebookのディレクトリにアップロードすればOKですが、チームで共有したり、モデルなどの運用に利用するのであれば、登録しておいた方が効率的です。

それでは登録方法です。

事前に登録するデータセットをローカルにダウンロードしておきます。Azure Machine Learningスタジオの「データセット」ブレードから、「ローカルファイルからデータセットを作成する」を選択します。

データセットの登録画面1

アップロードするデータを選択します。

データセットの登録画面2

登録が完了したら、データセット一覧に表示されるようになります。

データセットの登録画面3

ちなみに、登録されたデータセットの実体は、登録時に指定したストレージアカウントに格納されています。

データが登録されたストレージアカウント

データを使用するには、Notebookから以下のコードを実行します。コードを見ると分かりますが、この操作にはazuremlライブラリを使います。

このコードを実行することで、Notebookの指定したダウンロードパスにデータセットがダウンロードされます。こちらのコードでは、Azure Machine Learning Studio SDKが利用されています。Machine Learning Studioからコードを実行する場合には、標準で使えるようになっているので問題はないですが、ローカル環境などAzureの外の環境から操作する場合には、SDKのインストールを行っておく必要があります。

Azure Machine Learning SDK

Azure Machine Learning SDK for Python とは
https://docs.microsoft.com/ja-jp/python/api/overview/azure/ml/?view=azure-ml-py

インストール方法
https://docs.microsoft.com/ja-jp/python/api/overview/azure/ml/install?view=azure-ml-py

from azureml.core import Workspace, Dataset

subscription_id = 'xxxxxx'
resource_group = 'xxxxxx'
workspace_name = 'xxxxxx'
 #Machine Learningワークスペースの名前

workspace = Workspace(subscription_id, resource_group, workspace_name)

dataset = Dataset.get_by_name(workspace, name='Titanic') #データセット名を指定
dataset.download(target_path='datas', overwrite=False) #データをダウンロードするフォルダを指定
登録したデータをNotebookで使う

Notebookの「datas」フォルダ配下に、先ほどのデータがダウンロードされました!

直接Notebookにアップロードする

こちらは、とてもシンプルです。Notebook左側ペーンから、ディレクトリ作成+ファイルのアップロードを行うことで、先ほどと同じ状況を直接作ります。

Notebookに直接データを登録する

さて、これでデータを利用する準備が整いました!

続いて、データ分析に必要な基本的な操作を確認していきます。

データ分析

続けて、簡単なデータ分析を行ってみます。ここでは、以下の手順を確認します。

  • ライブラリの追加
  • 各種ライブラリのバージョンチェック
  • 分析コードの実行
  • 自分に最適なUIに切り替える

ライブラリバージョンの確認

はじめに、一例ですが、標準インストールされているライブラリとそのバージョンについても確認しておきます。

Seabornなどはなぜか標準装備ではなかったですが、LightGBMやSHAPなどの機械学習系ライブラリはちゃんと入っていました。

Python・標準インストールされたライブラリのバージョン(2020年10月時点)
  • Python:3.6.9
  • Scikit-Learn:0.22.2(最新が0.23なので、少し古いようです)
  • LightGBM:2.3.0(こちらも、最新が3.0なので、少し古い模様)

ライブラリの追加インストール

データ分析や、この後の機械学習モデルの開発で使うライブラリで不足しているものがあれば、ローカルのJupyterと同じく、Notebook経由でインストール可能です。

*社内利用などで、Machine Learningスタジオ環境をインターネットを遮断したネットワークで運用している場合は、これができない可能性もあります。

必要なライブラリのインストール

分析コードの実行

## %matplotlib inline
import matplotlib.pyplot as plt
from datetime import datetime, date, timezone, timedelta
import seaborn as sns
import warnings
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os, gc

##############################
## データセットのダウンロード(先ほどのコードと同じ)
##############################
from azureml.core import Workspace, Dataset

subscription_id = 'xxxxxx'
resource_group = 'xxxxxx'
workspace_name = 'xxxxxx'
 #Machine Learningワークスペースの名前

workspace = Workspace(subscription_id, resource_group, workspace_name)

dataset = Dataset.get_by_name(workspace, name='Titanic') #データセット名を指定
dataset.download(target_path='datas', overwrite=False) #データをダウンロードするフォルダを指定

##############################
## データセットの読み込み
##############################
PATH = '~/cloudfiles/code/Users/★Notebookディレクトリ名(メールアドレス)★/datas/'

df_train = pd.read_csv(PATH+'train.csv')
df_test = pd.read_csv(PATH+'test.csv')
display(df_train.info())
display(df_train.head())

## データセットの可視化
sns.pairplot(df_train)

実行結果ですが、表示されるセルの幅がローカルJupyter Labなどと比較すると狭く、右側のスクロールを2つ使わないといけず、地味にちょっと面倒に感じてしまいますが、グラフの表示などは、ローカルのJupyterと同じような見た目です。

Notebookでのデータ分析画面例

自分に最適なUIに切り替える

っと思っていたら、Azure Machine LearningスタジオでJupyter/Jupyter Labを使えるようです!これはJupyter/Jupyter Labユーザには大変嬉しい!!

Jupyter Labに切り替える

メニュー>Jupyter>Jupyter Labで編集、を選択すると、見慣れたJupyter Labの画面が起動しました!

Azure Machine LearningスタジオのNotebookをJupyter Labで表示する

こんな調子でデータ分析を進めていけます。

機械学習モデルの開発

続けて、機械学習パートです。ここでは、以下の手順を確認していきます。

  • モデルの構築
  • モデルの登録
  • 登録したモデルを利用する

モデルの構築

はじめに、モデルの構築です。先ほどに続いて、Titanicデータを使って、簡易的なモデルを作ってみます。

## 必要なライブラリのインポート(一部、今回のモデル構築に不要な物も含まれています)

import sklearn
from sklearn.externals.six import StringIO
from sklearn import preprocessing, metrics, model_selection
from sklearn.preprocessing import MinMaxScaler, StandardScaler, LabelEncoder, OneHotEncoder, LabelBinarizer 
from sklearn.metrics import roc_auc_score, roc_curve, accuracy_score, recall_score, precision_score, f1_score, precision_recall_curve
from sklearn.model_selection import KFold, StratifiedKFold, GridSearchCV, train_test_split,cross_val_score
from sklearn import linear_model
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os, gc

print("Pandas Version:"+pd.__version__)
print("Scikit-Learn Version:"+sklearn.__version__)

## 以下データ読み込みまでは先ほどのデータ分析パートのコードと同じ

##############################
## データセットのダウンロード(先ほどのコードと同じ)
##############################
from azureml.core import Workspace, Dataset

subscription_id = 'xxxxxx'
resource_group = 'xxxxxx'
workspace_name = 'xxxxxx'
 #Machine Learningワークスペースの名前

workspace = Workspace(subscription_id, resource_group, workspace_name)

dataset = Dataset.get_by_name(workspace, name='Titanic') #データセット名を指定
dataset.download(target_path='datas', overwrite=False) #データをダウンロードするフォルダを指定

##############################
## データセットの読み込み
##############################
PATH = '~/cloudfiles/code/Users/★Notebookディレクトリ名(メールアドレス)★/datas/'

df_train = pd.read_csv(PATH+'train.csv')
df_test = pd.read_csv(PATH+'test.csv')
display(df_train.info())
display(df_train.head())

##############################
## 特長量エンジニアリング(最低限の加工のみ)
##############################
def feature_engineering(df):
    # Null Value Handling
    df["Age"].fillna(df["Age"].median(),inplace=True)
    df["Embarked"].fillna(df['Embarked'].mode()[0], inplace = True)
    df = df.fillna(-1)
    
    # Feature Encoding
    df["Sex"] = df["Sex"].map({'male':1,'female':0}).fillna(-1).astype(int)
    df["Embarked"] = df["Embarked"].map({'S':0,'C':1,'Q':2}).astype(int)
    df["Cabin"] = df["Cabin"].str[0].map({'T':0,'G':1,'F':2,'E':3,'D':4,'C':5,'B':6,'A':7}).fillna(-1).astype(int)
    
    # Binning
    bins_age = np.linspace(0, 100, 10)
    df["AgeBin"] = np.digitize(df["Age"], bins=bins_age)
    
    df["FareBin"] = 0
    df["FareBin"][(df["Fare"]>=0)&(df["Fare"]<10)] = 1
    df["FareBin"][(df["Fare"]>=10)&(df["Fare"]<20)] = 2
    df["FareBin"][(df["Fare"]>=20)&(df["Fare"]<30)] = 3
    df["FareBin"][(df["Fare"]>=30)&(df["Fare"]<40)] = 4
    df["FareBin"][(df["Fare"]>=40)&(df["Fare"]<50)] = 5
    df["FareBin"][(df["Fare"]>=50)&(df["Fare"]<100)] = 6
    df["FareBin"][(df["Fare"]>=100)] = 7

    # Create New Features (Optional)
    df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
    df['Title'] = -1
    df['Title'][df["Name"].str.contains("Mr")] = 0
    df['Title'][df["Name"].str.contains("Master")] = 1
    df['Title'][df["Name"].str.contains("Miss")] = 2
    df['Title'][df["Name"].str.contains("Mrs")] = 3
    
    # Drop unsed columns
    del df["Age"]
    del df["Fare"]
    del df["Ticket"]
    
    return df

df_train_fe = feature_engineering(df_train)
df_test_fe = feature_engineering(df_test)

##############################
## SVCベースのモデル構築
##############################
exclude_columns = [
    'Name',
    'Ticket',
    'PassengerId',
    'Survived'
]

evals_result = {}
features = [c for c in df_train_fe.columns if c not in exclude_columns]
target = df_train_fe['Survived']

#X_train, X_test, y_train, y_test = train_test_split(df_train_fe[features], target, test_size=0.2, random_state=440)
X_train = df_train_fe[features]
y_train = target

svc = svm.SVC()
params = {
    'C':[0.001,0.01,0.1,0.5,1,3,5,10,30,50,100],
    'gamma':[0.001,0.01,0.1,0.5,1,3,5,10,30,50,100],
}

gsSVM = GridSearchCV(svc, params, cv=10, scoring='roc_auc', n_jobs=-1)
model = gsSVM.fit(X_train, y_train)
print(f"Best Score: {gsSVM.score(X_train, y_train)}")
print(f"Best Params: {gsSVM.best_params_}")

内容の詳細は割愛しますが、上記のコードでmodelに学習済モデルの情報が含まれるようになりました。

モデルの登録

続けて、構築したモデルをAzure Machine Learningに登録します。モデルの登録とは何でしょうか?Azureの公式ドキュメントによると、以下のように説明されています。

モデル=1つのpickleファイル、という対応ではなく、機能単位などの論理的なモデルの集合体のようです。

登録済みモデルは、モデルを構成する 1 つまたは複数のファイルの論理コンテナーです。 たとえば、複数のファイルに格納されているモデルがある場合は、Azure Machine Learning ワークスペースに単一モデルとしてそれらを登録することができます。 登録後は、その登録済みモデルをダウンロードするかデプロイし、登録されたすべてのファイルを受信できます。

公式ドキュメントによると、モデルを登録することのメリットとして、バージョン管理が容易になる点が言及されています。

バージョンを追跡するためにモデルを登録することをお勧めしますが、必須ではありません。 モデルを登録しないで続行する場合は、InferenceConfig または InferenceConfig でソース ディレクトリを指定し、確実にそのソース ディレクトリ内にモデルが存在するようにする必要があります。

https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-deploy-and-where?tabs=azcli

モデルを登録する方法には以下の2種類がありますが、今回は、Notebookなどからコマンドベースで登録する方法にしました。

  • ポータルからアップロードする
  • Azure Machine Learning SDKを利用してコマンドから登録する

ポータルから登録する

Azure Machine Learning Studioの”モデル”ブレードから、以下のような情報を入力してモデルの登録を行うことができます。フレームワークやフレームワークのバージョンは必須なんですね。我々の管理のことを考えてくれてのことでしょうか・・

Azure Machine Learning SDKを利用して登録する

import pickle
from azureml.core import run

## モデルをPickle形式でmodelsディレクトリ配下に保存
with open('models//model-titanic-svc.pkl', mode='wb') as f:
    pickle.dump(model, f)

## モデルを登録
from azureml.core.model import Model
model = Model.register(model_path = "models/model-titanic-svc.pkl",
                       model_name = "titanic-svc",
                       description = "Predict survive/non-survive for the passanger on Titanic. Linear SVC.",
                       workspace = ws)

登録コマンドを実行すると、以下のようなメッセージが表示されます。

Registering model titanic-svc

さて、登録されたモデルをポータルから確認してみます。

ちゃんと、登録されています!!ここでポイントなのは、同じ名前でモデルを登録し直した場合、新しいバージョンとしてモデルが登録され、過去のバージョンのモデルはちゃんと残る、という点になります。これは便利です!!

モデルを利用する(工事中)

最後に、登録したモデルを再びNotebookなどで利用する方法について確認しておきます。

公式ドキュメントによると、以下のように説明されています。

トレーニング済みの機械学習モデルは、クラウド上またはローカルで、Web サービスとしてデプロイされます。 また、Azure IoT Edge デバイスにモデルをデプロイすることもできます。 デプロイでは、推論に CPU、GPU、またはフィールド プログラマブル ゲート アレイ (FPGA) を使用します。 Power BI からのモデルを使用することもできます。

https://docs.microsoft.com/ja-jp/azure/machine-learning/concept-model-management-and-deployment

デプロイのオプションには、以下があります。

  • Azure Container Instance
  • Azure Kubernetes Cluster

Azure Container Instances (ACI) が適しているのは、サイズが 1 GB 未満の小さいモデルのみです。
より大きいモデルの開発テストには、単一ノードの Azure Kubernetes Service (AKS) クラスターを使用することをお勧めします。

https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-deploy-and-where?tabs=python

使ってみた所感(工事中)

使ってみた正直な感想を残しておきます。

  • Jupyter Labを使えるのは嬉しい。NotebookをJupyter Labに切り替えることでローカルと同じサクサク感で使えて良い。
  • ただし、時々いろいろな画面でフリーズする。(これが一番ストレスかも・・)

この記事を気に入っていただけたらシェアをお願いします!

ABOUT US

Yuu113
初めまして。Yuu113と申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。