天気予報のニュースで「来週は寒波の影響で野菜の価格が上昇する見込み」と聞いたら、あなたは野菜の値段が数値としてどう動くかを、ニュースを聞く前より正確に予想できるはずです。人間の専門家は、こうして数値のトレンドとテキストの文脈を無意識に統合しながら未来を読んでいます。ところが従来の時系列予測モデルの大半は、過去の数値だけを見て未来の数値を予測する「数値オンリー」の世界に閉じています。
数値だけでは読めない急変を、テキストの文脈が先に予告していることがあります。

図のように、数値系列だけを見ていると「これから何が起きるか」は分かりませんが、同時期のニュース記事や政策発表には、その急変の兆しがすでに書き込まれていることが多くあります。この「テキストを時系列予測に混ぜる」というアイデア自体は新しくありませんが、実際にうまくやるのは驚くほど難しく、質の高いデータセットの設計がボトルネックになってきました。
本記事では、この問題に本格的に取り組んだ研究として、Liu ら(Georgia Tech, NeurIPS 2024 Datasets and Benchmarks Track)による Time-MMD を主要な事例に、マルチモーダル時系列データセットが乗り越えるべき設計課題を解説します。この設計を理解しておくと、次のような場面で役に立ちます。
- 自社データにテキストを組み込みたいとき: 「ニュースやレポートを予測に混ぜたい」という要望は多い一方、素朴にやると精度が上がるどころか評価が歪む落とし穴があります。その回避策を知っておくと実装で消耗しません
- 論文・ベンチマークの評価を正しく読めるようになる: マルチモーダル予測の論文で「大幅改善」と書かれていても、テキストに答えが漏れているだけの見せかけの改善であるケースが少なくありません
本記事の内容
- なぜ数値オンリーの予測には限界があるのか
- 既存マルチモーダル時系列データセットが抱える3つの欠陥(ドメインの狭さ・粗いアライメント・データ汚染)
- Time-MMDの設計 — 9ドメイン・2種類のテキストソース・LLMによる事実と予測の分離
- バイナリタイムスタンプによる数値とテキストの厳密なアライメント
- 数値とテキストを統合する予測アーキテクチャの型
- 合成データによる実証実験 — テキスト予兆特徴でMSEが55%改善する再現と、データ汚染が評価を不当に良く見せる罠
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。

なぜ数値オンリーの時系列予測には限界があるのか
インフルエンザの流行、ガソリン価格、失業率——これらの時系列は、ただの数字の羅列ではありません。感染症の専門家は感染者数の推移だけでなく、ワクチンの普及状況や新しい変異株の報道を踏まえて流行を予測します。エネルギーアナリストは過去の価格推移だけでなく、産油国の政策発表を踏まえて価格を予測します。
ところが、こうした専門知識を反映したテキスト情報は、多くの時系列予測モデルでは活用されていません。理由は単純で、数値の時系列予測の研究は数十年の蓄積があるのに対し、「テキストと数値を正しく組み合わせる」という研究はまだ発展途上だからです。特に大きなボトルネックは、この組み合わせを正しく学習・評価するためのデータセットが存在しなかったことにあります。
では、テキストと数値を組み合わせたデータセットを作ろうとすると、何が難しいのでしょうか。
既存データセットが抱える3つの欠陥
これまでのマルチモーダル時系列データセットの多くは、株価予測などの金融ニュース×株価という組み合わせに限られていました。これを一般化しようとすると、3つの壁にぶつかります。

① ドメインが狭い。 金融ドメインのニュースと株価という組み合わせは典型的ですが、農業・気候・医療・交通といった他分野では、周期性の強さやテキストの疎密さが全く異なる特性を持ちます。金融ドメイン専用に設計された前処理は、他の分野にそのまま持っていけません。
② アライメントが粗い。 「その日に出たニュース記事全部」対「その日の株価1点」という対応づけでは、無関係な記事が大量に混ざり込みます。テキストの中に予測に効く情報が埋もれていても、ノイズに埋もれて学習が進みません。
③ データ汚染。 これが最も見過ごされやすい欠陥です。ニュース記事やレポートには、しばしば「来月は増加が見込まれる」といった未来についての言及が含まれます。これをそのまま学習・評価に使うと、モデルは「予測している」のではなく「答えを写している」だけになります。もう1つの汚染源は、大規模言語モデル(LLM)の知識カットオフです。LLMは学習時点までの膨大なコーパスを記憶しているため、評価用データの時期がLLMの知識カットオフより古いと、モデルは「予測」ではなく「暗記した知識の再生」で高得点を取ってしまいます。
これら3つの欠陥は、いずれも「見た目の性能」と「本当の予測能力」を乖離させます。この課題に体系的に取り組んだのがTime-MMDです。
Time-MMDの設計 — 9ドメイン×2種のテキストソース
Time-MMDは、農業・気候・経済・エネルギー・環境・医療・防災・社会・交通という9つのドメインを横断する、数値とテキストのペアデータセットです。各ドメインについて、失業率や国際貿易収支のような実務的に重要な変数を対象に選び、日次・週次・月次のいずれかの頻度で1950年代から2024年5月まで(環境ドメインのみ2024年6月まで)を収録しています。
構築の全体像は、次の3段階のパイプラインとしてまとめられます。

出典: Liu et al., “Time-MMD: Multi-Domain Multimodal Dataset for Time Series Analysis”, NeurIPS 2024, Fig.1
図の左上「Numerical Series Data Construction」が数値データの構築、左下「Textual Series Data Construction」がテキストデータの構築、そして右側がこの2つを「Task-aware Aligning(タスク志向のアライメント)」でつなぎ合わせ、下流の予測タスク向けデータを作り出す流れです。数値側は信頼できる情報源からの収集・前処理を経て「バイナリタイムスタンプ付き数値系列」になり、テキスト側はキーワード設計・検索・クローリングで集めた生テキストを、LLMによる前処理(不要な内容の除去・事実と予測の分離・要約、図中の🦙アイコンの部分)にかけて「バイナリタイムスタンプ付きテキスト系列」に磨き上げます。最後にこの2つの時系列を、開始・終了時刻で対応づけて予測タスク用のデータに仕立てます。
まず数値側から見ていきましょう。数値データは、政府機関などの信頼できる情報源から収集され、更新が継続していること・多様なドメインをカバーすることを条件に9つのソースが選ばれています。多くは政府系機関のデータで、最も更新頻度が低いものでも半年に一度は更新されます。
一方テキスト側は、性質の異なる2種類のソースを組み合わせています。
- 厳選レポート: 対象変数ごとに1〜2種類、信頼性が高く更新が保証されているレポート(例: インフルエンザの週次報告書)を人手で選定
- Web検索結果: 対象変数ごとに設計したキーワードで検索し、毎週上位の結果を収集
レポートは関連性が高い一方であらゆる期間をカバーできず、検索結果は全期間をカバーできる一方で無関係な記事が多く混ざります。この2つを組み合わせることで、互いの弱点を補っています。実際にTime-MMDの統計を見ると、レポートは関連性が平均80%超と高い一方でカバー率は3割程度、検索結果は関連性こそ2割弱に落ちるもののカバー率は9割超に達しており、「高精度だが穴がある情報源」と「網羅的だが玉石混交の情報源」という対照的な性質がはっきり表れています。
集めた生テキストは、そのままでは使い物になりません。次にこのテキストをどう「磨く」かが、データセットの質を決める核心です。
LLMによる前処理 — フィルタリング・事実と予測の分離・要約
収集した生のテキストデータには、無関係な内容やデータ汚染の火種が大量に含まれています。Time-MMDはこの前処理をLLM(Llama3-70B)に任せ、3つのステップで磨き上げます。
- フィルタリング: 対象変数と無関係な内容を除去し、関連性を高める
- 事実と予測の分離: 「先月は増加した」(事実)と「来月も増加が見込まれる」(予測)を切り分ける
- 要約: 長いテキストを圧縮し、扱いやすくする

このうち②が、先ほど述べたデータ汚染への直接的な対策です。生テキストをLLMに通し、「事実(fact)」と「予測(prediction)」に仕分けてから、事実だけを学習・評価に使います。予測(未来の答え)を訓練データに混入させないことで、モデルが「答えを写す」のではなく本当に「予測する」ことを強制する設計です。
LLMを前処理に使う以上、ハルシネーション(もっともらしい嘘)のリスクも避けて通れません。Time-MMDはこれに対し、(a) LLMに与える文章の紹介を簡潔にする、(b) 判断の根拠としてデータソースを引用するようLLMに義務付ける、(c) 関連性が不確かな場合は「該当なし」と答えることを許可する、という3つの工夫で対策しています。「分からないものを分からないと言わせる」ことで、無理に関連づけて捏造してしまうリスクを減らしているわけです。
テキストが磨かれたら、残るはこれを数値系列と正確に対応づける作業です。
バイナリタイムスタンプによるアライメント
テキストと数値を対応づける最もシンプルな方法は「同じ日付」で紐付けることですが、これは前述の「粗いアライメント」の原因そのものです。レポートは季節ごと、検索結果は週ごとというように、テキストの「有効期間」はソースによってまちまちだからです。
Time-MMDはこの問題を、テキストと数値の両方に開始日と終了日(バイナリタイムスタンプ)を持たせることで解決します。

図のように、レポートAは「2021年1月〜3月」、検索結果Bは「2021年2月〜4月」というように、それぞれのテキストが「いつからいつまで有効な情報か」を明示的に持ちます。予測タスクを組み立てる際は、対象の数値時点に対して、その時点までに有効期間が重なるテキストだけを引き当てればよく、粒度の異なる複数のテキストソースを、後から柔軟に組み合わせられるようになります。
ここまでで、質の高いテキスト×数値のペアデータが揃いました。次の問いは「このデータをどうモデルに食べさせるか」です。
数値とテキストを統合する予測アーキテクチャ
Time-MMDに付属するライブラリ(MM-TSFlib)は、既存の時系列予測モデルを大きく作り替えずにテキストを取り込む、実務的に扱いやすい統合の型を提示しています。

設計のポイントは3つです。
- 数値系列とテキスト系列を独立にモデル化する: 数値側は既存の時系列予測モデル(Transformer系・MLP系など、何でもよい)にそのまま流し、テキスト側は事前学習済みの言語モデルに通します
- 言語モデルは凍結し、射影層だけを学習する: 巨大な言語モデルをゼロから学習し直すのは非現実的なので、パラメータを固定したまま、その出力を時系列予測に使える形に変換する小さな射影層だけを学習します。テキストの系列長は数値と異なることが多いため、プーリング層で次元を吸収します
- 学習可能な重みで統合する: 数値側の予測とテキスト側の情報を、学習可能な線形の重み付けで合成し、最終的な予測値を出します
この設計の利点は、既存の時系列予測モデルの資産をほぼそのまま使い回せる点です。「テキストのために予測モデルを一から作り直す」必要がなく、「テキストを扱う付属部品を後付けする」だけで済みます。
理論の説明はここまでにして、実際にこの効果がどれほどのものか、まず原論文の結果を見てみましょう。
実験結果 — 95%のケースで改善、汚染への警鐘
Time-MMDの実験では、12種類の代表的な時系列予測モデル(Transformer系・MLP系・LLM活用型など)それぞれについて、数値のみ版とテキスト統合版を比較する1,000件超の実験が行われました。

出典: Liu et al., “Time-MMD: Multi-Domain Multimodal Dataset for Time Series Analysis”, NeurIPS 2024, Fig.6
図の各棒グラフは、青が数値のみ(Uni-Modal)、赤がテキスト統合版(Multi-Modal)の平均正規化MSEです。全12モデルで一貫してテキスト統合版が誤差を下げており、実験全体で見ると95%のケースでテキスト統合が数値オンリーを上回り、平均で15〜20%、テキストが豊富なドメインでは最大40%の誤差削減を記録しています。興味深いのは、元々性能が振るわなかったモデル(Informer)ほどテキスト統合の恩恵が大きい傾向で、長期依存の設計とテキストの補助情報が噛み合っている可能性が示唆されています。
論文の結果を鵜呑みにするのではなく、この「テキストが予測を助ける」という核心的な主張と、「データ汚染が評価を歪める」という警鐘の両方を、自分の手で小さく再現してみましょう。
実証実験1: テキスト予兆特徴で予測誤差は本当に下がるか
トレンドと季節性を持つ合成の数値系列に、ランダムなタイミングで「ショック」(急な水準変化)を起こします。ここで、ショックの数ステップ前から、その符号(上がるか下がるか)を示す予兆特徴が観測できるという設定にします。これは「ニュース記事が近々の変化の方向性を示唆する」状況を模したものです。
import numpy as np
def make_synthetic_series(rng, n=400, shock_prob=0.06, lead=6):
"""トレンド+季節性+ノイズの数値系列。ランダムにショックが起き、
そのleadステップ前から符号付きの「予兆」がテキスト特徴として観測できる。"""
t = np.arange(n)
y = 20 + 0.02 * t + 3 * np.sin(2 * np.pi * t / 24) + rng.normal(0, 0.6, n)
event_flag = np.zeros(n) # テキスト予兆特徴(符号付き)
shock_at = []
i = lead
while i < n:
if rng.random() < shock_prob:
sign = rng.choice([-1, 1])
magnitude = rng.normal(7, 1.5) * sign
y[i:] += magnitude * (1 - np.exp(-(t[i:] - t[i]) / 4))
event_flag[i - lead:i] = sign
shock_at.append(i)
i += lead + 10
else:
i += 1
return y, event_flag, shock_at
数値の過去窓(lookback=12)だけを使うモデルと、そこにテキスト予兆特徴を加えたモデルを、単純なリッジ回帰で比較します。
def build_dataset(y, event_flag, lookback=12, horizon=4):
X_num, X_txt, Y = [], [], []
for t in range(lookback, len(y) - horizon):
X_num.append(y[t - lookback:t])
X_txt.append(event_flag[t - lookback:t])
Y.append(y[t + horizon - 1])
return np.array(X_num), np.array(X_txt), np.array(Y)
def ridge_fit_predict(Xtr, ytr, Xte, alpha=1.0):
Xtr1 = np.hstack([Xtr, np.ones((len(Xtr), 1))])
Xte1 = np.hstack([Xte, np.ones((len(Xte), 1))])
w = np.linalg.solve(Xtr1.T @ Xtr1 + alpha * np.eye(Xtr1.shape[1]), Xtr1.T @ ytr)
return Xte1 @ w
rng = np.random.default_rng(42)
y, event_flag, shock_at = make_synthetic_series(rng)
Xn, Xt, Y = build_dataset(y, event_flag)
n_train = int(len(Xn) * 0.7)
Xn_tr, Xn_te, Xt_tr, Xt_te = Xn[:n_train], Xn[n_train:], Xt[:n_train], Xt[n_train:]
Y_tr, Y_te = Y[:n_train], Y[n_train:]
pred_uni = ridge_fit_predict(Xn_tr, Y_tr, Xn_te)
pred_multi = ridge_fit_predict(np.hstack([Xn_tr, Xt_tr]), Y_tr, np.hstack([Xn_te, Xt_te]))
mse_uni = np.mean((pred_uni - Y_te) ** 2)
mse_multi = np.mean((pred_multi - Y_te) ** 2)
print(f"数値のみMSE = {mse_uni:.3f}")
print(f"数値+テキストMSE = {mse_multi:.3f}")
print(f"削減率 = {(mse_uni - mse_multi) / mse_uni * 100:.1f}%")
実行結果は次のとおりです。
数値のみMSE = 4.268
数値+テキストMSE = 1.910
削減率 = 55.3%

系列全体を見ると、14回のショックがランダムなタイミングで発生し、それぞれ水準を大きく変化させています。

MSEは4.27から1.91まで、55.3%改善しました。Time-MMDが報告した「平均15〜20%、テキストが豊富なドメインで最大40%」という数字と比べても遜色ない、あるいはそれ以上の改善幅です。これは今回の合成データが「予兆とショックの対応が明確」という、テキストが最も効きやすい理想的な状況を作っているためで、実データではここまで綺麗な関係は稀ですが、テキスト情報が数値だけでは見えない変化を先読みできるという核心的なメカニズムは、この単純な実験からも確認できます。
ショック前後を拡大すると、その理由がより直接的に見えます。

黒の実測値がショック直後に急上昇する局面で、数値のみモデル(青の破線)は変化に気づくのが遅れ、しばらく低い予測を出し続けます。一方、テキスト予兆特徴を持つモデル(赤の破線)は、予兆が立った時点からすでに上昇方向を織り込んでおり、実測値への追従がはるかに速いことが分かります。数値だけのモデルが「過去の延長線上」でしか予測できないのに対し、テキストは「これから起きること」を先取りする情報源になっているのです。
ここまでは「正しくテキストを使えば効果がある」という良い話でした。次は、Time-MMDが警告するもう一つの側面、データ汚染の罠を実際に踏んでみます。
実証実験2: データ汚染は評価をどれだけ狂わせるか
同じ合成データに対して、3種類のテキスト特徴を用意します。
- 数値のみ: テキストを一切使わない
- 事実のみ(正しい前処理): 実験1と同じ、符号付きの予兆特徴(未来の実測値そのものは含まない)
- 汚染あり(未来情報が漏洩): 「来月の値は○○になる見込み」のように、正解ラベルの値そのものにわずかなノイズを乗せただけの特徴を追加
3つ目は、レポートの中に「速報値」のような形で答えがほぼそのまま書かれてしまっているケースを模したものです。独立した乱数シードで新しい合成系列を作り直し、3種類の特徴を同条件で比較します。
rng2 = np.random.default_rng(7)
y2, event_flag2, _ = make_synthetic_series(rng2)
Xn2, Xt2, Y2 = build_dataset(y2, event_flag2)
n_train2 = int(len(Xn2) * 0.7)
Xn2_tr, Xn2_te = Xn2[:n_train2], Xn2[n_train2:]
Xt2_tr, Xt2_te = Xt2[:n_train2], Xt2[n_train2:]
Y2_tr, Y2_te = Y2[:n_train2], Y2[n_train2:]
mse_num_only = np.mean((ridge_fit_predict(Xn2_tr, Y2_tr, Xn2_te) - Y2_te) ** 2)
mse_clean = np.mean((ridge_fit_predict(np.hstack([Xn2_tr, Xt2_tr]), Y2_tr, np.hstack([Xn2_te, Xt2_te])) - Y2_te) ** 2)
# 汚染特徴: 正解ラベルYにわずかなノイズを乗せただけの「リーク特徴」
leak_noise_tr = rng2.normal(0, 0.3, size=len(Y2_tr))
leak_noise_te = rng2.normal(0, 0.3, size=len(Y2_te))
leak_feat_tr = np.hstack([Xt2_tr, (Y2_tr + leak_noise_tr).reshape(-1, 1)])
leak_feat_te = np.hstack([Xt2_te, (Y2_te + leak_noise_te).reshape(-1, 1)])
pred_leak = ridge_fit_predict(np.hstack([Xn2_tr, leak_feat_tr]), Y2_tr, np.hstack([Xn2_te, leak_feat_te]))
mse_leak = np.mean((pred_leak - Y2_te) ** 2)
print(f"数値のみMSE = {mse_num_only:.3f}")
print(f"事実のみ(正しい前処理)MSE = {mse_clean:.3f}")
print(f"汚染特徴(未来漏洩)MSE = {mse_leak:.3f}")
実行結果は次のとおりです。
数値のみMSE = 4.365
事実のみ(正しい前処理)MSE = 1.929
汚染特徴(未来漏洩)MSE = 0.074

数値のみが4.37、正しく前処理された事実特徴が1.93と、ここまでは実験1と同じ健全な改善です。ところが未来情報が漏れた汚染特徴を使うと、MSEは0.074という異常なまでに低い値になります。答えにわずかなノイズを乗せただけの特徴を「予測材料」として与えているのですから当然ですが、この数字だけを見せられたら「驚異的な精度のモデルができた」と誤解しかねません。
これこそがTime-MMDが警告する「データ汚染による評価の歪み」の正体です。テキストの中に少しでも未来の答えが紛れ込んでいると、モデルの実力とは無関係に評価スコアが跳ね上がります。マルチモーダル時系列予測の論文やベンチマークで大幅な改善が報告されていたら、「そのテキストに本当に未来の答えが含まれていないか」を疑ってみる価値があります。事実と予測を分離するという、地味に見えるTime-MMDの前処理ステップが、実は評価全体の信頼性を支える生命線だったことが、この実験からも実感できるはずです。
このデータ汚染の落とし穴は、実はデータセット固有の設計判断とも関係しています。原論文では、ドメインによってテキスト統合の効果に差が出ることも報告されており、関連する事実の数が多いドメインほど誤差削減幅が大きい一方、防災ドメインのように「災害の発生自体が本質的に予測困難」な領域では、過去のテキストが豊富にあってもその恩恵が小さいことが示されています。予測対象の性質そのものが、テキストからどれだけ恩恵を受けられるかを左右するわけです。またLLMのバックボーンを変えても(BERTからLlama-3-8Bまで)性能に明確な相関は見られず、パラメータ規模の大きさが必ずしもマルチモーダル予測の質に直結しない、という実務上重要な指摘もされています。
この設計が拓く応用範囲
テキスト×数値の質の高いペアデータが手に入ると、予測タスク以外にも応用が広がります。原論文が指摘する代表的な方向性を3つ挙げておきましょう。
欠測値補完への応用です。センサ故障やシステム不安定によって数値データが欠落する場面は珍しくありませんが、その期間の事故報告や気象情報といったテキストがあれば、数値だけからは推測できない補完のヒントになります。異常検知への応用も自然です。例えば「インフルエンザの流行」という語がテキストに出現した時点を、対応する数値データの異常候補として弱ラベル付けする、といった使い方が考えられます。そしてマルチモーダル基盤モデルへの応用です。画像や動画の分野では基盤モデルの開発が先行していますが、時系列分野でテキストを本格的に統合した基盤モデルはまだ発展途上であり、Time-MMDのような高品質なデータセットの存在が、この分野の発展を後押しすると期待されています。
まとめ
本記事では、テキストと数値を統合する時系列予測データセットの設計を、Time-MMDを主要事例に解説しました。
- 数値だけの予測には限界がある: テキストには、数値の過去だけでは読めない将来の変化の兆しが含まれることがある
- 既存データセットの3つの欠陥: ①ドメインが狭い(金融偏重)②アライメントが粗い(同日というだけの紐付け)③データ汚染(テキストに未来の答えが混入)
- Time-MMDの設計: 9ドメイン×2種のテキストソース(レポート+Web検索)、LLMによるフィルタリング・事実と予測の分離・要約、バイナリタイムスタンプによる厳密なアライメント
- 統合アーキテクチャの型: 数値とテキストを独立にモデル化し、言語モデルは凍結して射影層だけ学習し、学習可能な重みで統合する。既存の予測モデルを作り直さずに済む設計
- 実証実験: 符号付きテキスト予兆特徴でMSEが55.3%改善(Time-MMDの報告と同じ方向の効果を確認)。一方で、未来情報が漏れた汚染特徴を使うとMSEが0.074まで異常に低下し、データ汚染が評価を根本から狂わせることを実測した
「テキストを時系列予測に混ぜる」というアイデアは直感的には魅力的ですが、その効果を正しく測るには、想像以上に地味で丁寧なデータ設計が必要でした。次に時系列予測の論文やベンチマークを読むときは、精度の数字だけでなく、その裏にあるデータセットの設計を見る目を持てるはずです。
次のステップとして、以下の記事も参考にしてください。
