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 –> Multilinear –> Polinomial –> Pada ketiga fungsi di atas, tampak bahwa fungsi polinomial adalah fungsi kuadratik, di mana nilai variabel independen ada yang bernilai pangkat 1, pangkat 2, pangkat n dan seterusnya. Nilai pangkat 2 sering disebut dengan orde 2, pangkat 3 dengan orde 3 dan seterusnya. Secara visual, maka perbedaanya sebagai berikut: 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 dengan koefisien variabel independen dan seterusnya yang konsisten. Sementara non linear adalah fungsi di mana koefisiennya tidak bisa berdiri sendiri, misal a1 memerlukan a2, dan seterusnya. Lebih mudahnya, perbedaan fungsi linear dan non linear adalah sebagai berikut: Fungsi linear –> Fungsi non linear –> 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 banyak yang masih menggolongkannya sebagai 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. Walau demikian, tidak sedikit juga para professor matematika yang mengatakan bahwa fungsi polinomial adalah linear jika ia hanya memiliki orde 1, dan lebih dari itu adalah menjadi non-linear. Tentu saja mereka tidak salah karena mereka memang expert di bidangnya. Hal ini juga sangat relevan jika kita berbicara dalam konteks visualisasi 2D. 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:
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 download 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) # Visualisasi hasil regresi sederhana 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() # Visualisasi 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() # Memprediksi hasil dengan regresi sederhana lin_reg.predict(6.5) # Memprediksi hasil dengan regresi polynomial lin_reg_2.predict(poly_reg.fit_transform(6.5)) Penjelasan:
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.
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 (di mana = 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.
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).
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: Visualisasi regresi polinomial dengan orde=4Ternyata 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).
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:
Kolom Level2 adalah hasil pangkat 2 dari semua baris di kolom level. Level3 adalah hasil pangkat 3, dan Level4 adalah hasil pangkat 4.
Kita lihat bahwa semua variabel independen signifikan. Jika ditulis persamaannya, maka menjadi:
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.
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: 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. |