Metrik Regresi

MAE, MSE, RMSE, dan R-squared beserta cara memilih dan membacanya dengan jujur.

Daftar isi

Model regresi memprediksi angka kontinu, sehingga kualitasnya diukur dari jarak antara prediksi dan nilai target yang sebenarnya. Topik ini membahas empat metrik evaluasi regresi yang paling umum, yaitu mean absolute error (MAE), mean squared error (MSE), root mean squared error (RMSE), dan R-squared. Setiap rumus dibaca satu per satu, kemudian keempatnya dihitung dengan scikit-learn pada dataset diabetes bawaan, termasuk perbandingan dengan baseline sederhana. Hasil akhirnya adalah kemampuan memilih metrik yang sesuai konteks dan membaca angkanya tanpa membesar-besarkan.

Empat rumus dan cara membacanya#

Notasi berikut digunakan pada seluruh rumus: nn adalah jumlah sampel, yiy_i adalah nilai target aktual untuk sampel ke-ii, y^i\hat{y}_i adalah prediksi model untuk sampel yang sama, dan yˉ\bar{y} adalah rata-rata target. Metrik regresi selalu dihitung pada data uji, yaitu data yang tidak pernah dilihat oleh model saat pelatihan. Kesalahan pada data latih hampir selalu lebih kecil dan tidak mewakili kinerja yang akan terjadi nanti.

Mean absolute error mengukur rata-rata selisih absolut antara prediksi dan target:

MAE=1n∑i=1n∣yi−y^i∣ \mathrm{MAE} = \frac{1}{n} \sum_{i=1}^{n} \left| y_i - \hat{y}_i \right|

Setiap selisih diberi bobot yang sama tanpa memandang besar-kecilnya, sehingga MAE tahan terhadap outlier, yaitu sampel dengan nilai yang jauh dari kebanyakan data. Satuannya sama dengan satuan target, sehingga MAE 42.79 pada target berukuran ratusan langsung terbaca sebagai prediksi yang rata-rata meleset 42.79 satuan. Kelemahan MAE terletak pada kesalahan terburuk yang tidak terlihat, karena satu kesalahan yang sangat besar hanya berkontribusi sebesar satu kesalahan biasa.

Mean squared error mengkuadratkan setiap selisih sebelum dirata-ratakan:

MSE=1n∑i=1n(yi−y^i)2 \mathrm{MSE} = \frac{1}{n} \sum_{i=1}^{n} \left( y_i - \hat{y}_i \right)^2

Kuadrat memberi bobot jauh lebih besar pada kesalahan yang besar. Selisih 10 memberi kontribusi 100, sedangkan selisih 20 memberi kontribusi 400. Kontribusinya menjadi empat kali lipat untuk kesalahan yang hanya dua kali lipat. Akibatnya, satu outlier dapat mendominasi nilai MSE dan menyembunyikan kinerja yang sebenarnya cukup baik pada kebanyakan sampel.

Root mean squared error adalah akar kuadrat dari MSE:

RMSE=MSE \mathrm{RMSE} = \sqrt{\mathrm{MSE}}

Akar kuadrat mengembalikan satuannya ke satuan target, sehingga RMSE, seperti MAE, dapat dibandingkan langsung dengan nilai target. Untuk data yang sama, RMSE selalu sama dengan MAE atau lebih besar. Jarak yang lebar antara keduanya menjadi sinyal adanya prediksi yang meleset jauh, sedangkan jarak yang sempit menandakan besaran kesalahan yang relatif merata.

R-squared menyatakan proporsi varians target yang terjelaskan oleh model:

R2=1−∑i=1n(yi−y^i)2∑i=1n(yi−yˉ)2 R^2 = 1 - \frac{\sum_{i=1}^{n} \left( y_i - \hat{y}_i \right)^2}{\sum_{i=1}^{n} \left( y_i - \bar{y} \right)^2}

Pembilangnya adalah kesalahan model, sedangkan penyebutnya adalah kesalahan pembanding paling sederhana, yaitu selalu menebak rata-rata. Nilai R2=0R^2 = 0 berarti model tidak lebih baik dari menebak rata-rata, R2=1R^2 = 1 berarti prediksi sempurna, dan nilai negatif berarti model lebih buruk dari menebak rata-rata. Karena penyebutnya bergantung pada sebaran target, angka ini bermakna hanya pada dataset tempat metrik itu dihitung.

Menghitung keempat metrik dengan scikit-learn#

Skrip berikut memuat dataset diabetes dari sklearn.datasets, memisahkan dua puluh persen data sebagai data uji dengan random_state=42, lalu melatih LinearRegression pada data latih. Keempat metrik kemudian dicetak pada data uji. Baseline berupa DummyRegressor dengan strategi mean turut dihitung sebagai pembanding minimum. Baseline semacam ini dicapai tanpa belajar apa pun dari fitur, sehingga model yang sungguh berguna harus mengalahkannya.

python hitung-metrik-regresi.py
from sklearn.datasets import load_diabetes
from sklearn.dummy import DummyRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import (
    mean_absolute_error,
    mean_squared_error,
    r2_score,
    root_mean_squared_error,
)
from sklearn.model_selection import train_test_split

X, y = load_diabetes(return_X_y=True)
X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = LinearRegression()
model.fit(X_latih, y_latih)
prediksi = model.predict(X_uji)

baseline = DummyRegressor(strategy="mean")
baseline.fit(X_latih, y_latih)
prediksi_baseline = baseline.predict(X_uji)


def laporkan(nama, y_benar, y_prediksi):
    """Cetak keempat metrik regresi dengan format tetap."""
    mae = mean_absolute_error(y_benar, y_prediksi)
    mse = mean_squared_error(y_benar, y_prediksi)
    rmse = root_mean_squared_error(y_benar, y_prediksi)
    r2 = r2_score(y_benar, y_prediksi)
    print(nama)
    print(f"  MAE  = {mae:.4f}")
    print(f"  MSE  = {mse:.4f}")
    print(f"  RMSE = {rmse:.4f}")
    print(f"  R2   = {r2:.4f}")


laporkan("LinearRegression", y_uji, prediksi)
laporkan("Baseline DummyRegressor (mean)", y_uji, prediksi_baseline)
text Keluaran
LinearRegression
  MAE  = 42.7941
  MSE  = 2900.1936
  RMSE = 53.8534
  R2   = 0.4526
Baseline DummyRegressor (mean)
  MAE  = 64.0065
  MSE  = 5361.5335
  RMSE = 73.2225
  R2   = -0.0120

RMSE 53.8534 berarti prediksi rata-rata meleset sekitar 54 satuan pada ukuran perkembangan penyakit yang menjadi target dataset ini. MAE 42.7941 yang jauh lebih kecil menunjukkan sebaran kesalahan yang lebar, dengan sebagian prediksi yang meleset jauh. Nilai R2=0.4526R^2 = 0.4526 berarti model menjelaskan sekitar 45 persen variasi target, sedangkan sisanya belum tersentuh oleh fitur yang tersedia.

Baseline menghasilkan RMSE 73.2225 dan R2=−0.0120R^2 = -0.0120. Nilai R2R^2 baseline sedikit negatif karena rata-rata data latih yang ditebaknya bukan rata-rata data uji. Perbandingan dengan baseline itulah yang membuat angka model bermakna. RMSE 53.8534 baru dapat dinilai setelah diletakkan di samping pembanding yang tidak belajar apa pun.

Memilih metrik sesuai konteks#

Pilihan metrik mengikuti pertanyaan yang ingin dijawab, bukan kebiasaan. MAE cocok apabila setiap satuan kesalahan membebani sama, misalnya memperkirakan jumlah barang yang harus disiapkan, karena biayanya bertambah sebanding dengan selisihnya. RMSE cocok apabila kesalahan besar jauh lebih merugikan daripada kesalahan kecil, misalnya memperkirakan dosis atau waktu tempuh, karena kuadrat menaikkan biaya kesalahan yang meleset jauh. MSE sendiri jarang dilaporkan karena satuannya berupa kuadrat dan sulit dikaitkan dengan satuan target. Metrik ini tetap penting sebagai fungsi biaya pada pelatihan banyak model regresi.

R-squared paling berguna sebagai ringkasan untuk audiens non-teknis karena skalanya mudah dibaca, tetapi penggunaannya perlu kehati-hatian. Nilai R2R^2 yang tinggi pada satu dataset tidak dapat dibandingkan dengan R2R^2 pada dataset lain dengan target berbeda, dan angka itu tidak menyatakan apa pun tentang kesalahan terbesar yang masih terjadi. Model dengan R2=0.4526R^2 = 0.4526 pada dataset diabetes tidak otomatis lebih buruk daripada model dengan R2=0.80R^2 = 0.80 pada dataset lain, karena keduanya dihitung terhadap pembanding berbeda. Karena itu, laporan evaluasi regresi yang jujur memuat RMSE atau MAE bersama R2R^2, ditambah baseline sebagai titik acuan.

Konteks biaya juga menentukan angka yang ditampilkan pada laporan. RMSE dan MAE berada pada satuan target, sehingga keduanya dapat disandingkan langsung dengan batas toleransi yang ditetapkan pemilik masalah. Contoh batas tersebut adalah meleset paling banyak dua derajat pada prediksi suhu. Apabila batas semacam itu ada, MAE menjadi metrik yang paling sesuai karena mengukur rata-rata meleset tanpa mengkuadratkannya. Tanpa batas yang jelas, RMSE bersama R2R^2 dan baseline tetap menjadi susunan pelaporan yang aman.

Kesalahan umum#

  • Membandingkan RMSE antar dataset dengan satuan target berbeda. Penyebabnya adalah kebiasaan memperlakukan RMSE sebagai angka mutlak, padahal metrik ini dihitung pada satuan target dan mengikuti sebaran targetnya. RMSE 53.8534 bermakna hanya pada satuan target dataset diabetes, dan angka yang sama pada dataset lain dapat berarti hal yang berbeda sama sekali. Perbaikannya adalah membandingkan model pada dataset yang sama, atau melaporkan RMSE relatif terhadap rentang target apabila perbandingan lintas dataset tidak terhindarkan.
  • Menilai model tanpa baseline. Tanpa pembanding, RMSE 53.8534 tampak bagus atau buruk hanya tergantung tebakan pembacanya, karena tidak ada batas minimum yang menetapkan kinerja menebak rata-rata. Baseline DummyRegressor memberikan batas itu, dan keunggulan model di atasnya membuktikan bahwa fitur sungguh membawa informasi. Perbaikannya adalah mencetak skor baseline berdampingan dengan skor model, sebagaimana dilakukan pada skrip perhitungan di atas.
  • Menganggap R2R^2 tinggi sebagai tanda model siap digunakan. Angka itu dihitung dari satu data uji tertentu, sehingga tidak menjamin kinerja serupa pada data baru, apalagi bila distribusinya bergeser seiring waktu. Perbaikannya adalah memperlakukan R2R^2 sebagai ringkasan pada data uji tersebut, lalu memverifikasi ulang model pada data yang lebih baru sebelum model benar-benar dipakai.

Ringkasan#

  • MAE merata-ratakan selisih absolut dan tahan outlier, MSE menghukum kesalahan besar melalui kuadrat, dan RMSE mengembalikan satuannya ke satuan target.
  • R2R^2 menyatakan proporsi varians target yang terjelaskan, bernilai 0 untuk model sebaik menebak rata-rata, dan bisa negatif.
  • Model regresi dinilai pada data uji dan wajib dibandingkan dengan baseline sebelum dianggap berguna.
  • Hitung RMSE dengan root_mean_squared_error, bukan mean_squared_error(squared=False) yang sudah ditinggalkan.

Referensi#