こんばんは。本日は、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及び機能差異は以下です。
ローカルJupyter上でAutoMLを実装してみた
それでは、このAutoMLを使って機械学習モデルの構築を自動化してみましょう。今回は、ローカル環境のJupyter上からAPI経由で呼びだす方法で実装してみました。
以下の手順で進めていきます。
Azure上にMachine Learningワークスペースを作成
最初にAzure上にMachine Learningワークスペースを事前に用意しておく必要があります。こちらの手順はこちらで解説しております。
Azure上ワークスペースからConfig.jsonをダウンロード
Azure上にMachine Learningワークスペースを作成した次は、ワークスペースの設定が記載されたConfig.jsonファイルをダウンロードし、Jupyter Notebookを格納しているディレクトリに配置します。
ローカルの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)
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
コメントを残す