Koefisien determinasi

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

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)

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")

png

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")

png

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")

png

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()

png

Komentar

(Komentar akan muncul setelah disetujui)