- Koefisien determinasiの概要を押さえ、評価対象と読み取り方を整理します。
- Python 3.13 のコード例で算出・可視化し、手順と実務での確認ポイントを確認します。
- 図表や補助指標を組み合わせ、モデル比較や閾値調整に活かすヒントをまとめます。
Koefisien determinasi adalah nilai dalam statistik yang menyatakan seberapa besar variabel dependen (variabel tujuan) dijelaskan oleh variabel independen (variabel penjelas).
Umumnya, semakin tinggi semakin baik indikator penilaian
Kasus terbaik adalah 1.
Namun, semakin banyak fitur yang Anda tambahkan, skornya cenderung semakin tinggi.
Oleh karena itu, tidak mungkin untuk menilai “akurasi model yang tinggi” dengan melihat indikator ini saja
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_regression
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
python
Membuat model dan menghitung koefisien determinasi untuk data sampel #
Pertama, mari kita buat data yang membuat prediksi lebih mungkin benar.
X, y = make_regression(
n_samples=1000,
n_informative=3,
n_features=20,
random_state=RND,
)
train_X, test_X, train_y, test_y = train_test_split(
X, y, test_size=0.33, random_state=RND
)
model = RandomForestRegressor(max_depth=5)
model.fit(train_X, train_y)
pred_y = model.predict(test_X)
python
Menghitung koefisien determinasi #
from sklearn.metrics import r2_score
r2 = r2_score(test_y, pred_y)
y_min, y_max = np.min(test_y), np.max(test_y)
plt.figure(figsize=(6, 6))
plt.title(f"$R^2 =${r2}")
plt.plot([y_min, y_max], [y_min, y_max], linestyle="-", c="k", alpha=0.2)
plt.scatter(test_y, pred_y, marker="x")
plt.xlabel("Jawaban yang benar")
plt.ylabel("Prediksi")

Selanjutnya, buatlah data yang prediksinya cenderung tidak benar dan periksa untuk melihat bahwa koefisien determinasi turun.
X, y = make_regression(
n_samples=1000,
n_informative=3,
n_features=20,
effective_rank=4,
noise=1.5,
random_state=RND,
)
train_X, test_X, train_y, test_y = train_test_split(
X, y, test_size=0.33, random_state=RND
)
model = RandomForestRegressor(max_depth=5)
model.fit(train_X, train_y)
pred_y = model.predict(test_X)
r2 = r2_score(test_y, pred_y)
y_min, y_max = np.min(test_y), np.max(test_y)
plt.figure(figsize=(6, 6))
plt.title(f"$R^2 =${r2}")
plt.plot([y_min, y_max], [y_min, y_max], linestyle="-", c="k", alpha=0.2)
plt.scatter(test_y, pred_y, marker="x")
plt.xlabel("Jawaban yang benar")
plt.ylabel("Prediksi")

Ketika prediksi hampir acak #
Ketika akurasi bahkan lebih buruk daripada sekadar memprediksi rata-rata, koefisien determinasi adalah negatif.
X, y = make_regression(
n_samples=1000,
n_informative=3,
n_features=20,
effective_rank=4,
noise=1.5,
random_state=RND,
)
train_X, test_X, train_y, test_y = train_test_split(
X, y, test_size=0.33, random_state=RND
)
# Menyusun ulang train_y dan mengkonversi nilai secara acak
train_y = np.random.permutation(train_y)
train_y = np.sin(train_y) * 10 + 1
model = RandomForestRegressor(max_depth=1)
model.fit(train_X, train_y)
pred_y = model.predict(test_X)
r2 = r2_score(test_y, pred_y)
y_min, y_max = np.min(test_y), np.max(test_y)
plt.figure(figsize=(6, 6))
plt.title(f"$R^2 =${r2}")
plt.plot([y_min, y_max], [y_min, y_max], linestyle="-", c="k", alpha=0.2)
plt.scatter(test_y, pred_y, marker="x")
plt.xlabel("Jawaban yang benar")
plt.ylabel("Prediksi")

Koefisien determinasi ketika menggunakan metode kuadrat terkecil #
Dalam kasus garis regresi untuk regresi tunggal dengan menggunakan metode kuadrat terkecil, rentang koefisien determinasi adalah \( 0 \le R^2 \le 1\).
Mari kita coba mencari koefisien determinasi dengan menjalankan regresi 100 garis dengan noise acak pada data.
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
r2_scores = []
for i in range(100):
X, y = make_regression(
n_samples=500,
n_informative=1,
n_features=1,
effective_rank=4,
noise=i * 0.1,
random_state=RND,
)
train_X, test_X, train_y, test_y = train_test_split(
X, y, test_size=0.33, random_state=RND
)
# regresi linier
model = make_pipeline(
StandardScaler(with_mean=False), LinearRegression(positive=True)
).fit(train_X, train_y)
# Menghitung koefisien determinasi
pred_y = model.predict(test_X)
r2 = r2_score(test_y, pred_y)
r2_scores.append(r2)
plt.figure(figsize=(8, 4))
plt.hist(r2_scores, bins=20)
plt.show()
