Azure Machine LearningのAutoMLを使ってみる

こんばんは。本日は、Microsoft Azure AutoMLをローカルのJupyter上で使えるようにしたいと思います。

Contents

Azure Machine Learning AutoMLとは?

Microsoft Azureが提供するAzure Machine Learningサービスに含まれる機能で、機械学習モデルの構築プロセスを自動化する(現在はもっと広義の自動化も含むかもですが)AutoMLを実現することができるものです。

https://azure.microsoft.com/ja-jp/services/machine-learning/

AutoMLで具体的にできること

AutoML機能の公式Docはこちら。

https://docs.microsoft.com/ja-jp/azure/machine-learning/concept-automated-ml

自動 ML では、トレーニング データを与えて ML モデルをトレーニングします。実行するモデル検証の種類を指定できます。 自動 ML では、トレーニングの一環としてモデルが検証されます。 つまり、自動 ML では検証データを利用し、適用されているアルゴリズムに基づき、モデルのハイパーパラメーターを調整し、トレーニング データに最適な組み合わせを見つけます。 ただし、調整が繰り返されるとき、同じ検証データが使用され、モデルの評価が偏ります。これは、モデルは向上を継続するものであり、検証データに合わせるためです。

このような偏りが最終的な推奨モデルに適用されないように、自動 ML ではテスト データを利用し、自動 ML から実験の最後に推奨される最終モデルが評価されます。 自動 ML 実験の構成でテスト データを与えるとき、実験の最後に既定でこの推奨モデルがテストされます (プレビュー)。

公式Docより

そしてこのAutoML、Azure Machine Learningサービス上使えるのは当然ながら、ローカルからAPI経由で呼び出して利用することもできるスグレモノです。

公式Docによると、ローカルから呼び出す場合と、AML上で利用する場合の際のPros/Cons及び機能差異は以下です。

2022年2月26日時点の公式Docより

2022年2月26日時点の公式Docより

ローカルJupyter上でAutoMLを実装してみた

それでは、このAutoMLを使って機械学習モデルの構築を自動化してみましょう。今回は、ローカル環境のJupyter上からAPI経由で呼びだす方法で実装してみました。

以下の手順で進めていきます。

Azure上にMachine Learningワークスペースを作成

最初にAzure上にMachine Learningワークスペースを事前に用意しておく必要があります。こちらの手順はこちらで解説しております。

Azure上ワークスペースからConfig.jsonをダウンロード

Azure上にMachine Learningワークスペースを作成した次は、ワークスペースの設定が記載されたConfig.jsonファイルをダウンロードし、Jupyter Notebookを格納しているディレクトリに配置します。

Config.jsonのダウンロード

ローカルのJupyter上でAzure AutoML設定

最後に、Jupyter側の設定です。はじめにコマンドプロンプト(またはAnaconda Prompt上)で下記コードを実行します。これで、必要なパッケージがインストールされます。(Anacondaを利用している方も下記のpipで入ります)

https://docs.microsoft.com/ja-jp/python/api/overview/azure/ml/install?view=azure-ml-py

pip install azureml-core azureml-opendatasets azureml-widgets azureml-train-automl

*azureml-opendatasetsは外部データを利用する場合は必要ないかと思います。

*azureml-train-automlは実験を実行するために必要になるのですが、Docの記載の通り、pandasやnumpy等も、対応バージョンが再インストールされます。

次に、ワークスペースをimportします。workspace.from_config()によって、先ほど配置したconfig.iniファイルが読み取られ、認証の詳細情報がwsオブジェクトに格納されます。

from azureml.core.workspace import Workspace
ws = Workspace.from_config()

ワークスペースの設定を読み込んだら、AutoMLのパラメータ設定をしていきます。

とその前に、まずはタイタニックデータの読み込みと前処理をかけておきます。今回データセットはKaggleから取得しています。今回はAutoMLのお試しが目的なので、データ加工等も簡単に実施しています。

%matplotlib inline
import matplotlib.pyplot as plt
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.model_selection import KFold, StratifiedKFold, GridSearchCV, train_test_split
from datetime import datetime, date, timezone, timedelta
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os, gc
PATH = 'ファイルの格納ディレクトリ'

## ファイル読み込み
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 unused 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)
display(df_train_fe.head())

## 学習・テスト・予測用データセットの作成

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']
print(len(target))

gc.collect()

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

データセットを作ったところで、AutoMLの設定に入ります。

import logging

automl_settings = {
    "iteration_timeout_minutes": 2,
    "experiment_timeout_minutes": 20,
    "enable_early_stopping": True,
    "primary_metric": 'spearman_correlation',
    "featurization": 'auto',
    "verbosity": logging.INFO,
    "n_cross_validations": 5,
    "primary_metric":'AUC_weighted'
}

下のAutoMLConfigでデータセット(説明変数:Xと目的変数:y)を指定します。

from azureml.train.automl import AutoMLConfig

automl_config = AutoMLConfig(task='classification',
                             debug_log='automated_ml_errors.log',
                             X=X_train.values,
                             y=y_train.values.flatten(),
                             **automl_settings)

そして、AutoMLによるモデル構築(学習)の実行。実行すると、実行の過程がJupyter上に表示されていきます。

from azureml.core.experiment import Experiment
experiment = Experiment(ws, "titanic-experiment")
local_run = experiment.submit(automl_config, show_output=True)
Auto MLの実行画面

1モデル20秒ほどで試行されていきます。30モデルが試されて10分程度で完了しました。

LightGBM/SGD/RandomForest/ExtremeRandomTrees/BernoulliNaiveBayes/LogisticRegression/LinearSVMが試され、最後には複数モデルのアンサンブルが行われて学習精度が向上していることが確認できます。

モデル学習結果の確認

モデルの学習過程は、Jupyter Widgetsを利用したAzureのRunDetailから確認することができます!

from azureml.widgets import RunDetails
RunDetails(local_run).show()

すると、以下のような情報が表示されます。

*Jupyter上でWidgetを表示するには、Jupyter-widgets拡張ライブラリのインストールが必要なようです。

ライブラリの内容の詳細はこちら(工事中)で解説しています。

sudo -i jupyter labextension install @jupyter-widgets/jupyterlab-manager

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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