ローカルのJupyter上でAzure AutoMLを使ってみる

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

Azure AutoMLとは?

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

ローカルのJupyter上で使うためには、Azure上にMachine Learningワークスペースを事前に用意しておく必要があります。こちらの手順はこちらで解説しております。

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

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

Config.jsonのダウンロード

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

最後に、Jupyter側の設定です。ここからは、Azureの公式チュートリアルに沿って進めていきます。(チュートリアルではタクシー料金予測の回帰モデルを構築していますが、ここでは使い慣れたタイタニックの生存者データを用いて進めてみたいと思います。)

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

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

pip install azureml-sdk[automl] azureml-opendatasets azureml-widgets
実行結果

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