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']
各データには写真、テキストでの説明、年齢、品種、名前、色などのさまざまな特徴が含まれています。
行全体のサンプルです。
学習
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