Python環境を起動中... 初回のみ数秒かかります
Lesson 5 / 12

回帰モデルの評価

このレッスンで学ぶこと

  • モデルの良し悪しを「誤差」で測る考え方が分かる
  • MAEMSERMSE の違いを説明できる
  • (決定係数)で「どれだけ説明できたか」を測れる
  • テストデータで評価する一連の流れを書ける

1. モデルの「良し悪し」をどう測る?

前回、年齢から血圧を予測するモデルを作りました。では、その予測はどれくらい当たっているのでしょうか? 機械学習では、予測値と実際の値(実測値)の「ズレ」を数値で測ってモデルを評価します。 このズレのことを 誤差(ごさ / error) と呼びます。

下の図は、テストデータでの「予測値 vs 実測値」です。点が斜めの点線(=完全な予測)に近いほど、良いモデルです。 点線から離れている点が多いほど、予測が外れているということです。

予測値と実測値の散布図。対角線が完全な予測を表す
斜めの点線=完全な予測(予測=実測)。点が線に近いほど良いモデル

💡 「ものさし」が必要: 図を見れば「だいたい合ってる/外れてる」は分かりますが、2つのモデルを比べるには数値の「ものさし(評価指標)」が要ります。 回帰では、よく使う指標が MAE・MSE・RMSE・R² の4つ。順に見ていきましょう。

2. 3つの誤差の指標(MAE・MSE・RMSE)

まずは「平均どれくらいズレているか」を測る3つの指標です。どれも小さいほど良い(誤差が少ない)と覚えてください。

指標意味特徴
MAE(平均絶対誤差)誤差の絶対値の平均いちばん直感的。「平均◯ズレる」
MSE(平均二乗誤差)誤差を2乗して平均大きな外れに敏感(2乗で強調)
RMSEMSEの平方根(√)単位が元に戻り読みやすい

実際に、糖尿病データ(BMIから進行度を予測)で測ってみましょう。 「分割 → 学習 → 予測 → 評価」というこれまでの流れを通しで行います。

sample_1.py
Ctrl+Enter
出力

💡 読み方: MAE 52.3 は「予測が平均で約52ズレる」という意味(進行度の単位で)。 RMSE 63.7 は MAE より少し大きいですね。これはRMSEが大きな外れを強く反映するためです。 MAEとRMSEはどちらも「平均的な誤差の大きさ」を表しますが、大外しを重く見たいときはRMSEを使います。

3. R²(決定係数)— どれだけ説明できたか

MAEやRMSEは「単位つきの誤差」なので、データが変わると大小の感覚がつかみにくいことがあります。 そこで便利なのが R²(アールにじょう / 決定係数)。 これは「モデルがデータのばらつきを、どれだけ説明できたか」を 0〜1 で表す指標です。

📏 R² の目安:

  • 1.0 に近い…とても良い(ほぼ完璧に説明できている)
  • 0 くらい…「いつも平均値を答える」のと同じ程度(ほぼ役立たず)
  • マイナス…平均を答えるより悪い(モデルが不適切)
sample_2.py
Ctrl+Enter
出力

🩺 R²=0.233 は低い。なぜ?: このモデルは「BMI」というたった1つの特徴量だけで進行度を予測しています。 病気の進行には血圧・血糖値など多くの要因が関わるので、1項目だけでは説明しきれず R² が低いのです。 次の レッスン6 で、複数の特徴量を使うと R² が上がるのを確かめます。

4. 練習問題

問題 1

MAEを計算しよう

下記の実測値予測値から、mean_absolute_errorMAE を計算して表示してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
from sklearn.metrics import mean_absolute_error

actual = [100, 150, 200, 120]
pred   = [110, 140, 190, 130]

# MAE を計算して表示してください
print("MAE:", mean_absolute_error(actual, pred))   # 10.0

各誤差は +10, -10, -10, +10。絶対値はすべて10なので、平均(MAE)は 10.0。 「平均して10ズレている」という意味です。

問題 2

MSEとRMSEを計算しよう

問題1と同じデータで、mean_squared_errorMSE を求め、その平方根(** 0.5)で RMSE も表示してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
from sklearn.metrics import mean_squared_error

actual = [100, 150, 200, 120]
pred   = [110, 140, 190, 130]

# MSE と RMSE を表示してください
mse = mean_squared_error(actual, pred)
print("MSE:", mse)            # 100.0
print("RMSE:", mse ** 0.5)    # 10.0

誤差はすべて±10。2乗するとすべて100なので MSE は 100.0、その平方根 RMSE は 10.0。 今回は誤差が一定なので MAE と RMSE が同じ値になりますが、ばらつきが大きいほど RMSE は MAE より大きくなります。

問題 3

R²で評価しよう

糖尿病データ(BMIの1項目)でモデルを作り、テストデータでの を計算して表示してください。 (分割は test_size=0.2, random_state=42

exercise_3.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

d = load_diabetes()
X = d.data[:, [2]]
y = d.target

# 分割 → 学習 → 予測 → R² を表示してください
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)
model = LinearRegression().fit(X_train, y_train)
pred = model.predict(X_test)
print("R²:", round(r2_score(y_test, pred), 3))   # 0.233

R² は 0.233。「BMIだけでは進行度の約23%しか説明できていない」という意味です。 特徴量を増やせばこの数字は改善できます(次のレッスン)。

5. まとめ

このレッスンのポイント

  • モデルの評価は「予測と実測のズレ(誤差)」を測る
  • MAE=誤差の絶対値の平均(直感的)/MSE=誤差の2乗の平均(大外しに敏感)
  • RMSE=MSEの平方根(単位が戻り読みやすい)。MAE・MSE・RMSEは小さいほど良い
  • =説明できた割合(0〜1)。1に近いほど良い、0は平均並み
  • 評価は必ずテストデータで行う(分割→学習→予測→評価)

自由に試してみましょう:

free_practice.py
出力

完了するとコース一覧に進捗が記録されます