Machine Learning: Polynomial Regression

Catatan penting : Jika Anda benar-benar awam tentang apa itu Python, silakan klik artikel saya ini. Jika Anda awam tentang R, silakan klik artikel ini.

Pada pembelajaran sebelumnya kita telah membahas tentang regresi sederhana, dan regresi multilinear. Kali ini kita akan membahas tentang regresi polinomial. Apa itu regresi polinomial?

Regresi polinomial merupakan regresi di mana fungsinya adalah kuadratik. Perbedaan persamaannya bisa kita lihat sebagai berikut:

Simple linear –> y = a_{{0}} + a_{{1}}*x_{{1}}

Multilinear –> y = y = a_{{0}} + a_{{1}}*x_{{1}} + a_{{2}}*x_{{2}} + ... + a_{{n}}*x_{{n}}

Polinomial –> y=a_{0} + a_{1}*x_{1} + a_{2}*{x_{{1}}}^{2} + ... + a_{n}*{x_{{n}}}^{n}

Pada ketiga fungsi di atas, tampak bahwa fungsi polinomial adalah fungsi kuadratik, di mana nilai variabel independen x_{{1}} ada yang bernilai pangkat 1, pangkat 2, pangkat n dan seterusnya.

Secara visual, maka perbedaanya sebagai berikut:

visualisasi simple linear dan polinomial

 

Pertanyaannya, kapan kita memakai simple, multi, dan poli? Semua fungsi ini tergantung dari pertanyaan yang ingin dijawab. Jika kita ingin mencari hubungan antara 1 variabel dependen dengan 1 variabel independen, maka bisa menggunakan simple atau poli. Jika kita ingin mencari hubungan antara 1 variabel dependen dengan banyak variabel independen, maka yang kita gunakan adalah multilinear.

Lalu, jika kita hanya ingin mencari hubungan terhadap 1 variabel independen, kapan menggunakan simple dan kapan menggunakan polinomial? Jawabannya adalah dilihat seberapa fit model kita dengan data aslinya. Jika menggunakan simple linear sudah fit, maka cukup menggunakan model ini saja, namun jika tidak dan fungsinya tampak seperti fungsi polinomial (fungsi kuadratik) maka kita coba dekati dengan metode polinomial. Jika menggunakan simple dan polinomial tidak juga fit, maka hubungan antara keduanya bukanlah linear, sehingga harus menggunakan algoritma regresi non linear seperti SVR (support vector regression) misalnya.

Mungkin Anda juga bertanya, apakah polinomial itu adalah termasuk family dari regresi linear? Jawabannya adalah Ya. Polinomial dalam beberapa literatur lain disebut dengan polynomial linear regression, jadi ia termasuk ke dalam fungsi Linear, dan bukan non Linear.

Definisi linear adalah hubungan kombinasi linear (berantai) antara variabel dependen y dengan koefisien variabel independen a_{{0}}a_{{1}}, dan seterusnya yang konsisten. Sementara non linear adalah fungsi di mana koefisiennya tidak bisa berdiri sendiri, misal a_{1} memerlukan a_{2},a_{4} dan lainnya.  Lebih mudahnya, perbedaan fungsi linear dan non linear adalah sebagai berikut:

Fungsi linear –> y=a_{0} + a_{1}*x_{1} + a_{2}*{x_{{1}}}^{2} + ... + a_{n}*{x_{{n}}}^{n}

Fungsi non linear –> y = a_{0} + \frac{a_{1}*x_{1}}{{a_{2}}*x_{2}+x_{3}}

Perlu dicatat bahwa secara visualisasi 2D (2 dimensi), regresi polinomial nampak tidak seperti fungsi linear (simple linear) karena bentuknya melengkung dan tidak lurus seperti linear sederhana, namun ia tetaplah bagian dari fungsi linear. Jika hanya dilihat secara visual, maka ketika di plot ke dalam 3 dimensi (3D), ia akan nampak sebagai fungsi yang linear.

Tidak sedikit pula yang mengatakan regresi polinomial sebagai fungsi non linear. Hal ini boleh-boleh saja jika dalam konteks visualisasi 2D. Namun dalam konteks fungsi linear, kita tahu bahwa ia sebenarnya merupakan fungsi linear.

Semoga sampai di sini, konsep regresi polinomial dapat dipahami.

 

STUDI KASUS

Dalam pembelajaran kali ini, kita ingin mencari solusi dari proses perekrutan sebuah perusahaan. Perusahaan ini sedang merekrut seorang calon pegawai baru. Namun, bagian HRD perusahaan ini kebingungan, berapa gaji yang harus ia berikan, sesuai dengan level di mana calon pegawai baru ini masuk. Tentunya akan ada proses negosiasi antara HRD dengan calon pegawai baru ini tentang jumlah gaji yang pantas diterima pegawai tersebut.

Calon pegawai ini mengaku bahwa sebelumnya ia telah berada di posisi Region Manager dengan pengalaman bekerja 20 tahun lebih dengan gaji hampir 160K dollar per tahun. Ia meminta perusahaan baru ini untuk memberikan ia gaji lebih dari 160K dollar per tahun.

Untuk menyelidiki apakah calon pegawai ini benar-benar digaji sebanyak 160K dollar/tahun, maka bagian HRD membandingkan data gaji perusahaan tempat calon pegawai ini bekerja sebelumnya (kebetulan perusahaan memiliki daftar gajinya) dengan pengakuannya.

Data yang dimiliki adalah daftar antara gaji dan level di perusahaan tersebut. Bagian HRD ingin mencari hubungan antara gaji yang didapat dengan level (tingkatan jabatan) di perusahaan calon pekerja tadi bekerja sebelumnya.

Hasil penelitian awal, calon pegawai ini layak masuk di level 6.5 (antara region manager dan partner).

Berikut variabel yang kita miliki:

  • Variabel dependen : Gaji (dalam dollar per tahun)
  • Variabel independen : level (tingkatan jabatan)

 

Tabel variabel dependen (gaji) dengan variabel independen (level) yang dijelaskan dengan definisi tiap level di kolom sebelah kiri

 

Setelah melihat tabelnya, bisa dilihat bahwa kita memiliki 1 variabel dependen, dan 1 variabel independen. Dari sini kita bisa tahu bahwa kitA bisa menggunakan pendekatan model regresi sederhana. Walau demikian, datanya sudah diatur sedemikian rupa sehingga fungsi yang dimiliki antara variabel dependen dengan independen adalah kuadratik. Kita tetap akan mencoba membuat 2 model (simple dan polinomial) untuk membandingkan performanya (seberapa fit antara 2 model regresi ini dengan data).

Untuk memulai pembelajaran, silakan donwload dulu datasetnya di link ini.

 

 

Bahasa Python

# Mengimpor library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Mengimpor dataset
dataset = pd.read_csv('Posisi_gaji.csv')
X = dataset.iloc[:, 1:2].values
y = dataset.iloc[:, 2].values

# Fitting Linear Regression ke dataset
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X, y)

# Fitting Polynomial Regression ke dataset
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 2)  ## nantinya degree diganti menjadi 4
X_poly = poly_reg.fit_transform(X)
lin_reg_2 = LinearRegression()
lin_reg_2.fit(X_poly, y)

# Visuaslisasi hasil regresi
plt.scatter(X, y, color = 'red')
plt.plot(X, lin_reg.predict(X), color = 'blue')
plt.title('Sesuai atau tidak (Linear Regression)')
plt.xlabel('Level posisi')
plt.ylabel('Gaji')
plt.show()

# Visualising the hasil regresi polynomial
plt.scatter(X, y, color = 'red')
plt.plot(X, lin_reg_2.predict(X_poly), color = 'blue')
plt.title('Sesuai atau tidak (Polynomial Regression)')
plt.xlabel('Level posisi')
plt.ylabel('Gaji')
plt.show()

# Mempridiksi hasil dengan regresi
lin_reg.predict(6.5)

# Memprediksi hasil dengan regresi polynomial
lin_reg_2.predict(poly_reg.fit_transform(6.5))

Penjelasan:

  • Line 2 sampai line 4 mengimpor library yang diperlukan
  • Line 7 mengimpor datasetnya
  • Line 8 menentukan variabel independen X. Penting, bahwa usahakan variabel independen adalah matrix, dan bukan vector. Kita bisa saja menuliskan X = dataset.iloc[:, 1].values, namun perintah ini akan menghasilkan vector. Biasakan membuatnya sebagai sebuah matrix, dengan cara melakukan slicing X = dataset.iloc[:, 1:2].values. Bagaimana kita tahu X sudah menjadi matrix? Bisa dilihat kolom size di spyder  variabel X adalah (10,1). Artinya X adalah matrix 10×1 (10 baris dan 1 kolom).
  • Line 9 menentukan variabel dependen y. Penting, usahakan variabel dependen adalah vector. Vektor (vector) adalah matriks yang hanya terdiri dari 1 kolom, atau matriks 1 baris. Cara membuatnya menjadi vektor adalah jangan lakukan slicing pada bagian kolomnya. Pada bagian size variabel y di spyder adalah (10,) yang artinya ia adalah matrix 1 baris.
  • Line 12 mengimpor class LinearRegression (untuk membuat model regresi sederhana)
  • Line 13 mempersiapkan objek lin_reg sebagai model regresi sederhana
  • Line 14 membuat model regresi sederhana (Kali ini tanpa membagi dataset ke dalam test dan train set, karena datasetnya terlalu kecil (biasanya train set minimal butuh 10 baris, dan kali ini tidak cukup data untuk dimasukkan ke test set). Walau demikian, model yang jadi nanti akan merupakan bagian dari train set, dan dataset baru yang diterima (pengujian train set) akan menjadi test set-nya).

Untuk membuat model polinomial, kita perlu memahami konsep teknisnya. Model regresi polinomial yang akan kita buat sebenarnya hanyalah modifikasi dari model regresi biasa (baik simple atau multi), di mana modifikasinya adalah dengan menambahkan fitur polinomial. Oleh karena itu, prosedurnya sebenarnya adalah prosedur regresi biasa, namun sebelumnya membuat model regresi ada penambahan langkah-langkah preprocessing polinomial.

  • Line 17 mengimpor PolynomialFeatures dari library sklearn.preprocessing untuk membuat model polinomial. Untuk mengetahui parameter apa saja yang diperlukan, cukup arahkan kursor pada PolynomialFeatures, lalu klik CTRL+i.
  • Line 18 mempersiapkan objek poly_reg sebagai transformasi matriks X menjadi matriks X pangkat 2, pangkat 3 hingga pangkat n. Jadi nantinya kita memiliki beberapa tambahan variabel independen sebanyak n. Parameter default untuk PolynomialFeatures adalah degrees=2.
  • Line 19 menyiapkan objek X_poly sebagai hasil fit_transform (proses fit dan transform dilakukan sekaligus) dari variabel X. Mari kita bandingkan antara X dengan X_poly.

 

 

Bisa dilihat, X_poly memiliki 3 kolom. Kolom paling kiri adalah hasil transformasi X pangkat nol. Kolom ini otomatis ditambahkan oleh class PolynomialFeatures untuk mempersiapkan konstanta untuk a_{{0}} (di mana x_{{0}} = 1, di bahas di multiple regression sebelumnya).

Kolom kedua adalah nilai X dengan pangkat 1 (nilai X sesungguhnya), dan kolom paling kanan adalah nilai X pangkat 2 (degree=2).

Jika kita menuliskan degree=4 misalnya, maka nanti X_poly akan menampilkan kolom untuk nilai X hingga pangkat 4.

  • Line 20 menyiapkan objek lin_reg_2 sebagai model regresi polinomial.
  • Line 21 membuat model regresi polinomial dengan parameter variabel independen adalah X_poly, dan variabel dependennya adalah y.
  • Line 24 sampai line 29 adalah perintah untuk visualisasi hasil model regresi sederhana kita. Ingat untuk visualisasi, perintah dari line 24-29 harus dieksekusi bersamaan. Visualisasinya akan nampak sebagai berikut:

 

Bisa dilihat bahwa model regresi sederhana kita sangatlah tidak baik (tidak fit), di mana jarak antara model (garis biru) dengan data sesungguhnya (titik merah) sangat jauh. Dengan melihat titik merahnya saja sebenarnya sudah bisa diduga bahwa fungsi yang cocom adalah fungsi kuadratik (polinomial), di mana semakin tinggi levelnya (sumbu x) maka semakin tinggi pula gajinya (data sumbu y yang melengkung ke atas).

  • Line 32 sampai line 37 adalah perintah untuk visualisasi hasil model regresi polinomial. Pelru diingat sumbu y nya adalah lin_reg_2.predict(X_poly).  Hasilnya akan tampak sebagai berikut:

Bisa dilihat dengan menggunakan fungsi polinomial hasilnya cukup baik. Namun tetap saja masih kurang cukup fit, di mana masih ada jarak antara model dengan data. Solusinya adalah pada line 18 kita ubah degree nya dari 2 menjadi 4. Eksekusi line 18 sampai line 21. Kemudian eksekusi line 32 sampai line 37. Maka visualisasi yang baru akan tampak sebagai berikut:

Ternyata sekarang hasilnya cukup baik.

Tentunya Anda pun juga bisa bereksperimen dengan merubah-ubah degree-nya. Anda bisa mencoba degree=3, degree=6 dan seterusnya. Namun perlu diingat jangan sampai modelnya terlalu baik (overfitting), karena semakin besar nilai degree yang Anda tentukan, maka cenderung semakin fit dan semakin overfitting pula hasilnya.

Mengapa kita menghindari overfitting? Bukankah modelnya bisa menjadi sangat fit? Kita menghindari overfitting karena model seperti ini sangatlah tidak realistis. Modelnya akan menjadi terlalu baik, artinya terlalu mengesampingkan faktor-faktor lainnya (baik itu fixed effect ataupun random effect).

  • Line 40 adalah perintah untuk melihat dengan model regresi sederhana yang sudah dibuat, berapa gaji yang layak untuk tingkat level 6.5? Maka cukup ganti parameter X di lin_reg.predict(X) dengan angka 6.5. Jika dieksekusi, hasilnya adalah 330378.78 dollar/tahun. Tentunya prediksi dari regresi sederhana terlalu tinggi (terlihat juga di plot visualisasinya). Kita tidak menginginkan gaji yang terlalu tinggi yang merupakan hasil dari model regresi sederhana yang buruk kali ini.
  • Line 43 adalah perintah untuk melihat prediksi gaji dengan model regresi polinomial. Perlu diperhatikan bahwa parameter X diganti dengan poly_reg.fit_transform(6.5) dan bukan X_poly. Karena kita ingin mengisi angka 6.5 sebagai parameter X. Sementara X_poky adalah hasil dari definisi fungsi poly_reg.fit_transform(X). Ketika dieksekusi maka hasilnya adalah 158862.45 dollar/tahun. Prediksi yang cukup baik, dengan model yang fit.

Kesimpulan apa yang bisa diambil dari model polinomial?

Ternyata apa yang dikatakan calon pegawai tersebut adalah benar, di mana di perusahaan sebelumnya dengan level 6.5 ia mengaku digaji hampir 160K dollar/tahun, dan ternyata prediksinya adalah 158K dollar/tahun. Selisih 2K yang tidak terlalu jauh. Bisa dikatakan bahwa calon pegawai adalah orang yang jujur dan tidak membesar-besarkan gaji sebelumnya. Perusahaan cukup beruntung memiliki claon pegawai yang jujur.

 

 

Bahasa R

# Mengimpor dataset
dataset = read.csv('Posisi_gaji.csv')
dataset = dataset[2:3]

# Membuat model regresi sederhana
lin_reg = lm(Gaji ~ ., data = dataset)

# Membuat model regresi polinomial
dataset$Level2 = dataset$Level^2
dataset$Level3 = dataset$Level^3
dataset$Level4 = dataset$Level^4
poly_reg = lm(Gaji ~ ., data = dataset)
summary(poly_reg)

# Visualisasi hasil regresi sederhana
# install.packages('ggplot2')
library(ggplot2)
ggplot() +
    geom_point(aes(x = dataset$Level, y = dataset$Gaji), colour = 'red') +
    geom_line(aes(x = dataset$Level, y = predict(lin_reg, newdata = dataset)), colour = 'blue') +
    ggtitle('Sesuai atau tidak(Linear Regression)') +
    xlab('Level') +
    ylab('Gaji')

# Visualisasi hasil regresi polinomial
# install.packages('ggplot2')
ggplot() +
    geom_point(aes(x = dataset$Level, y = dataset$Gaji), colour = 'red') +
    geom_line(aes(x = dataset$Level, y = predict(poly_reg, newdata = dataset)), colour = 'blue') +
    ggtitle('Sesuai atau tidak (Polynomial Regression)') +
    xlab('Level') +
    ylab('Gaji')

# Prediksi tingkat 6.5 dengan model regresi sederhana
predict(lin_reg, data.frame(Level = 6.5))

# Prediksi tingkat 6.5 dengan model regresi polinomial
predict(poly_reg, data.frame(Level = 6.5,
                             Level2 = 6.5^2,
                             Level3 = 6.5^3,
                             Level4 = 6.5^4))

Penjelasan:

  • Line 2 mengimpor dataset.
  • Line 3 melakukan slicing kolom ke 2 dan 3 saja yang diperlukan.
  • Line 6 membuat model regresi sederhana
  • Line 9 sampai line 11 adalah menambahkan fitur polinomial untuk model regresi kita. Pada dasarnya ini hanyalah menambahkan kolom baru (variabel-variabel independen baru) di dataset kita yang berisi data pangkat untuk setiap nilai X. Jika dilihat datasetnya maka tampak sebagai berikut:

 

Kolom Level2 adalah hasil pangkat 2 dari semua baris di kolom level. Level3 adalah hasil pangkat 3, dan Level4 adalah hasil pangkat 4.

  • Line 12 membuat model regresi polinomial. Sebagai catatan, dengan menambahkan tanda titik (.) setelah tanda tilde (~) maka R akan mencari fungsi regresi terbaik dari semua variabel independen yang ada (Level, Level2, Level3, Level4).
  • Line 13 melihat hasil statistik sekaligus mengetahui koefisien dan konstanta apa saja yang signifikan. Tampilannya adalah sebagai berikut:

 

 

Kita lihat bahwa semua variabel independen signifikan. Jika ditulis persamaannya, maka menjadi:

 

Gaji = 184166 -211002*Level + 94765* Level^{2} -15463*Level^{3} + 890*Level^{4}

 

  • Line 16 menginstal package ggplot2 (jika sudah terinstall abaikan saja)
  • Line 17 mengimpor library ggplot2
  • Line 18 sampai line 23 adalah perintah untuk visualisasi model regresi sederhana. Jika dieksekusi bersamaan, maka tampak sebagai berikut:

 

 

  • Line 27 sampai line 32 adalah perintah untuk visualisasi model regresi polinomial. Hasil eksekusinya tampak sebagai berikut:

 

 

Tampak bahwa visualisasi model regresi polinomial dengan derajat 4 lebih baik (lebih fit antara model dengan data) dibandingkan dengan model regresi sederhana. Oleh karena itu kita menggunakan model regresi polinomial untuk memprediksi berapa gaji dia ketika dulu bekerja di perusahaan sebelumnya.

  • Line 35 memprediksi gaji level 6.5 dengan model regresi sederhana. Hasilnya adalah 330378.8 (sama dengan hasil python). Angkanya terlalu tinggi, sehingga model regresi sederhana sangat buruk untuk memprediksi gaji.
  • Line 38 sampai line 41 memprediksi gaji level 6.5 dengan model regresi polinomial (derajat=4). Hasilnya adalah 158862.5 (sama dengan hasil python). Angka yang cukup baik dengan model yang fit.

Sesuai dengan kesimpulan yang diambil sebelumnya (di pembahasan bahasa python), maka calon pegawai tersebut adalah pegawai yang jujur. Oleh karena itu, perusahaan cukup beruntung mendapatkan calon pegawai berkualitas dengan pengalaman mumpuni dan moral yang baik. Dengan demikian calon pegawai ini wajar jika mendapat gaji di atas 160K sesuai dengan permintaannya.

Persamaan model regresi poinomialnya adalah:

 

Gaji = 184166 -211002*Level + 94765* Level^{2} -15463*Level^{3} + 890*Level^{4}

 

Demikianlah contoh aplikasi dari model machine learning regresi polinomial. Model yang sudah jadi ini tentunya bisa diuji ke dataset (diuji ke test set) untuk dibandingkan performanya dengan train set (model itu sendiri).

Semoga Anda bisa membuat model regresi polinomial Anda sendiri. Anda pun bisa menggunakan template di atas (bahasa R maupun python) untuk menyelesaikan persoalan Anda dengan pendekatan regresi.

Jika ada pertanyaan silakan ditanyakan di bagian komentar.

Semoga bermanfaat.

Leave a Reply

avatar
  Subscribe  
Notify of