
Meridianの実験パラメータ管理をGemini Enterprise Agent Platform ExperimentsとMLflowで比較してみた
はじめまして、電通デジタルでデータサイエンティストをしている、阿部です。 普段業務でGogoleのMeridianを用いたマーケティングミックスモデリング(以下、MMM)の分析を担当しています。
Meridian を使って MMM の検証を行うときは、モデルの結果だけでなく「どの条件で学習したのか」も残しておくことが重要です。事前分布、MCMC のサンプリング条件などが結果に影響するため、あとから「この結果はどの設定で出したものか」「前回との差分は何か」を説明できる必要があります。
そのため、条件を変えながら Meridian の学習を何度か実行する場合は、実行ごとにパラメータやモデル成果物を管理できるようにしておくと便利です。本記事では、その管理方法として以下の2つのアプローチを整理し、比較します。
Gemini Enterprise Agent Platform Experiments: Google Cloud 上で、実行条件、パラメータ、モデル成果物、作成過程(Lineage)を記録・確認できる実験管理サービス
MLflow: 機械学習領域で広く使われているオープンソースの実験管理ツール。Meridian には専用モジュール(meridian.mlflow)があり、簡単に連携可能
それぞれの強みや、Meridianと組み合わせた際の使用感について詳しく見ていきます。
本記事では、以下の環境で検証しています。

なお、MLflow については Google Cloud 上に MLflow の共有サーバーを立てず、ローカル SQLite を利用しています。
本記事の Meridian モデル構築、サンプルデータ読み込み、事前分布設定、サンプリング処理、モデル保存の流れは、Google Meridian 公式の「Introduction to Meridian Demo」を参考にしています。また、MLflow 連携部分は、Meridian 公式 API リファレンスの meridian.mlflow.autolog のサンプルコードを参考にしています。
Gemini Enterprise Agent Platform Experimentsとは?
Gemini Enterprise Agent Platform Experiments(以下、Agent Platform Experiments)は、Google Cloud 上で AI や機械学習の実験結果を管理するための機能です。「このモデルは、どの設定で学習したのか」「どの学習処理から、どのモデルファイルが作られたのか」を後から確認しやすくできます。
記録した内容は、Google Cloud コンソールから確認できます。この記事では、Meridian の学習を1回実行するたびに実行記録(Run)を1つ残し、学習時のパラメータや保存した学習済みモデルを紐づけて管理します。
Gemini Enterprise Agent Platform Experimentsで管理する方法
今回の実験管理は、以下の構成で行います。
実験条件の準備: Meridian の1回分の実行記録(Run)ごとに、比較したい代表的な条件を run_params としてまとめます。
初期設定: aiplatform.init() で Google Cloud のプロジェクト、リージョン、実験(Experiment)名を設定します。
実行記録(Run)の作成とパラメータ記録: aiplatform.start_run() で、Meridian の学習1回分に対応する実行記録(Run)を作成し、aiplatform.log_params() で run_params を記録します。
学習処理と成果物の記録: aiplatform.start_execution() で学習処理を train-meridian という処理ステップとして記録します。学習済みモデルは meridian_model.binpb として保存し、aiplatform.Artifact.create() と execution.assign_output_artifacts() で学習処理の出力として紐づけます。
確認方法: 実行記録(Run)、パラメータ、学習済みモデル、学習処理との紐づきは Google Cloud コンソールの Experiments 画面から確認できます。
つまり、Google Cloud 上で「実験(Experiment) > 実行記録(Run)」という単位で学習結果を管理し、その Run に対して設定パラメータ、実行された処理(Execution)、生成されたモデル成果物(Artifact)を紐づけて追跡できる構成にしています。
Gemini Enterprise Agent Platform Experiments の実装手順
1. 必要なライブラリのインポート
まず、Meridian モデルの構築、学習、Agent Platform Experiments との連携に必要なライブラリを読み込みます。
import os
import time
from pathlib import Path
from datetime import datetime, timedelta, timezone
# Google Cloud
from google.cloud import aiplatform
# Meridian
from meridian import constants
from meridian.analysis import visualizer
from meridian.data import data_frame_input_data_builder
from meridian.model import model
from meridian.model import prior_distribution
from meridian.model import spec
from meridian.schema.serde import meridian_serde
# データ処理・数値計算
import pandas as pd
from psutil import virtual_memory
import tensorflow as tf
import tensorflow_probability as tfp 以降の手順では、これらのライブラリを使って Meridian モデルを作成し、学習条件やモデル成果物を Agent Platform Experiments に記録していきます。
2. Google Cloud プロジェクト設定と出力先パスの定義
Agent Platform Experiments が利用する Google Cloud の環境情報と、学習済みモデルの保存先を定義します。
# プロジェクト設定
PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT")
LOCATION = os.environ.get("GOOGLE_CLOUD_REGION")
# モデル保存先
OUTPUT_DIR = Path("/home/jupyter/work/experiments")
MODEL_PATH = OUTPUT_DIR / "meridian_model.binpb" ここで定義した PROJECT_ID と LOCATION は、後続の aiplatform.init() で接続先を指定するために使います。また、MODEL_PATH は学習後に保存する Meridian モデルの出力先として使います。
3. モデリング用サンプルデータの読み込み
Meridian 公式のシミュレーションデータ(CSV形式)を取得します。
# サンプルデータを読み込み
df = pd.read_csv("https://raw.githubusercontent.com/google/meridian/refs/heads/main/meridian/data/simulated_data/csv/geo_all_channels.csv") このシミュレーションデータには、MMMに必要な時系列データが含まれています。具体的には、KPI として扱うコンバージョン、各メディアチャネル別のインプレッションや広告費、コントロール変数、プロモーション、オーガニック施策などが入っています。
4. DataFrameInputDataBuilder による Meridian 入力データのビルド
ロードした DataFrame を、Meridian モデルに渡せる入力データに変換します。
# ビルダーを用意
builder = data_frame_input_data_builder.DataFrameInputDataBuilder(
kpi_type="non_revenue",
default_kpi_column="conversions",
default_revenue_per_kpi_column="revenue_per_conversion",
)
# KPI、売上、人口、コントロール変数を追加
builder = (
builder.with_kpi(df)
.with_revenue_per_kpi(df)
.with_population(df)
.with_controls(
df, control_cols=["sentiment_score_control", "competitor_sales_control"]
)
)
# 広告メディアの実績と費用を追加
channels = ["Channel0", "Channel1", "Channel2", "Channel3", "Channel4"]
builder = builder.with_media(
df,
media_cols=[f"{channel}_impression" for channel in channels],
media_spend_cols=[f"{channel}_spend" for channel in channels],
media_channels=channels,
)
# プロモーションとオーガニックメディアを追加
builder = builder.with_non_media_treatments(
df, non_media_treatment_cols=["Promo"]
).with_organic_media(
df,
organic_media_cols=["Organic_channel0_impression"],
organic_media_channels=["Organic_channel0"],
)
# InputData を生成
data = builder.build() DataFrameInputDataBuilder では、KPI、revenue per KPI、人口、コントロール変数、広告メディア、非メディア施策、オーガニックメディアを順番に追加します。最後に build() を呼び出すことで、Meridian が扱える InputData オブジェクトが生成されます。
広告メディアについては、Channel0 から Channel4 までの 5 チャネルに対して、インプレッション列と広告費列をセットで指定しています。これにより、Meridian は各チャネルの投入量と費用を対応づけ、ROI を推定できるようになります。
5. 事前分布(Prior)とサンプリング条件の設定
ここでは、Meridian の1回分の実行記録(Run)に紐づける実験条件を準備します。今回は実験管理の流れを確認するための例なので、ROI の事前分布を決める roi_mu、roi_sigma、事前分布サンプリング条件、MCMC の事後分布サンプリング条件など、比較時に確認したい代表的な項目を run_params としてまとめます。また、パラメータ管理手法の比較を主な目的としているため、MCMC のサンプリング数などは検証用に軽めの設定にしています。
# 事前分布サンプリング
prior_samples = {
"n_draws" : 20, # サンプル数
"seed" : 123, # 乱数シード
}
# 事後分布サンプリング
posterior_params = {
"n_chains": 1, # チェーン数
"n_adapt": 50, # 適応ステップ数
"n_burnin": 10, # burn-in 数
"n_keep": 50, # 保持サンプル数
"seed": 1, # 乱数シード
}
# ROI の事前分布
roi_mu = 0.2
roi_sigma = 0.9
prior = prior_distribution.PriorDistribution(
roi_m=tfp.distributions.LogNormal(roi_mu, roi_sigma, name=constants.ROI_M)
)
# モデル仕様
model_spec = spec.ModelSpec(prior=prior, enable_aks=True)
# 記録するパラメータ
run_params = {
"roi_mu": roi_mu,
"roi_sigma": roi_sigma,
"enable_aks": True,
**prior_samples,
**posterior_params,
} 作成した run_params は、後続の aiplatform.log_params() で実行記録(Run)に登録します。実運用では、比較したい条件に応じて項目を追加・整理します。
6. Agent Platform Experiments の初期化と準備
実験(Experiment)の作成と、個々の実行記録(Run)を一意に識別するための初期設定を行います。
# 実験名
EXPERIMENT_NAME = "meridian"
# Run 名
JST = timezone(timedelta(hours=9))
RUN_NAME = f"meridian-{datetime.now(JST):%Y%m%d-%H%M%S}"
# aiplatform の初期化
aiplatform.init(
project=PROJECT_ID,
location=LOCATION,
experiment=EXPERIMENT_NAME,
) EXPERIMENT_NAME は、複数の実行記録(Run)をまとめる実験(Experiment)の名前です。同じテーマの検証を同じ実験(Experiment)にまとめておくと、後から実行結果を横並びで確認しやすくなります。
RUN_NAME は、1回分の実行記録(Run)を識別するための名前です。後続の aiplatform.start_run(run=RUN_NAME) で指定すると、その with ブロック内で記録したパラメータや成果物が、この実行記録(Run)に紐づきます。ここでは実行日時を含めた名前にして、Agent Platform Experiments 上で各実行記録(Run)を区別しやすくしています。
最後に aiplatform.init() を呼び出し、Google Cloud の接続先プロジェクト、リージョン、実験(Experiment)名を設定します。
7. Meridian の学習実行と Agent Platform Experiments への実験・Lineage(来歴)情報の記録
メインの学習処理を実行し、その過程、パラメータ、生成されたモデルを Agent Platform Experiments へ一元的に記録します。
# Run を開始
with aiplatform.start_run(run=RUN_NAME):
# パラメータを記録
aiplatform.log_params(run_params)
# 学習処理を記録
with aiplatform.start_execution(
schema_title="system.ContainerExecution",
display_name="train-meridian",
) as execution:
# 学習を実行
mmm = model.Meridian(input_data=data, model_spec=model_spec)
mmm.sample_prior(**prior_samples)
mmm.sample_posterior(**posterior_params)
# モデルを保存
meridian_serde.save_meridian(mmm, str(MODEL_PATH))
# Artifact を作成
model_artifact = aiplatform.Artifact.create(
schema_title="system.Model",
display_name=f"{EXPERIMENT_NAME}-{RUN_NAME}-meridian-model",
uri=str(MODEL_PATH),
)
# 出力 Artifact を紐づけ
execution.assign_output_artifacts([model_artifact]) このコードブロックでは、Agent Platform Experiments のメタデータ上に Lineage を構築しています。aiplatform.start_run() で実行記録(Run)を開始し、aiplatform.log_params() で事前分布や MCMC の設定値を記録します。
さらに、aiplatform.start_execution() で「モデルを学習する」という処理ステップを Execution として表現しています。学習後に保存した meridian_model.binpb は aiplatform.Artifact.create() で Artifact として登録し、execution.assign_output_artifacts() で train-meridian の出力成果物として紐づけます。
8. Agent Platform Experiments の実行結果の確認
Agent Platform Experiments に記録された内容は、Google Cloud コンソール上の Agent Platform から確認できます。左メニューの「テスト」を開くと、作成済みの実験一覧が表示されます。今回の例では、aiplatform.init() で指定した実験名 meridian が表示されています。

meridian を選択すると、その実験に紐づく実行記録(Run)の一覧を確認できます。各 Run には、実行名、ステータス、作成日時、記録したパラメータが表形式で表示されます。今回の例では、meridian-20260703-203854 のような Run 名で、Meridian の学習1回分の実行結果が登録されています。

Run の一覧では、enable_aks、n_adapt、n_burnin、n_chains など、aiplatform.log_params(run_params) で記録した値を横並びで確認できます。複数回実行した場合は、この画面で Run ごとの設定差分を比較できます。
Run 名をクリックすると、実行の詳細画面に遷移します。詳細画面の「パラメータ」タブでは、1つの Run に紐づくパラメータを一覧で確認できます。今回の例では、enable_aks、n_adapt、n_burnin、n_chains、n_draws、n_keep、roi_mu、roi_sigma、seed が登録されており、どの条件で Meridian の学習を実行したかを後から確認できます。

また、「アーティファクト」タブでは、学習処理によって作成された成果物を確認できます。今回の実装では、meridian_serde.save_meridian() で保存した Meridian モデルを aiplatform.Artifact.create() で Artifact として登録し、execution.assign_output_artifacts() で学習処理の出力として紐づけています。そのため、詳細画面からモデル成果物の存在や、メタデータストア上の Artifact 情報を確認できます。

このように Agent Platform Experiments を使うと、実行単位で「どのパラメータで学習したか」と「どの成果物が作成されたか」を Google Cloud コンソール上で追跡できます。Meridian の条件を変えながら複数回検証する場合でも、Run ごとの設定値とモデル成果物をまとめて確認できるため、後から結果を比較・説明しやすくなります。
MLflowとは?
MLflow は、機械学習の実験結果を記録・比較するためのオープンソースツールです。学習を1回実行するたびに、その実行記録(Run)を作成し、パラメータ、メトリクス、モデルファイルなどをまとめて保存できます。
記録した内容は MLflow UI から確認できます。複数の実行記録(Run)を並べて、パラメータ、メトリクス、成果物を比較できるため、ローカル検証からチームでの実験管理まで幅広く使われます。
Agent Platform Experiments が Google Cloud 上の実験管理機能であるのに対して、今回の MLflow 版では Google Cloud 上に MLflow の共有サーバーを立てていません。ローカル SQLite を記録先に指定し、Meridian の autolog と学習済みモデルのファイル登録だけを使う最小構成で比較しています。
MLflowで管理する方法
本記事では、Meridian 用の MLflow 自動ロギングである autolog を中心に管理します。autolog を有効にすると、mlflow.log_params() を細かく書かなくても、Meridian 固有の ModelSpec、prior、sampling 条件などを実行記録(Run)に残せます。
今回の実験管理は、以下の構成で行います。
初期設定: mlflow.set_tracking_uri() でローカル SQLite の保存先を指定し、mlflow.set_experiment() で実験(Experiment)名を設定します。
自動記録の有効化: autolog.autolog() を呼び出し、Meridian の model spec、prior、sampling 条件を MLflow に自動記録します。
実行記録(Run)の作成: mlflow.start_run() で、Meridian の学習1回分に対応する実行記録(Run)を作成します。
学習済みモデルの保存: meridian_model.binpb をローカルに保存し、mlflow.log_artifact() で実行記録(Run)に紐づけます。
確認方法: 今回は Google Cloud の管理画面には統合せず、ローカルの MLflow Tracking URI に記録された内容を確認する構成にしています。
なお、ライブラリのインポート、Google Cloud プロジェクト設定、サンプルデータの読み込み、Meridian 入力データのビルド、事前分布(Prior)とサンプリング条件の設定までは、前述の Agent Platform Experiments の例と同じです。そのため、ここでは MLflow 固有の設定と記録処理に絞って説明します。
1. MLflow の記録先・実験(Experiment)名・実行記録(Run)名の準備
まず、 MLflow を読み込み 、記録先、実験(Experiment)名、実行記録(Run)名を定義してMLflow に設定します。今回は MLflow の共有サーバーを立てず、ローカル SQLite に実験結果を保存します。
import mlflow
MLFLOW_TRACKING_URI = "sqlite:////home/jupyter/work/mlflow/mlflow.db"
EXPERIMENT_NAME = "meridian"
JST = timezone(timedelta(hours=9))
RUN_NAME = f"meridian-{datetime.now(JST):%Y%m%d-%H%M%S}"
# 記録先を設定
mlflow.set_tracking_uri(MLFLOW_TRACKING_URI)
mlflow.set_experiment(EXPERIMENT_NAME)MLFLOW_TRACKING_URI は、MLflow の実験記録を保存する場所です。ここでは SQLite のデータベースファイルを指定しているため、実験結果はローカル環境に保存されます。EXPERIMENT_NAME は複数の実行記録(Run)をまとめる実験(Experiment)の名前で、mlflow.set_experiment() によって、この後の実行記録(Run)が meridian という実験(Experiment)に紐づくようになります。
RUN_NAME は、1回分の実行記録(Run)に付ける名前です。後続の mlflow.start_run(run_name=RUN_NAME) で指定すると、その with ブロック内で記録したパラメータや成果物が、この実行記録(Run)に紐づきます。
2. Meridian autolog の有効化
MLflow の記録先を設定したうえで、 Meridian の autolog を読み込み、モデル設定や sampling 条件を MLflow に自動記録するために有効化します。
from meridian.mlflow import autolog
# autolog を有効化
autolog.autolog() autolog.autolog() を呼び出すと、Meridian の ModelSpec、prior、sampling 条件などが MLflow に自動で記録されます。すべてのパラメータを mlflow.log_param() で個別に登録しなくても、Meridian 固有の設定を実行記録(Run)に残せます。
3. 実行記録(Run)の作成、学習実行、成果物の登録
最後に、MLflow の実行記録(Run)を作成し、その中で Meridian の学習を実行します。この中で実行した処理や保存した成果物は、1回分の実行記録(Run)に紐づきます。
# Run を開始
with mlflow.start_run(run_name=RUN_NAME):
mmm = model.Meridian(input_data=data, model_spec=model_spec)
mmm.sample_prior(**prior_samples)
mmm.sample_posterior(**posterior_params)
# モデルを保存
meridian_serde.save_meridian(mmm, str(MODEL_PATH))
# Artifact を記録
mlflow.log_artifact(str(MODEL_PATH), artifact_path="model") mlflow.start_run(run_name=RUN_NAME) の with ブロックが、MLflow における1回分の実行記録(Run)です。この中で Meridian モデルの初期化、事前分布サンプリング、事後分布サンプリングを行うと、autolog によって関連する設定が記録されます。最後に mlflow.log_artifact() で、保存した meridian_model.binpb を成果物として登録します。
4. MLflow の実行結果の確認
MLflow に記録された内容は、MLflow UI から確認できます。今回の例ではローカル SQLite を tracking URI にしているため、ターミナル上で同じ SQLite ファイルを指定して UI を起動します。
mlflow ui --backend-store-uri sqlite:////home/jupyter/work/mlflow/mlflow.db起動後、ブラウザで http://localhost:5000 にアクセスすると、MLflow UI が表示されます。Experiments の一覧には、mlflow.set_experiment(EXPERIMENT_NAME) で指定した meridian が表示されています。

meridian を選択すると、その実験に紐づく実行記録(Run)の一覧を確認できます。今回の例では、mlflow.start_run(run_name=RUN_NAME) で作成した Run が表示されています。Run 一覧では、Run 名、作成時刻、実行時間、実行元などを確認できます。複数回実行した場合は、この画面で Run を並べて比較できます。

Run 名をクリックすると、Run の詳細画面に遷移します。Overview では、Run のステータス、Run ID、実行時間、実行元の Notebook などを確認できます。また、Meridian の autolog によって記録されたパラメータも同じ画面で確認できます。
今回の例では、meridian_version、arviz_version、spec.media_effects_dist、spec.max_lag など、Meridian のバージョン情報や ModelSpec に関する項目が自動登録されています。手動で mlflow.log_param() を細かく書かなくても、Meridian 固有の設定が Run に紐づいて残る点が MLflow 連携の便利なところです。

Artifacts タブでは、mlflow.log_artifact() で登録した成果物を確認できます。今回の実装では、meridian_serde.save_meridian() で保存した meridian_model.binpb を artifact_path="model" に登録しているため、model 配下に学習済み Meridian モデルが保存されています。

このように MLflow UI では、実験(Experiment)ごとに Run を管理し、各 Run に紐づくパラメータや成果物を確認できます。今回の MLflow 版では、記録先をローカル SQLite にしているため、実験結果は Google Cloud コンソールではなく MLflow UI から確認します。
autolog で登録されるパラメータ
今回の検証では、autolog を有効にすると、Meridian 固有のパラメータが 72 個自動登録されました。主なパラメータ例は以下のとおりです。

MLflow の autolog は便利ですが、すべての実験条件や評価指標が、比較しやすい「独立したパラメータ」や「メトリクス」として登録されるわけではありません。今回の構成では、たとえば以下のような情報は MLflow UI 上で独立した項目として管理されません。
決定係数、MAPE、wMAPE などのモデル精度指標
media channel や control 変数の一覧などのチャネル定義
roi_mu や roi_sigma の数値そのもの
特に roi_mu や roi_sigma は、prior.roi_m の分布オブジェクト文字列には含まれますが、数値ごとの個別カラムとしては登録されていませんでした。MLflow UI 上で横並び比較したい場合は注意が必要です。
これらのメトリクスや独自パラメータ、データ定義も MLflow 上で比較したい場合は、autolog に加えて mlflow.log_metric() や mlflow.log_params(run_params) で手動登録する設計が必要です。
どちらで管理したほうがよいか?
Agent Platform Experiments と MLflow は、どちらが一方的に優れているというより、使いやすい場面が異なります。今回の構成で比較すると、主な違いは以下の3点です。

インフラ管理に時間をかけず、Google Cloud 上で実験結果をチーム共有したい場合は、Agent Platform Experiments が向いています。特に、すでに Google Cloud を使って開発している場合は、権限管理やコンソール上での確認に載せやすい点がメリットです。ただし、Meridian の設定値は run_params として自分で選んで記録する必要があります。
一方で、まずは個人の手元で実験を回したい場合や、Meridian の autolog で設定記録の手間を減らしたい場合は MLflow が便利です。ただし、チームで共有する段階では MLflow の共有サーバーや保存先の運用設計が必要になります。また、autolog で自動登録されない独自パラメータを比較したい場合は、mlflow.log_params() などの手動ロギングも併用する必要があります。
そのため、チームでの共有や Google Cloud 上での管理を重視する場合は Agent Platform Experiments、手元で素早く検証したい場合は MLflow というように、目的や運用体制に応じて選択するのがよいと思います。
参考
Google for Developers, Introduction to Meridian Demo
https://developers.google.com/meridian/notebook/meridian-getting-startedGoogle for Developers, Module: meridian.mlflow.autolog
https://developers.google.com/meridian/reference/api/meridian/mlflow/autolog