売上を予測するモデルを2つ作ったとします。片方は普段の予測がわずかにブレるモデル、もう片方は普段は正確だが月に一度だけ大きく外すモデル。どちらが「良い予測」でしょうか。
この問いに答えるには、予測のずれを1つの数字にまとめるものさしが必要です。時系列予測でもっともよく使われるものさしが MAE(平均絶対誤差)と MSE(平均二乗誤差)、そしてMSEの平方根である RMSE です。名前は似ていますが、両者は「どんな外し方を嫌うか」がまったく違います。そのため、同じ予測結果でも、選んだ指標次第で「勝つモデル」が入れ替わることすらあります。
指標の性格を理解すると、次のような判断ができるようになります。
- 需要予測・在庫最適化: たまの大外れが致命的なら、大きな誤差を重く罰するMSE/RMSEで評価する
- センサーの異常値を含むログ予測: 外れ値に引きずられたくないなら、頑健なMAEで評価する
- 複数系列(店舗別・商品別)のモデル比較: スケールの違う系列をまたぐなら、相対誤差のMAPEに切り替える
本記事の内容
- MAE・MSE・RMSEの直感的な意味と数学的定義
- 「絶対値」と「二乗」が生む性格の違い(外れ値感度・勾配・最小化解)
- なぜMAE最小化は中央値・MSE最小化は平均になるのかの導出
- スケール依存の問題とMAPE、外れ値に強いHuber損失
- Pythonでの実装と、指標で勝者が逆転する実例
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
損失関数の記事では「訓練で何を最小化するか」を扱いました。本記事はその双子のテーマ、「できあがったモデルの予測をどう採点するか」を、時系列予測に軸足を置いて掘り下げます。
予測の「ずれ」を1つの数字にする
時系列予測とは、時刻 $t$ ごとに真の値 $y_t$ を予測値 $\hat{y}_t$ で当てにいく営みです。当然、毎回ぴったり当たることはありません。各時刻には必ず残差(residual)と呼ばれるずれが残ります。
$$ e_t = y_t – \hat{y}_t $$
下の図は、12個の時刻について実測値(青)と予測値(赤)を並べ、両者の差を灰色の縦線で結んだものです。予測が実測より上にあるか下にあるかで残差の符号は変わりますが、縦線の長さこそが「その時刻でどれだけ外したか」を表します。

この図から2つのことが読み取れます。第一に、残差はプラスにもマイナスにもなります。だから単純に $e_t$ をそのまま足し合わせると、プラスとマイナスが打ち消し合って「ずれていないように見える」誤った評価になってしまいます。第二に、縦線の長さはバラバラで、大きく外している時刻($t=9$ 付近)もあれば、ほぼ当たっている時刻もあります。
評価指標に求められるのは、この $n$ 本の縦線を符号に惑わされず、しかも大外しを適切に扱いながら、1つの代表値に集約することです。打ち消しを防ぐ方法は2つあります。絶対値をとるか、二乗するか。この分かれ道が、そのままMAEとMSEの分かれ道になります。
MAE — 誤差の絶対値を平均する
まず素直なのは、残差の絶対値をとってから平均する方法です。これが MAE(Mean Absolute Error, 平均絶対誤差)です。
$$ \begin{equation} \mathrm{MAE} = \frac{1}{n}\sum_{t=1}^{n} |y_t – \hat{y}_t| \end{equation} $$
絶対値をとるので符号の打ち消しは起きません。しかも定義がそのまま「平均して1回あたり何単位ずれるか」を意味します。売上予測でMAEが3.2万円なら、「予測は平均して3.2万円ずれる」と、単位つきでそのまま解釈できる。この解釈のしやすさがMAEの最大の長所です。
下の図は、先ほどの12点それぞれの $|e_t|$ を棒の高さで示し、その平均(=MAE)を破線で引いたものです。

棒の高さは残差の絶対値そのものです。$t=9$ の大外し(約2.2)も、小さなずれ(約0.5〜0.7)も、高さがそのまま足し合わされて平均される点に注目してください。MAEは大きい誤差を特別扱いしません。誤差2.2の1点は、誤差1.1の2点とちょうど同じだけMAEに寄与します。この「誤差を額面どおりに扱う」性質が、次に見るMSEとの決定的な違いを生みます。
MSE — 誤差を二乗してから平均する
もう一つの打ち消し回避法が二乗です。これが MSE(Mean Squared Error, 平均二乗誤差)です。
$$ \begin{equation} \mathrm{MSE} = \frac{1}{n}\sum_{t=1}^{n} (y_t – \hat{y}_t)^2 \end{equation} $$
二乗すれば必ず非負になるので、こちらも符号の打ち消しは起きません。しかし二乗には副作用があります。大きな誤差ほど極端に重くなるのです。誤差1は二乗しても1のままですが、誤差3は二乗すると9、誤差5は25になります。誤差が3倍になると寄与は9倍になる。
下の図は、同じ12点の $e_t^2$ を棒で示したものです。先ほどのMAEの図と見比べてください。

MAEの図では横並びに近かった棒が、MSEでは高低差が一気に開きます。$t=9$ の大外し(残差 −2.2)は二乗で約4.9となり、他の小さな誤差の棒を圧倒しています。MSEの値は、実質的にいちばん大きな誤差によって支配されるのです。裏を返せば、MSEを下げたければ「たまの大外しを絶対に出さない」ことが最優先になります。小さなずれをいくら丁寧に潰しても、大外しが1つあればMSEは下がりません。
では、この「二乗するかしないか」の違いは、罰則の形として見るとどうなるのでしょうか。
罰則の形 — V字と放物線
誤差1つあたりの「罰の重さ」を、誤差 $e$ の関数としてプロットすると両者の性格が一目でわかります。MAEの罰則は $|e|$、MSEの罰則は $e^2$ です。

絶対誤差 $|e|$ は原点から左右に一定の傾きで伸びるV字です。誤差が2倍になれば罰も2倍。線形です。一方の二乗誤差 $e^2$ は放物線を描き、原点付近では $|e|$ より下(=小さな誤差にはむしろ寛容)ですが、$|e|>1$ を超えると急速に $|e|$ を追い抜き、外れるほど加速度的に罰が増えます。
この形の違いが、実務での使い分けに直結します。小さなブレは気にせず大外しだけを絶対に避けたいならMSE、すべての誤差を公平に額面で扱いたいならMAE。同じデータでも、この罰則の形の違いによって、次に見るように外れ値への反応がまるで変わります。
外れ値への感度 — 1点の暴れがどう効くか
時系列データには、センサーの一時的な異常、突発的なイベント、記録ミスなどで、1点だけ極端に外れることがよくあります。このとき各指標がどれだけ動くかを見てみましょう。
50点の誤差(標準正規乱数)を用意し、そのうち1点の誤差だけを0から10まで大きくしていったときの、MAE・MSE・RMSEの変化が下の図です。

MAE(緑)はほとんど水平です。1点が10まで外れても、50点で割るので寄与は $10/50=0.2$ 程度しか増えません。対してMSE(オレンジ)は放物線的に跳ね上がります。誤差10は二乗で100、これを50で割っても2の上乗せになり、他の49点の寄与を軽く超えてしまう。RMSE(紫)はMSEの平方根なので上昇はマイルドですが、それでもMAEよりはるかに敏感です。
この図の教訓は明快です。外れ値に引きずられたくないならMAE、外れ値こそが最重要の失敗だと考えるならMSE。たとえば電力需要のスパイクを見逃すと停電につながるならMSEで大外しを厳しく罰すべきですし、逆にノイズ混じりのIoTログでは頑健なMAEの方が実態に合った評価になります。
この「外れ値への態度」の違いは、実は「予測値としてどんな代表値を最適とみなすか」という、より深い性質から来ています。次にそれを導出しましょう。
MAE最小化は中央値、MSE最小化は平均
いちばん単純な予測、「全時刻を1つの定数 $c$ で予測する」を考えます。この $c$ を動かして誤差を最小にするとき、MAEとMSEでは答えが違います。MSEを最小にする $c$ はデータの平均、MAEを最小にする $c$ はデータの中央値になります。これは統計学で最もエレガントな事実の一つです。
まずMSEから示します。MSEを $c$ の関数として微分し、ゼロと置きます。
$$ \frac{d}{dc}\,\frac{1}{n}\sum_{t=1}^{n}(y_t – c)^2 = \frac{1}{n}\sum_{t=1}^{n} 2(y_t – c)(-1) = -\frac{2}{n}\sum_{t=1}^{n}(y_t – c) $$
これをゼロと置くと $\sum (y_t – c)=0$、つまり $\sum y_t = nc$ です。$c$ について解くと、
$$ c^\ast = \frac{1}{n}\sum_{t=1}^{n} y_t = \bar{y} $$
となり、平均が出てきます。二乗誤差は放物線なので谷は1つ、これが唯一の最小点です。
次にMAEです。$|y_t – c|$ を $c$ で微分すると、$y_t > c$ なら $-1$、$y_t < c$ なら $+1$、すなわち $-\mathrm{sign}(y_t - c)$ です。合計をゼロと置くと、
$$ \frac{d}{dc}\,\frac{1}{n}\sum_{t=1}^{n}|y_t – c| = \frac{1}{n}\sum_{t=1}^{n}\big(-\mathrm{sign}(y_t – c)\big) = 0 $$
これは「$c$ より大きいデータ点の数」と「$c$ より小さいデータ点の数」が釣り合う $c$ を意味します。上と下がちょうど半々になる点、それが中央値の定義そのものです。
$$ c^\ast = \mathrm{median}(y_1, \dots, y_n) $$
下の図は、右に長い裾を持つデータ(大きな外れ値を1つ含む)に対して、定数予測 $c$ を横軸にMAEとMSEの損失曲線を描いたものです。

左のMAE曲線は中央値(4.0)で最小、右のMSE曲線は平均(5.8)で最小になっています。外れ値が1つあるだけで平均は中央値より右に大きく引っ張られ、両者の最適予測がずれます。平均は外れ値に敏感、中央値は頑健——この統計の基本性質が、そのままMSE(外れ値に敏感)とMAE(頑健)の性格に対応しているわけです。前節の外れ値感度の図は、この事実の別の見え方だったのです。
勾配の違い — 学習の観点
MAEとMSEは、モデルを訓練する損失関数としても使われます。このとき効いてくるのが勾配の違いです。誤差 $e$ に関する罰則の微分を見てみましょう。
$$ \frac{d}{de}\,e^2 = 2e, \qquad \frac{d}{de}\,|e| = \mathrm{sign}(e) $$

MSEの勾配 $2e$(オレンジ)は誤差に比例します。大きく外していれば勾配も大きく、パラメータは大きく動く。誤差が小さくなるにつれ勾配も小さくなり、最小点付近で滑らかに収束します。一方MAEの勾配(緑)は誤差の符号だけで、大きさは常に $\pm1$。大外ししていても勾配は1のままなので学習が遅く、逆に誤差ゼロ付近では勾配がプツンと切り替わり、$e=0$ で不連続(厳密には劣微分)になります。
この違いから、実務では次の傾向があります。MSEは最適化しやすく収束も速いが外れ値に過剰反応する。MAEは頑健だが $e=0$ 付近で最適化がやや不安定。両者の弱点を補うのが、後で紹介するHuber損失です。
RMSEはMAE以上 — 差はばらつきを表す
MSEには「単位が二乗になってしまう」という難点があります。売上(万円)を予測したのにMSEの単位は「万円の二乗」で、直感的に解釈できません。そこで平方根をとって単位を元に戻したのが RMSE(Root Mean Squared Error)です。
$$ \begin{equation} \mathrm{RMSE} = \sqrt{\mathrm{MSE}} = \sqrt{\frac{1}{n}\sum_{t=1}^{n}(y_t – \hat{y}_t)^2} \end{equation} $$
RMSEはMAEと同じ単位を持つので、直接比べられます。そして重要な数学的事実として、常に $\mathrm{RMSE} \ge \mathrm{MAE}$ が成り立ちます。これはコーシー・シュワルツの不等式(あるいはイェンセンの不等式で $\sqrt{\cdot}$ の凸性を使う議論)から従います。
等号が成り立つのは全ての誤差の大きさが等しいときだけで、誤差にばらつきがあるほど両者の差は開きます。実際、両者の差は誤差の標準偏差と関係し、$\mathrm{RMSE}^2 = \mathrm{MAE}^2 + (\text{誤差のばらつきに由来する項})$ のような分解ができます。下の図で確かめましょう。

誤差の標準偏差 $\sigma$ を横軸に、平均誤差ゼロの正規乱数からMAEとRMSEを計算しました。RMSE(紫)は常にMAE(緑)以上で、ばらつきが大きいほど差が広がっています。この性質は診断に使えます。RMSEとMAEの比が1に近ければ誤差は粒ぞろい、比が大きければ「たまに大きく外している」というサインです。両方を併記して比を見るだけで、モデルの外し方の癖が読めるのです。
指標で勝者が逆転する
ここまでの話をまとめる実例を見ましょう。2つの予測モデルを、周期成分に2箇所のスパイク(突発イベント)を持つ時系列に当てます。
- モデルA: スパイクにきちんと追従するが、普段の予測がややノイジー
- モデルB: 普段は非常に正確で滑らかだが、スパイクを丸ごと外す

実測(青)に対し、モデルA(赤)は $t=30, 55$ のスパイクを捉えていますが平常時は小刻みにブレます。モデルB(緑)は平常時ぴったりですがスパイクでは全く追いつけず大きく外します。凡例の数値を見てください。MAEではモデルB(0.79 < 0.99)が勝ち、MSEではモデルA(1.48 < 3.20)が勝つ——評価指標を変えるだけで結論が逆転します。
これは理屈どおりです。MAEは大外しを額面でしか罰しないので、平常時が正確なBが有利。MSEはスパイクの大外し(二乗で巨大化)を極端に嫌うので、そこを外さないAが有利。「どちらが良いモデルか」に唯一の正解はなく、スパイクを外すことがどれだけ致命的かというビジネス上の判断が、指標の選択そのものなのです。
スケール依存とMAPE
MAE・MSE・RMSEには共通の弱点があります。系列のスケールに依存することです。売上が数百万円の系列と、数十件のアクセス数の系列では、同じ「10%ずれ」でもMAEの絶対値がまるで違います。複数系列でモデルを比較したいとき、これは困ります。
そこで使うのが相対誤差、MAPE(Mean Absolute Percentage Error, 平均絶対パーセント誤差)です。
$$ \begin{equation} \mathrm{MAPE} = \frac{100}{n}\sum_{t=1}^{n}\left|\frac{y_t – \hat{y}_t}{y_t}\right| \ \ [\%] \end{equation} $$
各時刻の誤差を実測値で割ってパーセント化するので、スケールの違う系列をまたいで比較できます。

左の図では、同じ相対誤差10%でも系列のスケールが大きいほどMAEが跳ね上がっています。これでは「アクセス数の予測はMAEが大きいから下手」と誤解しかねません。右のMAPEなら、どの系列も約10%で横並びになり、公平に比較できます。
ただしMAPEにも罠があります。$y_t$ で割るため、実測値がゼロや極端に小さい時刻があると値が爆発します(間欠需要データで特に問題)。また、過小予測(最大100%)より過大予測(上限なし)を軽く罰する非対称性もあります。こうした欠点を補うため、実務ではsMAPE(対称MAPE)やMASE(ナイーブ予測を基準にした尺度)も使われます。系列にゼロが含まれるなら、MAPEは避けてMASEやRMSEを選ぶのが安全です。
Huber損失 — MAEとMSEのいいとこ取り
最後に、MAEとMSEの折衷案である Huber損失 を紹介します。「小さな誤差にはMSEのように滑らかで最適化しやすく、大きな誤差にはMAEのように頑健であってほしい」という欲張りな要求に応える損失です。しきい値 $\delta$ で場合分けします。
$$ L_\delta(e) = \begin{cases} \dfrac{1}{2}e^2 & (|e| \le \delta) \\[2mm] \delta\left(|e| – \dfrac{1}{2}\delta\right) & (|e| > \delta) \end{cases} $$

誤差が $\delta$ 以内なら二乗(放物線、滑らかで勾配も連続)、$\delta$ を超えたら線形(V字と同じ傾き、外れ値の影響が二乗で暴れない)に切り替わります。$\delta$ を大きくすればMSEに、小さくすればMAEに近づく連続的なつまみになっているのがポイントです。$\delta$ の内と外で関数値も勾配も滑らかにつながるよう定数が調整されているため、微分可能で勾配法とも相性が良い。外れ値を含む時系列を頑健に、かつ安定して学習させたいときの定番の選択肢です。
時系列予測ならではの注意点
ここまでの指標はどれも「実測と予測のずれを集約する」点で回帰一般と共通です。しかし時系列では、指標をどう計算するかの作法にいくつか固有の落とし穴があります。誤差の値そのものより、この作法を誤る方が評価をゆがめます。
1. ベースラインと比べる(MASE). MAEが3.2という数字を単独で見ても、それが良いのか悪いのかわかりません。時系列には強力な基準があります。「前の時刻の値をそのまま次の予測にする」ナイーブ予測です。季節性があるなら「1周期前の値」を使います。MASE(Mean Absolute Scaled Error)は、モデルのMAEをこのナイーブ予測のMAEで割ったものです。
$$ \mathrm{MASE} = \frac{\mathrm{MAE}_{\text{モデル}}}{\mathrm{MAE}_{\text{ナイーブ予測}}} $$
MASEが1未満なら「ナイーブより賢い」、1以上なら「ナイーブに負けている(モデルを作る意味がない)」と一目でわかります。スケールにも依存しないので系列間比較にも使え、MAPEのようなゼロ割問題もありません。時系列予測を評価するなら、生のMAE/RMSEに加えてMASEを併記するのが強く推奨されます。
2. 予測ホライズンごとに誤差は変わる. 明日の売上を当てるのと1ヶ月先を当てるのでは難しさが違います。一般に、予測が先になるほど誤差は大きくなる。全ホライズンの誤差を1つのMAEに混ぜてしまうと、この重要な情報が消えてしまいます。「1ステップ先はMAE=1.2だが12ステップ先はMAE=4.8」のように、ホライズン別に誤差をプロットすることで、モデルがどこまで先を信頼できるかが見えます。用途に応じて、重視するホライズンだけで評価するのも有効です。
3. 未来のリークを防ぐ分割. 通常の機械学習ではデータをランダムに訓練・テストに分けますが、時系列でこれをやると未来の情報で過去を予測するリークが起き、評価が過大に楽観的になります。時系列では必ず時間順に分割し、「過去で学習し未来で評価する」ウォークフォワード検証を使います。指標の計算式は同じでも、この分割を誤ると、どんな指標も無意味な数字になります。
これらは指標の定義とは別の、評価プロトコルの問題です。MAE/MSEの意味を理解した上で、時系列では「何と比べ、どの期間で、どう分割して測るか」まで含めて設計してはじめて、信頼できる評価になります。
Pythonでの実装
各指標をスクラッチで実装し、これまでの主張を数値で確かめます。
import numpy as np
def mae(y, yhat):
return np.mean(np.abs(y - yhat))
def mse(y, yhat):
return np.mean((y - yhat) ** 2)
def rmse(y, yhat):
return np.sqrt(mse(y, yhat))
def mape(y, yhat):
return 100 * np.mean(np.abs((y - yhat) / y))
# 冒頭の概念図と同じ12点で計算
y = np.array([10, 12, 13, 15, 14, 16, 18, 17, 19, 21, 20, 22.0])
yhat = y + np.array([0.5, -1.2, 1.5, -0.8, 2.0, -1.5, 0.7, 1.8, -2.2, 1.0, -0.6, 1.3])
print(f"MAE = {mae(y, yhat):.4f}")
print(f"MSE = {mse(y, yhat):.4f}")
print(f"RMSE = {rmse(y, yhat):.4f}")
出力は MAE = 1.2583、MSE = 1.8708、RMSE = 1.3678 です。狙いどおり $\mathrm{RMSE} \ge \mathrm{MAE}$ が成り立っていること、そしてRMSEがMAEよりやや大きい(=誤差にそこそこばらつきがある)ことが確認できます。
次に、指標で勝者が逆転する実例を再現します。
rng = np.random.default_rng(42)
n = 80
t = np.arange(n)
signal = 10 + 3 * np.sin(t / 6.0)
signal[30] += 12 # スパイク
signal[55] += 9
y = signal + rng.normal(0, 0.6, n)
# モデルA: スパイク追従だがノイジー / モデルB: 平滑だがスパイクを外す
predA = signal + rng.normal(0, 1.25, n)
predB = 10 + 3 * np.sin(t / 6.0) + rng.normal(0, 0.45, n)
for name, p in [("モデルA", predA), ("モデルB", predB)]:
print(f"{name}: MAE={mae(y, p):.3f}, MSE={mse(y, p):.3f}")
出力は モデルA: MAE=0.993, MSE=1.485、モデルB: MAE=0.792, MSE=3.196 です。MAEではB、MSEではAが勝つという逆転が数値で再現されました。図9で見たとおり、指標の選択がそのままモデル選択を左右します。
最後に、ナイーブ予測を基準にするMASEも確かめておきます。
def mase(y, yhat):
# ナイーブ予測 = 1つ前の値。その MAE で割ってスケールを消す
naive_mae = np.mean(np.abs(np.diff(y)))
return mae(y, yhat) / naive_mae
print(f"モデルA MASE = {mase(y, predA):.3f}")
print(f"モデルB MASE = {mase(y, predB):.3f}")
出力は モデルA MASE = 0.899、モデルB MASE = 0.717 です。どちらも1を下回り、両モデルともナイーブ予測(前の値をそのまま使う)より賢いことが確認できます。ただしモデルAの0.899は1に近く、「ナイーブに毛が生えた程度」だと一目でわかる点に注目してください。生のMAE(0.993)を見ただけではこの相対的な物足りなさは伝わりません。MASEはスケールに依存しないので、これを使えば単位の異なる別系列のモデルとも同じ土俵で比較できます。
実務ではライブラリを使うのが手軽です。scikit-learnには対応関数がそろっています。
from sklearn.metrics import mean_absolute_error, mean_squared_error
print(mean_absolute_error(y, predA)) # MAE
print(mean_squared_error(y, predA)) # MSE
print(np.sqrt(mean_squared_error(y, predA))) # RMSE
自作関数と同じ値が返ります。実装は簡単なので中身を理解したうえでライブラリを使うのがおすすめです。
まとめ
本記事では、時系列予測の誤差評価に使うMAE・MSE・RMSEを解説しました。
- MAEは残差の絶対値を平均。単位そのままで解釈しやすく、外れ値に頑健。最小化解は中央値
- MSEは残差を二乗して平均。大外しを二次関数的に重く罰する。最小化解は平均、勾配が誤差に比例し最適化しやすい
- RMSEはMSEの平方根で単位を元に戻したもの。常に $\mathrm{RMSE}\ge\mathrm{MAE}$ で、比が誤差のばらつきを教える
- 指標の選択に唯一の正解はない——大外しがどれだけ致命的かで、勝つモデルが逆転する
- スケールをまたぐ比較にはMAPE(ただしゼロ割に注意)、外れ値に強く滑らかな学習にはHuber損失
- 時系列では指標の値だけでなく作法も重要——ナイーブ予測を基準にするMASEで「そもそも作る価値があるか」を測り、ホライズン別に誤差を見て、未来リークのない時間順分割で評価する
「どのモデルが良いか」を決める前に、「どんな外し方を最も嫌うか」を決める。そして時系列では「何と比べ、どの期間を、どう分割して測るか」まで設計する。それが信頼できる評価の本質です。
次のステップとして、以下の記事も参考にしてください。