MCMC を収束させる
収束しない場合の一般的な原因は、次のどちらかです。
- データに対してモデルが適切に指定されていない。この問題は、尤度(モデル仕様)や事前分布に原因がある可能性があります。
-
Meridian.sample_posterior
のn_adapt + n_burnin
引数かn_keep
引数の大きさが不十分。
チェーンを収束させるには、次の推奨事項を順番に試してください。
- 次の質問に答えることで、識別可能性または弱い識別可能性があるかを確認します。
-
多重共線性が高い
media
変数やcontrols
変数がありますか? -
media
変数やcontrols
変数のばらつきが小さすぎて、効果を推定するのが困難ですか? -
media
かcontrols
のどちらかが時間と高い相関関係にあるか、時間と完全に共線していますか?詳しくは、knots < n_times
を使用する必要がある場合をご覧ください。 -
media
変数のいずれかが非常にスパースですか?スパースとは、あるチャネルでの施策がほとんどないか、まったく施策のない地域が多すぎるか、メディア施策がまったくない期間が多すぎる(特にknots
の数がn_times
に近い場合)ことを意味します。 - 事前分布を再評価します。情報量が非常に少ない事前分布では収束が困難になることが多くありますが、特定の状況では情報量が非常に多い事前分布でも収束が困難になることがあります。
- KPI が収益である場合、または「KPI あたりの収益」データがある場合は、有料メディア チャネル向けの ROI の事前分布と調整に記載されているアドバイスをご検討ください。
- 収益データがない場合は、有料メディア チャネル向けの結果が収益でない場合にカスタムの事前分布を設定するに記載されているアドバイスをご検討ください。メディアの合計貢献度の事前分布の平均または標準偏差あるいはその両方を小さくすると、十分な程度の正則化を達成できる場合があります。
-
モデリング オプションを調整します。特に、
ModelSpec
のknots
引数を減らしてみてください。調整できる他のモデリング オプションには、ModelSpec
のunique_sigma_for_each_geo
やmedia_effects_dist
があります。 -
データエラーがないかをチェックします。たとえば、地域の
population
とmedia
の順序に不一致がないかどうかをチェックします。Meridian のモデルでは、メディア効果と制御効果に地域階層があることが前提です。この前提条件にデータが合っていない場合は、階層分散(eta_m
とxi_c
)を測定するパラメータ(HalfNormal(0.1)
など)の事前分布を設定することで、これらのパラメータをさらに正則化してください。また、Deterministic(0)
の事前分布を使用することで、地域階層の前提条件を無効にすることもできます。 - 十分なデータがあるかどうかを検討します。詳しくは、必要なデータ量をご覧ください。
事後分布が事前分布と同じ場合
モデルで理解しようとしている変数の数が多い場合は、個々の変数を理解するためのデータを増やす必要があります。MMM は通常、多くの変数について、それほど多くないデータポイントで推論を試みます。特に国レベルのモデルの場合は、それが顕著になります。つまり、特定のメディア チャネルのデータに情報がほとんど含まれていない状況になります。こうした状況は、特定のチャネルの費用が低い場合や、スケーリングされたメディア施策での分散が極めて小さい場合、またはスケーリングされたメディア施策のチャネル間における相関が高い場合に、悪化する可能性があります。データ量について詳しくは、必要なデータ量をご覧ください。費用の少ないチャネルについて詳しくは、費用の少ないチャネルをご覧ください。
次第に情報が少なくなる事前分布を使用すると、事前分布と事後分布を区別できます。事前分布はデータが考慮される前のパラメータの推定値を表すもので、事後分布はデータが考慮された後のパラメータの推定値を表すものでした。データに含まれる情報がほとんどない場合、前後のデータは類似したものになります。特に、事前分布が相対的に情報を多く含んでいる場合はそうなります。相対的とは、事前分布に含まれる情報とデータに含まれる情報を比較した場合を指します。つまり、十分に情報の少ない事前分布を設定すれば、常にデータが事前分布より意味を持ちます。ただし、事前分布に含まれる情報がデータに比べて少なく、データに含まれる情報も少ない場合は、多くの不確実性を反映して事後分布が非常に広くなります。
物事を単純化する方法の一つは、ROI などのパラメータに設定する事前分布を考えることです。信頼できる妥当な事前分布を設定すれば、事前分布の相対的な情報量の多さについて、あまり心配する必要はありません。データに情報がほとんどないかまったくない場合、事前分布と事後分布が近くなることは、ベイズ統計の観点で理にかなっています。データに多くの情報が含まれている場合、事前分布はこのデータに基づいて変動する可能性があります。
費用の少ないチャネル
費用の少ないチャネルは特に、ROI 事後分布が ROI 事前分布に似る傾向があります。各チャネルには、データに適切に合致する ROI 値の範囲があります。この範囲が広く、事前確率質量のほとんどを完全にカバーしている場合、事後分布は事前分布と似やすくなります。費用の少ないチャネルがモデルの適合性に大きな影響を与えるには、非常に大きな ROI が必要になります。そのため、妥当な ROI 値の範囲が、費用の多いチャネルよりずっと広くなる傾向があります。ROI 値の範囲が広ければ、データに適切に合致する可能性が高くなります。
メディア効果は、指定されたメディア指標(インプレッション数やクリック数など)に基づいてモデル化されます。メディア指標の規模や費用レベルはいずれも、モデルの適合性に影響せず、チャネルに合理的に割り振ることができる増分結果の範囲にも影響しません。ROI は、増分結果を費用で割ったものと定義されます。そのため、増分結果の妥当な値の範囲を ROI の範囲に変換すると、費用の多いチャネルでは、データに適切に合致する ROI 値の範囲が狭くなります。
注: 通常の最小二乗回帰の場合、共変量のスケールは適合性に影響しません。スケールは、事前分布が係数に適用される場合に、ベイズ回帰設定で重要な意味を持つ場合があります。ただし Meridian では、各メディア指標にスケーリング変換が適用されます。たとえば、チャネルのインプレッション数を 100 倍にスケーリングしても、Meridian モデルの適合性には影響しません。
使用された事前分布によって ROI の結果が大きく異なる場合
ROI の結果は、デフォルトの ROI 事前分布が使われるか、デフォルトのベータ事前分布が使われるかによって、大きく異なる場合があります。
デフォルトの ROI 事前分布とデフォルトのベータ事前分布を使用すると、ROI の結果に影響を及ぼす可能性があります。その理由は次のとおりです。
- デフォルトの ROI 事前分布を使用すると、各メディア チャネルの事後 ROI が同じ分布に向かって正則化されます。それぞれのチャネルが公平に扱われるため、これは良いことです。
- メディア係数のデフォルトの事前分布(ベータ)を使用すると、各メディア チャネルの事後 ROI は異なる分布に向かって正則化されます。これは、メディアデータに行われるスケーリングが、チャネル全体で使われるスケーリングと同じでないためです。したがって、同じベータ値でも、チャネルごとに ROI が異なります。メディア係数のデフォルトの事前分布も、メディアデータのスケーリングにチャネル間で大きな違いが生じ得ることを説明するには、デフォルトの ROI 事前分布と比較して情報が多くありません。
- データに含まれる情報がほとんどない場合、事前分布と事後分布は似たものになります(事後分布が事前分布と同じ場合で説明されています)。データに含まれる情報がほとんどなく、ベータ事前分布が使われている場合、事後 ROI はメディア チャネルによって違ってきます。ただし、この違いはメディア チャネルの不均衡な事前分布のみに起因するもので、データに起因するものではありません。まとめると、違いが不均衡な事前分布だけに起因する場合は、チャネル間で ROI の結果が異なることを、データからシグナルを検出しているからだとは解釈しないことが重要です。
Meridian.sample_posterior
実行時の ResourceExhaustedError
Meridian.sample_posterior
が tfp.experimental.mcmc.windowed_adaptive_nuts
を呼び出すことで、GPU のメモリを大量に消費する可能性があります(多数のチェーンを並列でサンプリングした場合や、大規模なデータセットでトレーニングした場合)。
ピーク時の GPU メモリ消費量を減らす方法の一つは、チェーンを順次サンプリングすることです。この機能を利用するには、整数のリストを n_chains
に渡します。たとえば n_chains=[5, 5]
は、毎回引数 n_chains=5
を指定して tfp.experimental.mcmc.windowed_adaptive_nuts
を連続して呼び出し、合計 10 個のチェーンをサンプリングします。
なお、この処理ではランタイム コストが発生します。この方法では、MCMC のサンプリング メソッドを連続して呼び出すことでメモリ消費量を削減しているため、n_chains
に渡すリストの長さに比例して、合計ランタイムが増加します。たとえば、n_chains=[5,5]
のランタイムは n_chains=10
の最大 2 倍、n_chains=[4,3,3]
のランタイムは最大 3 倍になる可能性があります。
オーガニック メディアの貢献度が高すぎる場合
オーガニック メディアの貢献度が予想よりも高い場合、使用している事前分布が適切でない可能性があります。オーガニック メディアには ROI が定義されていないため、係数(beta_om
または beta_orf
)の事前分布に基づく回帰係数のパラメータ化が使用されます。オーガニック メディアの貢献度が予想よりも高かった場合は、オーガニック メディア チャネルに使用されている事前分布の見直しをおすすめします。デフォルトでは、想定される事前分布は比較的情報量が少ないですが、事前分布の平均値が高くなるようなプラスの効果をもたらすと考えられます。データに含まれる情報がほとんどない場合、事後分布の平均値が高くなる可能性もあります。これが問題であれば、より多くの質量を分布範囲の下限に含む、代替の事前分布を使用することを検討してください。また media_effects_dist = 'log_normal'
の場合、$\beta_i^{[OM]}$ は地域レベルのメディア効果のログの事前平均「$\log(\beta_{g,i}^{[OM]})$」であることに注意が必要です。この場合、デフォルトの事前分布 HalfNormal(5.0)
では、ゼロから大幅に離れた事前分布の質量が想定されています。累乗によってゼロからさらに離れるため、HalfNormal(0.1)
など、質量がゼロに近い事前分布を検討することをおすすめします。分散は小さいですが、累乗されたスケールでは可能な値の範囲が広くなります。あるいは、より柔軟性を持たせるために、位置とスケールの両方を設定できる正規の事前分布(Normal(0.0, 3.0)
など)を検討するのもよいでしょう。同様に media_effects_dist = 'normal'
の場合は、デフォルトよりもスケールが小さい事前分布(HalfNormal(1.0)
など)の使用を検討してください。
グループや地域間で差異のないコントロールに関するエラー
このエラーは、各地域全体で同一の全国レベルの変数があり、knots = n_times が設定されていることを意味します。knots = n_times の場合、各期間に独自のパラメータが割り当てられます。全国レベルの変数は、時間の経過とともに変化しますが、地域によって変化することはありません。 そのため、全国レベルの変数は時間と完全に共線的な関係にあり、期間ごとのパラメータがあるモデルとの冗長性があります。冗長とは、全国レベルの変数を保持するか、knots < n_times を設定できることを意味します。どの変数を選択するかは、解釈の目標によって異なります。
負の決定係数
トレーニング セットまたはテストセットの決定係数は、以下のような理由で負の値になる場合があります。
- 強力な事前分布とシグナルの弱いデータ(シグナル対ノイズ比が低い)の組み合わせでは、事後分布が事前分布の影響を大きく受ける可能性があります。この場合、トレーニング セットで構築されるメリディアン モデルの二乗和誤差(SSE)は総平方和(SST)より大きくなり、決定係数が負の値になることがあります。詳しくは、Gelman et. al.(2018)をご参照ください。
- テストセットの決定係数は、モデルがトレーニング データに適合しているものの、テストセットに対して一般化できない場合、負の値になります。これは、どのモデルでも発生する可能性があります。メリディアンでは、ホールドアウト データが最後の N 個の連続する時点として指定されている場合に、この問題が発生します。詳しくは、ホールドアウト観測をご覧ください。
- データ入力エラーが原因で、決定係数が負の値になる場合もあります。決定係数は元の KPI スケールで測定されますが、モデリングは 1 人あたりのスケールで行われるため、地域レベルの人口が不正確な場合、結果に大きな影響を及ぼす可能性があります。よくあるもう 1 つの入力エラーは、KPI に対して人口のスケーリングが二重に実施されるケースです。メリディアンに入力する前に KPI に対して事前スケーリングを実施すると、その後 1 人あたりの KPI が自動的にスケーリングされるため、スケーリングが重複することになります。