Implementasi algoritma Linear Regression dari awal menggunakan Python tanpa menggunakan library machine learning seperti scikit-learn.
- Tentang Proyek
- Teori Dasar
- Struktur Proyek
- Persyaratan
- Instalasi
- Cara Menjalankan
- Penjelasan Kode
- Dataset
- Output
Proyek ini mengimplementasikan algoritma Linear Regression dari awal (from scratch) menggunakan metode Gradient Descent untuk menemukan parameter optimal (slope dan intercept) dari garis regresi. Proyek ini dibuat untuk tujuan pembelajaran dan pemahaman mendalam tentang bagaimana algoritma linear regression bekerja di balik layar.
Linear Regression adalah algoritma supervised learning yang digunakan untuk memprediksi nilai kontinu berdasarkan satu atau lebih variabel independen. Model linear regression mencari hubungan linier antara variabel input (x) dan variabel output (y).
Persamaan garis lurus yang digunakan:
y = mx + b
Dimana:
y= nilai prediksi (dependent variable)x= nilai input (independent variable)m= slope (kemiringan garis)b= intercept (titik potong dengan sumbu y)
Tujuan dari linear regression adalah menemukan nilai m dan b yang optimal sehingga garis yang dihasilkan memiliki error terkecil terhadap data aktual.
Gradient Descent adalah algoritma optimasi yang digunakan untuk menemukan nilai minimum dari suatu fungsi. Dalam konteks linear regression, gradient descent digunakan untuk meminimalkan Mean Squared Error (MSE).
MSE = (1/n) * Ξ£(yi - Ε·i)Β²
Dimana:
n= jumlah datayi= nilai aktualΕ·i= nilai prediksi (mx + b)
Turunan parsial MSE terhadap m:
βMSE/βm = -(2/n) * Ξ£ xi * (yi - (m*xi + b))
Turunan parsial MSE terhadap b:
βMSE/βb = -(2/n) * Ξ£ (yi - (m*xi + b))
m_new = m_old - learning_rate * βMSE/βm
b_new = b_old - learning_rate * βMSE/βb
linear-regression-from-scratch/
β
βββ linear_regression.py # File utama implementasi linear regression
βββ requirements.txt # File dependencies Python
βββ LICENSE # MIT License
βββ res/
β βββ train.csv # Dataset training (700 data)
β βββ test.csv # Dataset testing (300 data)
βββ .gitignore # File gitignore untuk Python
βββ README.md # Dokumentasi proyek
- Python 3.8+
- NumPy >= 1.20.0
- Pandas >= 1.3.0
- Matplotlib >= 3.4.0
-
Clone repository
git clone https://github.com/nelsooooon/linear-regression-from-scratch.git cd linear-regression-from-scratch -
Install dependencies
pip install -r requirements.txt
Atau install secara manual:
pip install 'numpy>=1.20.0' 'pandas>=1.3.0' 'matplotlib>=3.4.0'
Jalankan script Python dengan perintah:
python linear_regression.pyProgram akan:
- Membaca data training dan testing dari folder
res/ - Membersihkan data (menghapus nilai null dan outlier)
- Menjalankan gradient descent selama 1000 epoch
- Menampilkan nilai slope (m) dan intercept (b) yang ditemukan
- Menampilkan visualisasi scatter plot dengan garis regresi
def gradient_descent(m_now, b_now, points, learning_rate):
m_gradient = 0
b_gradient = 0
n = len(points)
for i in range(n):
xi = points.iloc[i].x
yi = points.iloc[i].y
m_gradient += -(2/n) * xi * (yi - (m_now * xi + b_now))
b_gradient += -(2/n) * (yi - (m_now * xi + b_now))
m = m_now - m_gradient * learning_rate
b = b_now - b_gradient * learning_rate
return m, bPenjelasan:
- Fungsi ini menghitung gradient dari MSE untuk parameter
mdanb - Mengiterasi setiap data point untuk menghitung total gradient
- Mengupdate nilai
mdanbberdasarkan learning rate - Mengembalikan nilai
mdanbyang baru
def drop_outlier(df):
df_clean = df.copy()
for col in ['x', 'y']:
Q1 = df_clean[col].quantile(0.25)
Q3 = df_clean[col].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - (1.5 * IQR)
upper = Q3 + (1.5 * IQR)
df_clean = df_clean[(df_clean[col] >= lower) & (df_clean[col] <= upper)]
return df_cleanPenjelasan:
- Menggunakan metode Interquartile Range (IQR) untuk mendeteksi outlier
- Menghitung Q1 (kuartil pertama) dan Q3 (kuartil ketiga)
- Data dianggap outlier jika berada di luar range
[Q1 - 1.5*IQR, Q3 + 1.5*IQR] - Menghapus outlier untuk kolom
xdany
m = 0
b = 0
learning_rate = 0.0001
epochs = 1000
for i in range(epochs):
if i % 50 == 0:
print(f"Epoch: {i}")
m, b = gradient_descent(m, b, data_train_clean, learning_rate)Parameter yang digunakan:
mdanbdiinisialisasi dengan nilai 0learning_rate = 0.0001(langkah pembelajaran yang kecil untuk konvergensi stabil)epochs = 1000(iterasi gradient descent)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].scatter(x=data_train_clean.x, y=data_train_clean.y, color='black', alpha=0.5)
axes[1].scatter(x=data_test.x, y=data_test.y, color='black', alpha=0.5)
for i in range(len(axes)):
axes[i].plot(list(range(1, 101)), [m * x + b for x in range(1, 101)], color='red')
fig.tight_layout()
plt.show()Penjelasan:
- Membuat 2 subplot side-by-side
- Plot kiri: Data training dengan garis regresi
- Plot kanan: Data testing dengan garis regresi
- Scatter plot berwarna hitam, garis regresi berwarna merah
Dataset yang digunakan terdiri dari 2 file CSV:
| File | Jumlah Data | Kolom |
|---|---|---|
train.csv |
700 baris | x, y |
test.csv |
300 baris | x, y |
Dataset memiliki hubungan linear positif antara variabel x dan y, ideal untuk pembelajaran linear regression.
Setelah menjalankan program, output yang dihasilkan:
-
Progress Training: Menampilkan nomor epoch setiap 50 iterasi
Epoch: 0 Epoch: 50 Epoch: 100 ... Epoch: 950 -
Parameter Final: Nilai slope (m) dan intercept (b) yang ditemukan
0.9876... 1.234... -
Visualisasi: Menampilkan 2 plot:
- Plot kiri: Data training dengan garis regresi
- Plot kanan: Data testing dengan garis regresi
Proyek ini dilisensikan di bawah MIT License - lihat file LICENSE untuk detail lebih lanjut.