AutoGluonでマルチモーダルのAutoML

AutoGluonとは?

AutoGluonはAutoMLのフレームワークです。テーブル、時系列、マルチモーダルといった複数のデータの種類に対応しています。

今回はマルチモーダルのAutoMLを試してみます。

環境はGoogle Corabです。

インストール

!python -m pip install --upgrade pip
!python -m pip install autogluon

チュートリアルの方では書かれていませんが、torchaudioライブラリ関連のエラーが出てしまったので、下記のコマンドでPyTorchとTorchaudioのアップグレードを行いました。

pip install -U torch torchaudio

ライブラリの読み込み

import os
import warnings

import numpy as np

warnings.filterwarnings('ignore')
np.random.seed(123)

データセット

今回はPetFinderというデータセットを利用します。PetFinderデータセットは、マレーシアのペットの里親探しをサポートするためのウェブサイトPetFinder.myから収集されたデータを含んでいます。

from autogluon.core.utils.loaders import load_zip

download_dir = './ag_multimodal_tutorial'
zip_file = 'https://automl-mm-bench.s3.amazonaws.com/petfinder_for_tutorial.zip'

load_zip.unzip(zip_file, unzip_dir=download_dir)

今回の予測モデルの目的はペットのプロファイルに基づいて、里親に迎えられるまでの速度を予測することです。この速度(AdoptionSpeed)は「0(遅い)」と「1(速い)」の2つのカテゴリに分類されています。

import pandas as pd

dataset_path = f'{download_dir}/petfinder_for_tutorial'

train_data = pd.read_csv(f'{dataset_path}/train.csv', index_col=0)
test_data = pd.read_csv(f'{dataset_path}/test.csv', index_col=0)

label_col = 'AdoptionSpeed'

PetFinderデータセットには画像のディレクトリが含まれており、データ内のいくつかのレコードには複数の画像が関連付けられています。

image_col = 'Images'

train_data[image_col] = train_data[image_col].apply(lambda ele: ele.split(';')[0])
test_data[image_col] = test_data[image_col].apply(lambda ele: ele.split(';')[0])

def path_expander(path, base_folder):
    path_l = path.split(';')
    return ';'.join([os.path.abspath(os.path.join(base_folder, path)) for path in path_l])

train_data[image_col] = train_data[image_col].apply(lambda ele: path_expander(ele, base_folder=dataset_path))
test_data[image_col] = test_data[image_col].apply(lambda ele: path_expander(ele, base_folder=dataset_path))

今回はImages列にある最初の画像だけを取り出して、画像のパスを処理しています。

データのサンプル

example_row = train_data.iloc[0]
example_image = example_row[image_col]

from IPython.display import Image, display
pil_img = Image(filename=example_image)
display(pil_img)

example_row['Description']

各データには写真、テキストでの説明、年齢、品種、名前、色などのさまざまな特徴が含まれています。

行全体のサンプルです。

exmaple_rowの全体

学習

from autogluon.multimodal import MultiModalPredictor

predictor = MultiModalPredictor(label=label_col).fit(
    train_data=train_data,
    time_limit=120
)

MultiModalPredictorクラスをインポートして学習を行います。目的変数(予測したい変数)を含む列をlabel_colで指定します。time_limit=120はトレーニングを120秒(2分)に制限することを指定しています。MultiModalPredictorは目的変数のデータ型と分布に基づいて、自動的にタスクが分類問題か回帰問題かを判断します。

予測

学習後にpredictで予測を行います。

predictions = predictor.predict(test_data.drop(columns=label_col))
predictions[:5]

分類タスクでは、各出力クラスの予測確率も取得可能です。

probs = predictor.predict_proba(test_data.drop(columns=label_col))
probs[:5]

評価

evaluateで評価を行います。
ここではROC AUCスコアを算出しています。

scores = predictor.evaluate(test_data, metrics=["roc_auc"])
scores

{'roc_auc': 0.8912}