Implementasi Regresi Linear Menggunakan Python

Pada tulisan ini gw jelaskan bagaimana mencari persamaan regresi, yakni dengan menghitung semua parameter estimasi menggunakan perhitungan matriks. Namun coba bayangkan matriks yang dihasilkan jika terdapat ratusan data dengan puluhan atribut, akan sangat besar. Matriks yang besar ini membutuhkan memori yang besar pula untuk melakukan komputasi antar matriks. Inilah kekurangannya jika kita menyelesaikan masalah regresi linear menggunakan matriks. Oleh karena itu, cara yang lebih efisien untuk menyelesaikan masalah regresi ialah menggunakan gradient descent. Silakan baca tulisan mengenai gradient descent disini.

Dalam implementasi ini kita gunakan bahasa pemrograman Python.

  • Meng-import package yang dibutuhkan. Numpy digunakan untuk menyimpan data dalam bentuk matriks dan untuk manipulasi matrix. Matplotlib digunakan untuk menampilkan grafik/plot regresi linear.
    import numpy as np
    import matplotlib.pyplot as plt
  • Memuat data set (data_rumah_bdg). Data set yang gw pakai adalah data penjualan rumah di Bandung yang terdiri dari atribut Luast Tanah, Luas Bangunan, Jumlah Kamar Tidur, Jumlah Kamar Mandi, dan Harga Jual Rumah. Karena baris pertama pada data set merupakan nama kolom, kita buang baris pertama ini.
    data = np.genfromtxt("../data_rumah_bdg.csv", dtype=int, delimiter=",")
    data = data[1:, :]
  • Menambahkan sebuah kolom baru di awal data yang diisi dengan nilai 1. Mengapa kita tambahkan ini? Karena kita akan melakukan perkalian antara matriks yang berisi koefisien pada persamaan regresi dengan matriks data set ini. Tulisan ini mungkin membantu.
    data = np.insert(data, 0, 1, axis=1)
  • Kita tidak menggunakan semua atribut, kita hanya gunakan atribut Luas Tanah saja sebagai input dan Harga Jual sebagai output. So, kita ambil kolom pertama dan kedua (kolom pertama merupakan hasil penambahan sebelumnya dan kolom kedua merupakan atribut Luas Tanah) sebagai input.
    X = data[:, :2]
    y = data[:, 5]
  • Mengatur learning rate atau $\alpha$ dan banyak iterasi yang akan dilakukan selama proses learning.
    alpha = 0.00005
    num_iterations = 1500
  • Menginisialisasi nilai $\beta$ (nilai yang kita cari) dengan 0.
    beta = np.zeros(shape=(1, 2))
  • Variabel lain yang dibutuhkan: variabel N untuk menyimpan jumlah data dan variabel tmp_beta untuk menyimpan nilai beta sementara.
    N = y.size
    tmp_beta = [0] * X.shape[1]
  • Proses learning sebanyak iterasi yang telah ditentukan. Implementasi dari gradient descent pada tulisan ini.
    for i in range(num_iterations):
         y_hat = np.inner(beta, X)
         error = np.subtract(y_hat, y)
         for p in range(X.shape[1]):
              sum_of_dot = np.inner(error, X[:, p])
              tmp_beta[p] = beta[0, p] - alpha * (2 / float(N)) * sum_of_dot
         for p in range(X.shape[1]):
              beta[0, p] = tmp_beta[p]
  • Menampilkan plot regresi linear
    p_x = np.arange(30, 200+1, 1)
    p_y = beta[0, 0] + beta[0, 1] * p_x
    
    plt.plot(X[:, 1], y,'bo')
    plt.plot(p_x,p_y,'r-',label='Regresi linear gradient descent')
    plt.xlim(30, 200)
    plt.ylim(300, 1600)
    plt.show()
  • Selesai

Perbandingan dengan Scikit-Learn dan Perhitungan Manual

Gw coba bandingkan gimana perbedaan antara hasil implementasi diatas dengan hasil regresi jika menggunakan package yang telah tersedia dan jika menggunakan perhitungan manual. Yang gw bandingin ialah nilai MSE dan $\beta$.

MSE $\beta_0$ $\beta_1$
Gradient Descent  18797.49 2.251 7.435
Scikit-Learn  16399.49  167.624  6.063
Hitung Manual  16399.49  167.624  6.063

Hasil dari Scikit-learning sama persis dengan perhitungan manual sedangkan hasil dari implementasi gradient descent cukup berbeda dengan menghasilkan MSE yang lebih besar. Mengapa hal ini terjadi?