機械学習の回帰モデル評価に不可欠な主要指標とscikit-learnでの実践
はじめに:回帰モデルの「性能」をどう測るか?
機械学習プロジェクトにおいて、モデルの学習だけでなく、その「性能」を正確に評価することは極めて重要です。特に、連続値を予測する回帰モデルの場合、分類モデルとは異なる評価の視点と指標が必要となります。分類モデルでは正解・不正解という明確な区別がありますが、回帰モデルでは予測値と実測値の「誤差」が評価の鍵となるため、その誤差をどのように定量化し、モデルの優劣を判断するかが重要です。
本記事では、機械学習の回帰モデルを評価する上で不可欠となる主要な指標について解説し、Pythonの機械学習ライブラリscikit-learn
を用いた具体的な実践方法を紹介します。この記事を通して、読者の皆様がご自身の回帰モデルの性能を客観的に評価し、より適切なモデルを選択・改善するための一助となれば幸いです。
回帰モデル評価の基本:なぜ評価が必要なのか?
モデルを構築する目的は、未知のデータに対して正確な予測を行う「汎化性能」が高いモデルを得ることにあります。単に学習データに対して高い精度を示しても、それが未知のデータにも当てはまるとは限りません。評価指標を用いることで、以下の点を客観的に判断できるようになります。
- 汎化性能の確認: モデルが学習データだけでなく、未見のデータに対しても有効な予測ができるかを確認します。
- 過学習・未学習の検出: モデルが学習データに過度に適合しすぎた「過学習」、あるいはデータの特徴を捉えきれていない「未学習」の状態ではないかを診断します。
- モデルの比較と選択: 複数のモデル候補の中から、目的に最も適したモデルを選択するための客観的な基準を提供します。
- ビジネス目標との連携: 予測誤差がビジネスに与える影響を理解し、許容範囲内の性能であるかを判断します。
主要な回帰モデル評価指標
回帰モデルの評価には、様々な指標が存在します。ここでは、特に頻繁に用いられる主要な指標を4つご紹介します。
1. 平均絶対誤差 (MAE: Mean Absolute Error)
- 概要: 予測値と実測値の差の絶対値をとり、その平均を計算したものです。誤差の大きさを直感的に把握しやすい指標です。
- 計算式: $MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|$ ここで、$y_i$ は実測値、$\hat{y}_i$ は予測値、$n$ はデータ数です。
- 特徴:
- 外れ値の影響を受けにくい(誤差が線形に反映されるため)。
- 単位が元の目的変数と同じであるため、解釈しやすい。
- メリット:
- 計算がシンプルで理解しやすい。
- 誤差の絶対値を用いるため、外れ値の影響が小さい。
- デメリット:
- 誤差の方向性(過大予測か過小予測か)は分からない。
- 微分不可能な点があり、最適化アルゴリズムによっては扱いにくい場合がある。
scikit-learn
での実装:sklearn.metrics.mean_absolute_error
を使用します。
2. 平均二乗誤差 (MSE: Mean Squared Error)
- 概要: 予測値と実測値の差を二乗し、その平均を計算したものです。誤差の絶対値ではなく二乗を用いることで、大きな誤差にペナルティを与える特性があります。
- 計算式: $MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$
- 特徴:
- 外れ値に対して敏感(誤差が二乗されるため、大きな誤差がより強調される)。
- 常に非負の値を取り、0に近いほど良いモデルであることを示します。
- メリット:
- 微分可能であるため、勾配降下法などの最適化アルゴリズムと相性が良い。
- 大きな誤差を厳しく評価するため、異常な予測を防ぎたい場合に有効。
- デメリット:
- 単位が元の目的変数の二乗となるため、直感的な解釈が難しい。
- 外れ値の影響を受けやすいため、データに外れ値が多い場合は注意が必要。
scikit-learn
での実装:sklearn.metrics.mean_squared_error
を使用します。
3. 二乗平均平方根誤差 (RMSE: Root Mean Squared Error)
- 概要: 平均二乗誤差 (MSE) の平方根をとったものです。MSEのデメリットである「単位が元の目的変数と異なる」という点を解消し、より直感的に誤差の大きさを把握できるようにした指標です。
- 計算式: $RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} = \sqrt{MSE}$
- 特徴:
- 単位が元の目的変数と同じであるため、解釈しやすい。
- MSEと同様に外れ値に敏感です。
- メリット:
- MSEの利点を持ちつつ、解釈性が向上する。
- 多くの研究やコンペティションで利用される、広く認知された指標。
- デメリット:
- MSEと同様に外れ値の影響を受けやすい。
scikit-learn
での実装:sklearn.metrics.mean_squared_error
の戻り値にsquared=False
を指定するか、mean_squared_error
の結果にnp.sqrt()
を適用します。
4. 決定係数 (R2スコア: R-squared)
- 概要: モデルが目的変数の変動をどれだけ説明できているかを示す指標です。0から1の範囲で表され、1に近いほどモデルの当てはまりが良いことを意味します。
- 計算式: $R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}i)^2}{\sum{i=1}^{n} (y_i - \bar{y})^2}$ ここで、$\bar{y}$ は実測値の平均です。
- 特徴:
- モデルの適合度(どれだけデータにフィットしているか)を示す。
- 負の値をとることもありますが、これはモデルが平均値を予測するよりも性能が悪いことを意味します。
- メリット:
- モデルの全体的な説明力を評価できる。
- 異なるスケールのデータセット間でも比較しやすい。
- デメリット:
- 説明変数を増やすと、たとえモデルの性能が上がらなくてもR2スコアは上昇しがち(多重共線性の影響など)。この点を補正した調整済み決定係数(Adjusted R-squared)も存在しますが、
scikit-learn
には直接的な実装はありません。 - 予測誤差の絶対的な大きさは直接示さない。
- 説明変数を増やすと、たとえモデルの性能が上がらなくてもR2スコアは上昇しがち(多重共線性の影響など)。この点を補正した調整済み決定係数(Adjusted R-squared)も存在しますが、
scikit-learn
での実装:sklearn.metrics.r2_score
を使用します。
指標の選び方と実践的なヒント
これらの指標はそれぞれ異なる特性を持つため、プロジェクトの目的やデータの性質に応じて適切に使い分けることが重要です。
- 誤差の大きさを直感的に把握したい、外れ値に頑健に評価したい場合: MAE
- 大きな誤差に厳しくペナルティを与えたい、モデルの最適化に利用したい場合: MSE, RMSE
- モデルのデータへの適合度、説明力を評価したい場合: R2スコア
また、単一の指標だけでなく、複数の指標を組み合わせて多角的にモデルを評価することをお勧めします。さらに、予測誤差の分布(ヒストグラム)や、実測値と予測値の散布図をプロットして視覚的に確認することも、モデルの弱点を発見するために非常に有効です。
scikit-learnを活用した回帰モデル評価の実践例
ここでは、scikit-learn
のサンプルデータセットであるCalifornia Housingデータセットを用いて、線形回帰モデルを構築し、主要な評価指標を計算する例を示します。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing # 回帰モデル評価の例として
# California Housingデータセットをロード
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='MedHouseVal')
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 線形回帰モデルの構築と学習
model = LinearRegression()
model.fit(X_train, y_train)
# テストデータでの予測
y_pred = model.predict(X_test)
# 各評価指標の計算
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse) # RMSEはMSEの平方根
r2 = r2_score(y_test, y_pred)
print(f"MAE: {mae:.3f}")
print(f"MSE: {mse:.3f}")
print(f"RMSE: {rmse:.3f}")
print(f"R2 Score: {r2:.3f}")
# 予測値と実測値の散布図
plt.figure(figsize=(8, 6))
plt.scatter(y_test, y_pred, alpha=0.6)
# 理想的な予測を示す対角線
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel("Actual Values")
plt.ylabel("Predicted Values")
plt.title("Actual vs. Predicted Values (Regression Model)")
plt.grid(True)
plt.show()
# 予測誤差のヒストグラム
errors = y_test - y_pred
plt.figure(figsize=(8, 6))
plt.hist(errors, bins=50, edgecolor='black')
plt.xlabel("Prediction Error (Actual - Predicted)")
plt.ylabel("Frequency")
plt.title("Distribution of Prediction Errors")
plt.grid(True)
plt.show()
上記のコード例では、まずカリフォルニア住宅価格データセットを訓練データとテストデータに分割し、線形回帰モデルを学習させています。その後、scikit-learn
の関数を用いてMAE, MSE, R2スコアを計算し、RMSEはMSEから導出しています。さらに、予測値と実測値の散布図、そして予測誤差のヒストグラムを可視化することで、数値だけでは見えないモデルの特性や課題を把握する手助けとなります。例えば、散布図で点が直線から大きく外れている場合や、誤差のヒストグラムが正規分布から著しく乖離している場合は、モデルの改善の余地があることを示唆します。
まとめ
機械学習の回帰モデル評価は、モデルの信頼性と実用性を判断するために不可欠なプロセスです。本記事では、主要な評価指標であるMAE、MSE、RMSE、そしてR2スコアについて解説し、それぞれの特性とscikit-learn
を用いた実践方法を紹介しました。
これらの指標を理解し適切に使いこなすことで、単にモデルの「予測」を行うだけでなく、「なぜその予測なのか」「どこを改善すべきか」といった深い洞察を得ることが可能になります。ご自身のプロジェクトの目的とデータの特性を考慮し、多角的な視点から回帰モデルの評価を行うことで、より堅牢で高性能な機械学習システムを構築できるようになるでしょう。
今後、さらに複雑なモデルの評価や、特定のビジネス要件に合わせたカスタム指標の検討なども視野に入れることで、機械学習モデルの価値を最大化できるはずです。