Regresi Linear
Linear regression atau regresi linear adalah salah satu metode statistika paling dasar yang digunakan dalam machine learning dan data analysis. Metode ini digunakan untuk memodelkan hubungan antara dua variabel, yaitu variabel independen (predictor) dan variabel dependen (response).
Dalam konteks regresi linear sederhana, kita mencoba menemukan garis lurus yang paling sesuai dengan data kita. Garis ini dapat digunakan untuk memprediksi nilai dari variabel dependen berdasarkan nilai dari variabel independen.
Konsep Dasar Matematika
Regresi linear sederhana dapat dijelaskan dengan persamaan garis lurus berikut:
y=mx+b
Di mana:
- 𝑦 adalah variabel dependen (yang ingin kita prediksi).
- 𝑥 adalah variabel independen (predictor).
- m adalah koefisien kemiringan (slope) dari garis regresi.
- b adalah intercept, titik di mana garis memotong sumbu y.
Koefisien kemiringan (slope) menunjukkan seberapa banyak y berubah untuk setiap perubahan unit dalam x. Intercept menunjukkan nilai y ketika x adalah 0.
Implementasi dengan Python
Mari kita lihat bagaimana kita dapat mengimplementasikan regresi linear menggunakan Python. Kita akan menggunakan pustaka numpy
untuk manipulasi array dan sklearn
untuk membuat model regresi linear. Berikut adalah kode lengkapnya:
import numpy as np
from sklearn.linear_model import LinearRegression
# Dataset (diskon dalam persen dan penjualan setelah diskon)
diskon = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90]).reshape(-1, 1)
penjualan = np.array([90, 80, 70, 60, 50, 40, 30, 20, 10])
# Membuat model Linear Regression
model = LinearRegression()
model.fit(diskon, penjualan)
# Mencetak koefisien kemiringan (slope) dan intercept
print("Koefisien kemiringan (slope):", model.coef_[0])
print("Intercept:", model.intercept_)
# Prediksi jumlah penjualan untuk diskon 75%
diskon_prediksi = np.array([75]).reshape(-1, 1)
penjualan_prediksi = model.predict(diskon_prediksi)
print("Prediksi jumlah penjualan untuk diskon 75%:", penjualan_prediksi[0])
Penghitungan lewat Spreadsheet
Anggap kita punya data diskon dan penjualan seperti data
+------------+-----------+
| Diskon (%) | Penjualan |
+------------+-----------+
| 10 | 90 |
| 20 | 80 |
| 30 | 70 |
| 40 | 60 |
| 50 | 50 |
| 60 | 40 |
| 70 | 30 |
| 80 | 20 |
| 90 | 10 |
+------------+-----------+
Proses Perhitungan
- Rata -rata Diskon () =50
- Rata-rata Penjualan (Ȳ) =50
- Deviasi Diskon = ( X — X̄)= X-50
- Deviasi Penjualan= ( Y— Ȳ)= Y- 50
+------------+-----------+----------------+---------------------+
| Diskon (%) | Penjualan | Deviasi Diskon | Deviasi Penjualan |
+------------+-----------+----------------+---------------------+
| 10 | 90 | -40 | 40 |
| 20 | 80 | -30 | 30 |
| 30 | 70 | -20 | 20 |
| 40 | 60 | -10 | 10 |
| 50 | 50 | 0 | 0 |
| 60 | 40 | 10 | -10 |
| 70 | 30 | 20 | -20 |
| 80 | 20 | 30 | -30 |
| 90 | 10 | 40 | -40 |
+------------+-----------+----------------+---------------------+
| Rata-rata X | 50 | | |
| Rata-rata Y | 50 | | |
+------------+-----------+----------------+---------------------+
Proses penghitungan Slope
- Deviasi Produk ((𝑋− X̄)(𝑌−Ȳ)(X− X̄)(Y−Ȳ))
- Deviasi Kuadrat ((𝑋−X̄) *(X−X̄)^2):
- Slope (𝑚) = Deviasi Produk / Deviasi Kuadrat (-6000/6000) = -1
+------------+-----------+----------------+---------------------+----------------+--------------------------+
| Diskon (%) | Penjualan | Deviasi Diskon | Deviasi Penjualan | Produk Deviasi | Kuadrat Deviasi Diskon |
+------------+-----------+----------------+---------------------+----------------+--------------------------+
| 10 | 90 | -40 | 40 | -1600 | 1600 |
| 20 | 80 | -30 | 30 | -900 | 900 |
| 30 | 70 | -20 | 20 | -400 | 400 |
| 40 | 60 | -10 | 10 | -100 | 100 |
| 50 | 50 | 0 | 0 | 0 | 0 |
| 60 | 40 | 10 | -10 | -100 | 100 |
| 70 | 30 | 20 | -20 | -400 | 400 |
| 80 | 20 | 30 | -30 | -900 | 900 |
| 90 | 10 | 40 | -40 | -1600 | 1600 |
+------------+-----------+----------------+---------------------+----------------+--------------------------+
| Jumlah | | -6000 | 6000
+-----------------------------------------+---------------------+----------------+--------------------------+
| Rata-rata X | 50 | | | | |
| Rata-rata Y | 50 | | | | |
+-------------+----------+----------------+---------------------+----------------+--------------------------+
Slope uda ketemu lanjut nyari Intercept
Proses penghitungan Intercept
rata-rata 𝑋 dan Y serta kemiringan (m) untuk menghitung intercept (𝑏): b=Ȳ−mX̄
b=50−(−1*50) =100
Intercept =100, Slope = -1
Jika ingin melakukan prediksi berarti tinggal Penjualan berapa ketika diskon (?)
Prediksi Penjualan = Slope*(diskon) +intercept
Gradient Descent
Gradient descent adalah metode yang digunakan untuk menemukan nilai terbaik dari parameter model secara efektif dan efisien. Mari kita bahas apa yang dimaksud dengan “efektif” dan “efisien” dalam konteks ini. Juga perlu diingat Gradient Descent bukanlah proses Evaluasi Model, melainkan algoritma Optimasi yang digunakan untuk melatih model.
Efektif: Meminimalkan Kesalahan
- Tujuan Utama: Gradient descent bertujuan untuk menemukan parameter model (misalnya, bobot dalam regresi linier) yang meminimalkan fungsi kesalahan (loss function).
- Fungsi Kesalahan: Ini adalah ukuran seberapa baik model memprediksi output yang diinginkan. Fungsi kesalahan umum adalah Mean Squared Error (MSE) untuk regresi linier.
- Proses: Dengan menghitung gradien (turunan) dari fungsi kesalahan terhadap parameter model, gradient descent menunjukkan arah yang tepat untuk mengurangi kesalahan. Setiap langkah dalam proses gradient descent mengarah pada pengurangan kesalahan prediksi model.
Efisien: Mencapai Nilai Minimum dengan Cepat
- Langkah Bertahap: Gradient descent memperbarui parameter model dalam langkah-langkah kecil berdasarkan gradien yang dihitung. Langkah-langkah ini diatur oleh learning rate, yang menentukan seberapa besar setiap pembaruan.
- Iterasi Berulang: Proses ini diulang berkali-kali (iterasi) hingga fungsi kesalahan mencapai nilai minimum atau sangat dekat dengan nilai minimum.
- Kecepatan Konvergensi: Learning rate yang tepat dan inisialisasi yang baik membantu mencapai nilai minimum lebih cepat, menjadikan proses ini efisien dalam penggunaan waktu dan sumber daya komputasi.
Contoh Kasus
Kita bayangkan kita mau menemukan jalur terpendek turun dari puncak gunung ke lembah. Gradient descent membantu kita menemukan jalur tersebut dengan mengikuti arah paling curam menurun di setiap langkah.
import numpy as np
import matplotlib.pyplot as plt
# Dataset (diskon dalam persen dan penjualan setelah diskon)
diskon = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
penjualan = np.array([90, 80, 70, 60, 50, 40, 30, 20, 10])
# Inisialisasi parameter
w = 0.0 # slope
b = 0.0 # intercept
learning_rate = 0.0001
num_iterations = 1000
# Menyimpan sejarah untuk visualisasi
w_history = []
b_history = []
cost_history = []
# Gradient Descent
m = len(diskon)
for i in range(num_iterations):
# Forward Propagation: Hitung prediksi
penjualan_prediksi = w * diskon + b
# Perhitungan Kesalahan: Hitung error
error = penjualan_prediksi - penjualan
# Fungsi biaya (MSE)
cost = (1/m) * np.sum(error ** 2)
# Backward Propagation: Hitung gradien
dw = (2/m) * np.dot(error, diskon)
db = (2/m) * np.sum(error)
# Pembaruan Parameter
w -= learning_rate * dw
b -= learning_rate * db
# Simpan sejarah
w_history.append(w)
b_history.append(b)
cost_history.append(cost)
# Cetak biaya untuk memonitor kemajuan
if i % 100 == 0:
print(f"Iteration {i}: Cost {cost}, w {w}, b {b}")
# Setelah gradient descent
print("Koefisien kemiringan (slope):", w)
print("Intercept:", b)
# Prediksi jumlah penjualan untuk diskon 75%
diskon_prediksi = np.array([75])
penjualan_prediksi = w * diskon_prediksi + b
print("Prediksi jumlah penjualan untuk diskon 75%:", penjualan_prediksi[0])
# Visualisasi
# Plot Data Asli dan Garis Regresi
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
plt.scatter(diskon, penjualan, color='blue', label='Data Asli')
plt.plot(diskon, w * diskon + b, color='red', label='Garis Regresi')
plt.xlabel('Diskon (%)')
plt.ylabel('Penjualan')
plt.title('Data Asli dan Garis Regresi')
plt.legend()
# Plot Fungsi Biaya terhadap Jumlah Iterasi
plt.subplot(1, 2, 2)
plt.plot(range(num_iterations), cost_history, color='purple')
plt.xlabel('Jumlah Iterasi')
plt.ylabel('Biaya (MSE)')
plt.title('Fungsi Biaya vs. Jumlah Iterasi')
plt.tight_layout()
plt.show()
# Visualisasi Kontur (Opsional)
W, B = np.meshgrid(np.linspace(min(w_history), max(w_history), 100),
np.linspace(min(b_history), max(b_history), 100))
Z = np.array([np.mean((w * diskon + b - penjualan)**2) for w, b in zip(np.ravel(W), np.ravel(B))])
Z = Z.reshape(W.shape)
plt.figure(figsize=(7, 6))
plt.contour(W, B, Z, levels=np.logspace(-1, 3, 20), cmap='viridis')
plt.plot(w_history, b_history, 'r.-', label='Jalur Gradient Descent')
plt.xlabel('w (Slope)')
plt.ylabel('b (Intercept)')
plt.title('Kontur Fungsi Biaya')
plt.legend()
plt.show()
Inisialisasi Parameter
w
(slope) danb
(intercept) diinisialisasi dengan nilai 0.learning_rate
diatur ke 0.0001.num_iterations
diatur ke 1000.
# Inisialisasi parameter
w = 0.0 # slope
b = 0.0 # intercept
learning_rate = 0.0001
num_iterations = 1000
Forward Propagation
Pada setiap iterasi, kita menghitung nilai prediksi Y menggunakan parameter saat ini w
dan b
: Y=wX+b
# Forward Propagation: Hitung prediksi
penjualan_prediksi = w * diskon + b
Perhitungan Kesalahan
Kesalahan dihitung sebagai perbedaan antara nilai aktual Y dan nilai prediksi Y :
e = Y (aktual) − Y (Prediksi)
Fungsi biaya (Mean Squared Error, MSE) digunakan untuk mengukur seberapa baik model saat ini:
# Perhitungan Kesalahan: Hitung error
error = penjualan_prediksi - penjualan
# Fungsi biaya (MSE)
cost = (1/m) * np.sum(error ** 2)
Backward Propagation
Gradien dari cost function terhadap parameter w
dan b
dihitung. Gradien menunjukkan arah dan besarnya perubahan yang diperlukan untuk mengurangi kesalahan.
# Backward Propagation: Hitung gradien
dw = (2/m) * np.dot(error, diskon)
db = (2/m) * np.sum(error)
Pembaruan Parameter
Parameter diperbarui dalam arah negatif dari gradien untuk mengurangi fungsi biaya.
# Pembaruan Parameter
w -= learning_rate * dw
b -= learning_rate * db
Iterasi
Proses di atas diulang untuk sejumlah iterasi yang telah ditentukan