「予測モデルの精度を測りたいけど、どの指標を使えばいいの?」「平均絶対誤差って何?」そんな疑問を持っていませんか?
平均絶対誤差(Mean Absolute Error、略してMAE)は、機械学習や統計分析で最もよく使われる精度評価の指標の一つです。予測値と実際の値がどれくらい離れているかを、分かりやすく数値化してくれるんです。
今回は、平均絶対誤差の基本から計算方法、他の指標との違い、実際の使い方まで詳しく解説します。この記事を読めば、データ分析の精度評価がしっかり理解できるようになりますよ!
平均絶対誤差(MAE)とは
基本的な意味
平均絶対誤差は、予測のズレの大きさを表す指標です。
簡単に言うと、「予測した値が、実際の値からどれくらい外れていたか」の平均を計算したものです。たとえば、明日の気温を予測して、実際の気温と比べた時の誤差の平均値と考えると分かりやすいですね。
なぜ「絶対」なのか
「絶対」という言葉がポイントです。
予測値が実際の値より大きくても小さくても、その差の「絶対値」を取ります。つまり、プラスもマイナスもすべて正の数として扱うんです。こうすることで、誤差が打ち消し合わずに、純粋なズレの大きさが分かります。
どんな時に使うのか
回帰問題の評価に最適です。
よく使われる場面
- 住宅価格の予測
- 売上の予測
- 気温や降水量の予測
- 株価の予測
- 需要予測
数値を予測するタスク全般で使えます。
平均絶対誤差の計算方法
基本的な計算式
数式で表すと以下のようになります。
MAE = (1/n) × Σ|実際の値 - 予測値|
各記号の意味
- n:データの個数
- Σ:合計を表す記号(シグマ)
- | |:絶対値(マイナスを取り除く)
計算の手順
ステップごとに見ていきましょう。
手順
- 各データについて、実際の値と予測値の差を計算
- その差の絶対値を取る(マイナスをプラスにする)
- すべてのデータの絶対誤差を合計
- データの個数で割って平均を出す
シンプルな計算ですね。
具体例で理解する
実際に計算してみましょう。
例:気温予測の場合
あなたが3日間の最高気温を予測したとします。
| 日付 | 実際の気温 | 予測した気温 | 差 | 絶対値 |
|---|---|---|---|---|
| 1日目 | 25℃ | 23℃ | -2℃ | 2℃ |
| 2日目 | 28℃ | 30℃ | +2℃ | 2℃ |
| 3日目 | 22℃ | 24℃ | +2℃ | 2℃ |
計算
- 絶対誤差の合計:2 + 2 + 2 = 6
- データ数:3日
- MAE = 6 ÷ 3 = 2℃
この予測モデルは、平均して2℃の誤差があることが分かります。
もう一つの例
住宅価格で見てみましょう。
例:住宅価格の予測(単位:万円)
| 物件 | 実際の価格 | 予測価格 | 差 | 絶対値 |
|---|---|---|---|---|
| A | 3000万円 | 2800万円 | -200万円 | 200万円 |
| B | 4500万円 | 4600万円 | +100万円 | 100万円 |
| C | 2800万円 | 3000万円 | +200万円 | 200万円 |
| D | 5000万円 | 4900万円 | -100万円 | 100万円 |
計算
- 絶対誤差の合計:200 + 100 + 200 + 100 = 600万円
- データ数:4物件
- MAE = 600 ÷ 4 = 150万円
この予測モデルは、平均して150万円ズレることが分かります。
他の誤差指標との比較
平均二乗誤差(MSE)との違い
MSE(Mean Squared Error)もよく使われる指標です。
MSEの計算式
MSE = (1/n) × Σ(実際の値 - 予測値)²
主な違い
- MSE:誤差を2乗してから平均
- MAE:誤差の絶対値の平均
MSEの特徴
- 大きな誤差をより重視する
- 単位が元データの2乗になる(気温なら℃²)
- 外れ値の影響を受けやすい
気温予測でMSEを計算すると:
MSE = (2² + 2² + 2²) ÷ 3 = 12 ÷ 3 = 4℃²
平均二乗平方根誤差(RMSE)との違い
RMSE(Root Mean Squared Error)はMSEの平方根です。
RMSEの計算式
RMSE = √MSE
RMSEの特徴
- 単位が元データと同じになる
- MSEと同様、大きな誤差を重視
- 解釈しやすい
気温予測でRMSEを計算すると:
RMSE = √4 = 2℃
決定係数(R²)との違い
R²は「どれくらい説明できているか」を示す指標です。
R²の特徴
- 0から1の値を取る(または-∞から1)
- 1に近いほど良いモデル
- 相対的な評価に向いている
MAEとの違い
- MAE:絶対的な誤差の大きさ
- R²:データのばらつきをどれだけ説明できるか
用途に応じて使い分けます。
どの指標を選ぶべきか
状況に応じて選択しましょう。
MAEを選ぶ場合
- 外れ値の影響を抑えたい
- 誤差を直感的に理解したい
- すべての誤差を平等に扱いたい
RMSEを選ぶ場合
- 大きな誤差を特に重視したい
- 外れ値を厳しく評価したい
R²を選ぶ場合
- モデルの説明力を知りたい
- 異なるスケールのデータを比較したい
平均絶対誤差のメリット
解釈しやすさ
最大のメリットは直感的な分かりやすさです。
「平均して150万円の誤差」と言われれば、誰でも理解できますよね。専門知識がない人にも説明しやすい指標なんです。単位も元データと同じなので、ビジネスの現場でも使いやすいです。
外れ値に強い
極端な値の影響を受けにくいという利点があります。
MSEやRMSEは誤差を2乗するため、大きな誤差が強調されます。一方、MAEは絶対値を取るだけなので、外れ値があっても比較的安定した評価ができます。
例で比較
予測誤差が「1, 2, 3, 4, 100」の場合:
- MAE = (1+2+3+4+100) ÷ 5 = 22
- RMSE = √((1²+2²+3²+4²+100²) ÷ 5) = √2006 ≒ 44.8
外れ値(100)の影響が、RMSEの方が大きいことが分かります。
計算が簡単
数学的にシンプルな計算です。
2乗や平方根を使わないので、手計算でも比較的簡単に求められます。プログラミングの実装も単純明快です。
平均絶対誤差のデメリット
数学的な微分不可能性
機械学習の最適化では問題になることがあります。
絶対値関数は、0の点で微分できません。勾配降下法などの最適化アルゴリズムで直接使うと、問題が起こる可能性があります。そのため、学習時の損失関数にはMSEを使い、評価時にMAEを使う、という使い分けが一般的です。
すべての誤差を平等に扱う
これはメリットでもありデメリットでもあります。
小さな誤差も大きな誤差も同じように扱うため、「大きな誤差は絶対に避けたい」という場面では、RMSEの方が適していることがあります。医療診断や安全性が重要な分野では、大きな誤差を重視するRMSEが好まれます。
スケールに依存する
異なる単位のデータを比較しにくいという問題があります。
気温予測のMAE(単位:℃)と住宅価格予測のMAE(単位:万円)を直接比較することはできません。異なるスケールのモデルを比較したい場合は、正規化したデータを使うか、R²のような相対的な指標を使う必要があります。
Pythonでの実装方法
scikit-learnを使う方法
最も簡単で標準的な方法です。
基本的な使い方
from sklearn.metrics import mean_absolute_error
# 実際の値
y_true = [25, 28, 22]
# 予測値
y_pred = [23, 30, 24]
# MAEを計算
mae = mean_absolute_error(y_true, y_pred)
print(f"MAE: {mae}℃")
# 出力: MAE: 2.0℃
たった数行で計算できます。
自分で実装する方法
仕組みを理解するために、一から作ってみましょう。
NumPyを使った実装
import numpy as np
def calculate_mae(y_true, y_pred):
"""
平均絶対誤差を計算する関数
Parameters:
y_true: 実際の値(配列)
y_pred: 予測値(配列)
Returns:
mae: 平均絶対誤差
"""
# 配列に変換
y_true = np.array(y_true)
y_pred = np.array(y_pred)
# 絶対誤差を計算
absolute_errors = np.abs(y_true - y_pred)
# 平均を計算
mae = np.mean(absolute_errors)
return mae
# 使用例
y_true = [25, 28, 22]
y_pred = [23, 30, 24]
mae = calculate_mae(y_true, y_pred)
print(f"MAE: {mae}℃")
# 出力: MAE: 2.0℃
純粋なPythonでの実装
ライブラリを使わない実装も見てみましょう。
def calculate_mae_pure(y_true, y_pred):
"""
平均絶対誤差を計算(純粋なPython)
"""
# データ数を取得
n = len(y_true)
# 絶対誤差の合計を計算
total_error = 0
for true_val, pred_val in zip(y_true, y_pred):
error = abs(true_val - pred_val)
total_error += error
# 平均を計算
mae = total_error / n
return mae
# 使用例
y_true = [25, 28, 22]
y_pred = [23, 30, 24]
mae = calculate_mae_pure(y_true, y_pred)
print(f"MAE: {mae}℃")
# 出力: MAE: 2.0℃
仕組みが明確に分かりますね。
実際の使用例
機械学習モデルの評価
回帰モデルの精度を測ります。
例:住宅価格予測モデル
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
import numpy as np
# データの準備(簡略化した例)
# 特徴量:面積、築年数
X = np.array([[50, 5], [70, 10], [100, 3], [80, 15]])
# 目標値:価格(万円)
y = np.array([3000, 3500, 5000, 3200])
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
# モデルの訓練
model = LinearRegression()
model.fit(X_train, y_train)
# 予測
y_pred = model.predict(X_test)
# MAEで評価
mae = mean_absolute_error(y_test, y_pred)
print(f"予測誤差(MAE): {mae:.2f}万円")
複数モデルの比較
どのモデルが最も正確か比較できます。
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
# 複数のモデルを訓練
models = {
'線形回帰': LinearRegression(),
'決定木': DecisionTreeRegressor(),
'ランダムフォレスト': RandomForestRegressor()
}
# 各モデルのMAEを計算
results = {}
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
results[name] = mae
print(f"{name}のMAE: {mae:.2f}万円")
# 最良のモデルを選択
best_model = min(results, key=results.get)
print(f"\n最も精度が高いモデル: {best_model}")
時系列データの予測評価
売上予測などで使えます。
import pandas as pd
from sklearn.metrics import mean_absolute_error
# 月別売上データ(例)
dates = pd.date_range('2024-01', periods=6, freq='M')
actual_sales = [100, 120, 110, 130, 125, 140] # 実際の売上
predicted_sales = [95, 125, 105, 135, 120, 145] # 予測した売上
# MAEを計算
mae = mean_absolute_error(actual_sales, predicted_sales)
print(f"売上予測の平均誤差: {mae:.2f}万円")
# 月別の誤差も確認
df = pd.DataFrame({
'日付': dates,
'実際': actual_sales,
'予測': predicted_sales,
'誤差': [abs(a - p) for a, p in zip(actual_sales, predicted_sales)]
})
print("\n月別の詳細:")
print(df)
よくある質問
Q1: MAEが0に近いほど良いモデル?
A: はい、その通りです。
MAEが0に近いほど、予測が実際の値に近いことを意味します。MAE = 0は完璧な予測を表しますが、実際にはほぼ不可能です。目標とするMAEの値は、ドメインや用途によって異なります。
目安の例
- 気温予測:1〜2℃以内なら優秀
- 住宅価格:100〜200万円以内なら良好
- 株価:数%以内なら優秀
Q2: MAEとRMSEはどちらを使うべき?
A: 目的によって使い分けます。
MAEを使うべき場合
- すべての誤差を平等に評価したい
- 外れ値の影響を抑えたい
- 結果を分かりやすく説明したい
RMSEを使うべき場合
- 大きな誤差を特に重視したい
- 慣習的にRMSEが使われる分野(気象予測など)
- 外れ値を厳しく評価したい
両方を報告するのも良い方法です。
Q3: MAEだけで十分?他の指標も必要?
A: 複数の指標を併用するのが理想的です。
推奨される組み合わせ
- MAEとRMSE:誤差の性質を多角的に評価
- MAEとR²:絶対誤差と説明力の両方を確認
- MAEと散布図:視覚的な確認も重要
一つの指標だけに頼らず、総合的に判断しましょう。
Q4: 負の値になることはある?
A: いいえ、MAEは常に0以上です。
絶対値を取るため、必ず正の数(または0)になります。もし負の値が出たら、計算ミスです。
確認ポイント
- 絶対値を取っているか
- 実際の値と予測値を逆にしていないか
- データの単位が正しいか
平均絶対誤差を改善する方法
モデルの改善
精度を上げるためのアプローチがあります。
基本的な改善策
- より多くの特徴量を追加
- 外れ値を除去または変換
- データの正規化・標準化
- 異なるモデルアルゴリズムを試す
- ハイパーパラメータの調整
特徴量エンジニアリング
データの質を高めることが重要です。
効果的な手法
- 欠損値の適切な処理
- カテゴリ変数のエンコーディング
- 特徴量の組み合わせ
- 多項式特徴量の追加
- ドメイン知識を活かした特徴量作成
クロスバリデーション
より信頼性の高い評価ができます。
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
model = LinearRegression()
# 5分割クロスバリデーション
mae_scores = cross_val_score(
model, X, y,
cv=5,
scoring='neg_mean_absolute_error'
)
# 符号を反転(scikit-learnは負の値で返す)
mae_scores = -mae_scores
print(f"各分割のMAE: {mae_scores}")
print(f"平均MAE: {mae_scores.mean():.2f}")
print(f"標準偏差: {mae_scores.std():.2f}")
まとめ:MAEを使いこなそう
平均絶対誤差は、予測精度を評価する基本的で重要な指標です。シンプルで分かりやすく、実用的な評価ができます。
今回のポイントをおさらい
- MAEは予測誤差の平均値
- 計算は「誤差の絶対値の平均」
- 単位が元データと同じで解釈しやすい
- 外れ値の影響を受けにくい
- RMSEやR²と併用すると効果的
まずは簡単な例でMAEを計算してみましょう。
実際のデータで手を動かすことで、理解が深まります。scikit-learnを使えば、たった数行のコードで計算できるので、気軽に試してみてください。
機械学習モデルを作る際は、MAEだけでなく、複数の指標を組み合わせて総合的に評価することが大切です。データの特性や目的に応じて、最適な評価方法を選びましょう。
この記事を参考に、より精度の高いモデル作りに挑戦してみてくださいね!

コメント