Regresi merupakan salah satu teknik untuk meramalkan data di masa yang akan datang.
Lebih mudahnya mari kita lihat kasus di mana perusahaan mendata pegawainya berdasarkan
berapa lama mereka bekerja dan berapa besar gaji mereka saat ini (dalam euro per tahun).
Ilustrasinya tampak pada tabel di bawah ini: Regresi merupakan salah satu teknik untuk
meramalkan data di masa yang akan datang. Lebih mudahnya mari kita lihat kasus di mana
perusahaan mendata pegawainya berdasarkan berapa lama mereka bekerja dan berapa besar
gaji mereka saat ini (dalam euro per tahun). Ilustrasinya tampak pada tabel di bawah ini:
Tabel di atas terdiri dari 2 kolom, yaitu ‘Tahun_bekerja’ dan ‘Gaji’, di mana data diurutkan dari
tahun bekerja kecil ke besar. Dapat dilihat bahwa semakin lama seseorang bekerja
kecenderungannya semakin tinggi pula gajinya. Namun terkadang tahun bekerja yang lama tidak
selalu bergaji lebih besar dari pegawai yang bekerja lebih singkat. Misal kita amati ada pekerja
yang bekerja selama 3.9 tahun bergaji 63K euro, sementara di atasnya pekerja bekerja selama 4.5
tahun bergaji 61K euro.
Pertanyaan yang muncul, apakah memang hubungan antara lama bekerja dengan besarnya gaji
adalah linear? Jika linear, seberapa kuat kelinearitasannya?
Regresi melalui salah satu tekniknya yaitu simple linear regression (SLR) menjawab pertanyaan
di atas. SLR mencari hubungan antara 1 variabel independen (lama bekerja) dengan 1 variabel
dependen. Jika variabel independennya lebih dari satu, maka namanya menjadi multiple linear
regression.
Formula dari SLR diberikan sebagai berikut:
Y adalah variabel dependen, dan X adalah variabel independen. B0 adalah intercept (konstanta),
dan B1 adalah slope (koefisien pengali), sementara epsilon adalah error dari sebuah model
regresi.
Hasil dari model regresi yang kita buat, kurang lebih akan tampak seperti berikut:
Garis merah merupakan model regresi yang terbentuk. Di mana ia menunjukkan tren positif yang
berarti naik ke atas ditunjukkan dengan slope (nilai B1 positif). Jika sebaliknya (tren negatif)
maka ia cenderung menurun ke bawah (B1 negatif).Lalu bagaimana sebuah model regresi
terbentuk? Metode yang sering digunakan adalah Ordinary Least Square, di mana sebuah model
akan membuat sebanyak mungkin garis linear kemudian menghitung selisih kuadrat antara data
sesungguhnya terhadap data prediksi model. Ilustrasinya sebagai berikut:
Garis merah merupakan model regresi yang terbentuk. Sementara data real yang kita miliki
adalah x, dan kita memiliki x sebanyak 9 buah. Data sesungguhnya ini kita notasikan sebagai Yi,
dan data prediksi adalah Yi topi. Selisih keduanya ditandai dengan garis putus-putus warna hijau.
Oleh karena itu metode ordinary least square didefinisikan sebagai berikut:
Model regresi akan membuat garis linear sebanyak mungkin, kemudian dari semua garis tersebut
dihitunglah nilai sum squares nya (formula di atas). Model yang memiliki nilai sum
squares terkecil merupakan model regresi terbaik yang dipilih.
Jika sudah memahami, mari kita belajar bagaimana mengimplementasikan regresi ke dalam
sebuah model machine learning.
Bahasa Python
Line ke 18 adalah proses di mana kita membuat model machine learning regresi. Artinya, model
kita sedang belajar untuk mencari hubungan antara X_train dan y_train.
Output di python akan tampak sebagai berikut Out[12]: LinearRegression(copy_X=True,
fit_intercept=True, n_jobs=1, normalize=False).
Setelah machine learning kita belajar mencari tahu hubungan antara X_train dan y_train, maka
langkah selanjutnya adalah kita mencoba membuat prediksi ke depan, di mana prediksi ini
menggunakan hubungan yang sudah dipelajari oleh model kita. Perintah untuk melakukan
prediksi ini dilakukan di line 21.
Jika sudah, mari kita bandingkan hasil y_pred dengan y_test, di mana y_pred adalah prediksi
model kita dan y_test adalah data yang sesungguhnya.
Hasil y_pred dan y_test
Untuk bisa membandingkan hasil antara y_pred dan y_test, akan sangat baik jika dibuat ilustrasi
visualnya. Perlu diperhatikan, agar menampilkan visual yang baik di python, maka block semua
line dari line 24 sampai line 29 kemudian klik CTRL+ENTER.
Line 24 membuat scatter plot X_train dan y_train dengan warna merah untuk
data poinnya. Tentu saja warnanya bisa dirubah sesuka hati.
Line 25 membuat line plot nya (garis regresi) dengan warna biru. metode plot()
membutuhkan parameter pertama yaitu data poin untuk sumbu x, dan parameter kedua
adalah data poin untuk sumbu y. Data poin sumbu x adalah X_train karena kita ingin
melihat model regresi dari training set, sementara data poin sumbu y adalah prediksi dari
X_train dengan perintah regressor.predict(X_train). Perlu diingat, data poin sumbu y
bukan y_predict atau regressor.predict(X_test), karena tujuan kita kali ini membuat plot
regresi untuk X_train, bukan X_test. Semisal Anda salah, menggunakan
regressor.predict(X_test), maka garis regresinya tidak akan muncul. Mengapa? Karena
jumlah data poin X_train (20 baris) dan X_test (10 baris) sudah berbeda, maka tidak
mungkin bisa dibuat garis regresinya.
Line 26 membuat judul yang akan ditampilkan di bagian paling atas grafik.
Line 27 membuat label untuk sumbu x.
Line 28 membuat label untuk sumbu y.
Line 29 mengeksekusi dan menampilkan hasil dari semua perintah dari line 24 sampai
line 28.
Line 32 sampai line 37 adalah perintah menampilkan grafik untuk test set. Perhatikan
bahwa di line 33 plot line nya masih menggunakan X_train dan bukan X_test, karena
model regresi kita berbasis pada training set. Walau demikian, sangat kebetulan sekali
seandainya Anda salah menggunakan perintah ini misalnya: plt.plot(X_test,
regressor.predict(X_test), color = ‘blue’), maka hasilnya akan sama. Namun, saya ulang
kembali Anda tetap perlu mengingat bahwa model regresinya adalah menggunakan
X_train dan bukan X_test.
Jika sudah, maka hasil dari test set akan seperti berikut:
Bahasa R
# Mengimpor dataset
dataset = read.csv('Daftar_gaji.csv')
# Feature Scaling
# training_set = scale(training_set)
# test_set = scale(test_set)
Hasil regresi
Sampai di sini Anda bisa melihat bagaimana model kita (bahasa python dan R) cukup baik
memprediksi gaji dengan menggunakan pembelajaran dari dataset X_train.
Untuk bisa memastikan seberapa akurat, maka perlu dilakukan uji statistik. Dalam hal ini R
memang didesain sebagai software statistik, maka pengujianya cukup menulis perintah summary
pada line 41.
Line 41 perintah melihat seberapa baik (fit) model regresi yang kita buat. Cukup menulis
summary(diikuti model regresinya)
Intercept merupakan koefisien yang dimiliki model regresi Anda. Artinya untuk setiap
nilai X nol (karyawan tanpa pengalaman bekerja di perusahaan ini), ia akan mendapatkan
gaji sebesar 25592 euro per tahun. Angka ini Anda bisa lihat di bagian Estimate dari
Intercept.
Kemudian pada bagian Tahun_bekerja nilai 9365 menyatakan bahwa untuk setiap
penambahan tahun bekerja sebanyak 1 tahun, gajinya akan bertambah sebesar 9365 euro
per tahun.
Jika Anda tulis persamaan regresinya maka dapat ditulis sebagai berikut:
Std.Error (standar error) adalah seberapa menyimpang data prediksi dari data
sesungguhnya. Semakin kecil std. error tentu semakin baik model kita.
t value adalah uji statistik dari distribusi t. Nilai t di atas 2 atau kurang dari -2 secara
umum sudah dianggap signifikan.
Pr adalah p value. Variabel independen kita (Tahun_bekerja) memiliki nilai p di bawah
0.05, artinya ia signifikan memprediksi variabel dependen (Gaji).
Untuk melihat seberapa baik, maka lihat bagian Multiple R-squared yang merupakan nilai
, yang nilainya berkisar dari 0 sampai 1. Nilai nol (0), artinya error (jarak antara nilai
prediksi dengan nilai yang sebenarnya) terlalu besar, sehingga modelnya sangat buruk.
Sebaliknya jika nilainya 1 adalah model yang sempurna, artinya prediksinya benar-benar
tanpa error.
Pastilah tidak mungkin model regresi memiliki nilai 1, karena jika demikian maka model kita
terlalu sempurna (ada yang salah, atau tidak beres). Model kita memiliki nilai 0.96 tentunya
modelnya sangatlah baik (karena ini hanya data contoh untuk mempermudah).
Jika Anda melakukan pendekatan regresi, kemudian nilai sangat buruk, misal kurang dari 0.5
atau mendekati nol, maka bisa dipastikan hubungan variabel dependen dan independen tidaklah
linear. Jika demikian, Anda bisa melakukan fitting (melihat hubungan variabel dependen dengan
independen) dengan model regresi non linear, klasifikasi, dan lain sebagainya.
Sampai di sini saya berharap Anda bisa membuat model ML (Machine learning) Anda sendiri.
Multiple Linear Regression
Sebelumnya kita sudah bersama-sama belajar tentang simple linear regression (SLR), kali
ini kita belajar yang sedikit lebih advanced yaitu multiple linearregression (MLR). Apa
perbedaannya? Pada pembahasan SLR, kita memiliki satu variabel dependen (gaji yang diterima
per tahun), dan satu variabel independen (lamanya bekerja). Jika kita ingin mengetahui pengaruh
variabel dependen (output) terhadap lebih dari satu variabel independen (data input, atau
disebut juga dengan prediktor), maka kita harus menggunakan MLR.
Persamaan SLR:
di mana y adalah variabel dependen, a0 adalah konstanta, a1 adalah koefisien untuk x1,
dan x1 adalah variabel independen.
Persamaan MLR:
di mana MLR memiliki fungsi yang mirip dengan SLR namun memiliki variabel independen
sebanyak n
Misal, dalam pembelajaran kali ini ada dataset keuntungan yang dimiliki oleh 50 perusahaan baru
yang berada di US. Kita ingin melihat apakah ada hubungan keuntungan yang didapat (profit)
terhadap pengeluaran-pengeluaran dan wilayah domisili perusahaan-perusahaan ini. Ada 4
variabel independen yang kita miliki yaitu data pengeluaran R & D (riset dan development), data
pengeluaran marketing, data pengeluaran administrasi (seperti gaji, tagihan, dan lain-lain), dan
wilayah di mana 50 perusahaan ini berada. Karena ada lebih dari 1 variabel independen, maka
kita harus menggunakan multiple linear regression. Kita juga penasaran, dari 4 variabel
independen ini mana yang memiliki kontribusi terbesar terhadap profit. Jika kita sudah
mengetahui variabel independen mana yang memiliki kontribusi terbesar terhadap profit, maka
kita juga bisa mengambil keputusan untuk memprioritaskan investasi dan fokus kita di variabel-
variabel independen ini. Tentunya masih banyak lagi keputusan-keputusan yang bisa diambil
dari model regresi kita kali ini.
Perlu diperhatikan, bahwa saat kita menggunakan MLR, kita dari awal sudah mengasumsikan
bahwa hubungan keempat variabel independen terhadap variabel dependen adalah linear. Tentu
saja, kenyataannya hubungan yang kita temukan setelah mengevaluasi model kita nanti bisa saja
tidak linear. Dan jika hal ini terjadi, maka model MLR tidak cocok untuk mencari hubungan
ketiganya. Tenang saja, untuk contoh kali ini, datanya sudah disesuaikan, sehingga ada hubungan
linear antara variabel dependen dan independen.
Hal lain yang perlu diperhatikan adalah dalam membuat model linear regresi (simple atau multi),
maka variabel dependen harus memenuhi beberapa asumsi lainnya. Di mana jika asumsi ini tidak
terpenuhi maka model kita dinyatakan tidak cukup baik. Asumsi-asumsi tersebut antara lain:
Linearity
Homoscedasticity
Multivariate normality
Independence of errors
Lack of multicollinearity
Walau demikian, kita tidak akan membahas asumsi-asumsi di atas (akan di bahas di topik
lainnya). Untuk mempermudah, kita asumsikan bahwa semua asumsi tersebut terpenuhi.
Baik, mari kita mulai membangun model machine learning MLR kita. Langkah pertama, Anda
harus mendownload datasetnya di link ini.
Mari kita mulai dengan mendata variabel apa saja yang kita miliki.
Semua satuan untuk variabel independen 1 sampai 4 dan variabel dependen adalah dalam dollar
($) per tahun.
Pada jenis data variabel yang dimiliki, kita melihat bahwa variabel independen 4 tidak memiliki
jenis data numerik. Padahal model regresi (simple atau multi) adalah model di mana semua
datanya haruslah numerik. Lalu apa yang harus dilakukan?
Untuk mensiasati ini, maka kita perlu membuat dummy variable. Dummy variable adalah
konversi data kategori ke bentuk numerik yang terdiri dari dua nilai yaitu 0 dan 1. Ilustrasi dari
dummy variabel ini bisa dilihat pada tabel di bawah ini:
Bisa Anda lihat, bahwa kita merubah data kategori menjadi boolean (True or False). Nilainya
bernilai True (1) jika datanya sama. Misal, baris pertama New York bernilai satu untuk kolom
New York, namun FALSE (0) untuk California dan Florida. Begitu seterusnya sampai baris-baris
lainnya. Namun perlu diingat, jika kita memiliki 3 kategori seperti contoh di atas, maka total
dummy variabel yang dibutuhkan adalah n-1 , dalam hal ini 3-1 = 2 dummy variabel. Hal ini
dilakukan untuk menghindari jebakan dummy variabel (dummy variable trap).
Kira-kira funsgi multiple regresinya akan tampak sebagai berikut:
Tips: Saat membuang salah satu dummy variabel, tidak ada aturan apakah harus dummy variabel
pertama, kedua atau ketiga, sehingga pilihan bebas terserah Anda. Walau demikian, pada contoh
formula di atas, kita membuang dummy variabel ketiga (Wilayah3).
Mari sekarang kita buat modelnya step-by-step dilengkapi penjelasannya.
Bahasa Python
Penjelasan:
Hasil transformasi dataset menjadi 2 dummy variabel akan tampak sebagai berikut:
Line 23 mengimpor class dan sublibrary yang diperlukan untuk membagi dataset ke train
set dan test set.
Line 24 membagi data 20% ke test set dan 80% ke train set.
Line 27 mengimpor class LinearRegression untuk membuat model regresi.
Line 28 mempersiapkan objek regressor sebagai model regresi kita nantinya.
Line 29 membuat model regresi dari dataset X_train dan y_train.
Line 32 memprediksi hasil test set, di mana kita ingin membandingkan nilai y_pred
dengan y_test nantinya.
Bisa dilihat bahwa model kita cukup baik memprediksi nilai profit 50 perusahaan ini. Terlihat
dari selisih yang tidak terlalu besar untuk setiap barisnya antara y_pred dan y_test. Walau
demikian, tentunya tidak cukup jika menilai baik tidaknya hanya membandingkan secara visual
saja. Kita memerlukan cara kuantitatif dengan menggunakan statistik.
Oleh karena itu, untuk menguji apakah model ini sudah baik, dan variabel independen mana saja
yang signifikan atau tidak, kita melakukan metoda backpropagation atau backward propagation.
Metode ini memulai dengan memasukkan semua variabel independen, kemudian melucuti satu
per satu variabel independen yang tidak signifikan sampai ditemukan model yang terbaik
(converged). Bagaimana memilih variabel independen yang dilucuti? Adalah variabel independen
yang p value nya di atas 0.05. Kemudian kita uji lagi, jika ada variabel independen yang p value nya
di atas 0.05 kita buang lagi. Begitu seterusnya sampai converged.
Di situ kita memiliki konstanta di mana ia juga sebenarnya dikalikan dengan variabel dengan
nilai 1. Library statsmodels tidak mempertimbangkan hal ini. Sementara library
LinearRegression di line 27 sudah mempertimbangan variabel . Oleh karena itu line 36 adalah
memberikan tambahan kolom baru di objek X dengan nilai 1.
Jika dilihat objek X yang baru akan tampak sebagai berikut:
Kita lihat di kolom paling kiri merupakan nilai yang semua barisnya adalah 1.
1
# STYLE 1
2 regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
3 regressor_OLS.summary()
4
5 # STYLE 2
6 regressor_OLS = sm.OLS(endog = y, exog = X_opt)
hasil = regressor_OLS.fit()
7
hasil.summary()
8
Jika Anda eksekusi line 40, hasilnya akan tampak sebagai berikut:
Setelah dilihat maka variabel independen dengan p value terbesar harus dibuang. Maka kita
membuang x2.
Jika Anda eksekusi terus dari line 41 sampai line 52 maka variabel independen yang tersisa
adalah variabel R&D dengan tampilan sebagai berikut:
Dengan demikian kita bisa menuliskan fungsi multiple regresinya sebagai berikut:
Jika dirasa proses backpropagation ini terlalu melelahkan karena harus manual satu persatu
mengeluarkan variabel independen yang tidak signifikan, maka Anda bisa melakukannya secara
otomatis dengan beberapa lines yang sudah saya siapkan di bawah ini:
1
2
import statsmodels.api as sm
3
def backwardElimination(x, sl):
4 numVars = len(x[0])
5 for i in range(0, numVars):
6 regressor_OLS = sm.OLS(y, x).fit()
7 maxVar = max(regressor_OLS.pvalues).astype(float)
if maxVar > sl:
8
for j in range(0, numVars - i):
9 if (regressor_OLS.pvalues[j].astype(float) == maxVar):
10 x = np.delete(x, j, 1)
11 regressor_OLS.summary()
12 return x
SL = 0.05
13
X_opt = X[:, [0, 1, 2, 3, 4, 5]]
14 X_Modeled = backwardElimination(X_opt, SL)
15
16
Bahasa R
1 # Mengimpor dataset
dataset = read.csv('50_Startups.csv')
2
3
# Encode categorical data
4 dataset$Wilayah = factor(dataset$Wilayah,
5 levels = c('New York', 'California', 'Florida'),
6 labels = c(1, 2, 3))
7
8 # Membagi data ke Training set and Test set
# install.packages('caTools')
9
library(caTools)
10 set.seed(123)
11 split = sample.split(dataset$Profit, SplitRatio = 0.8)
12 training_set = subset(dataset, split == TRUE)
13 test_set = subset(dataset, split == FALSE)
14
# Membangun model Multiple Linear Regression dari Training set
15 regressor = lm(Profit ~ R.D + Administrasi + Marketing + Wilayah, data = training_set)
16 # Alternatif penulisan
17 regressor2 = lm(Profit ~ ., data = training_set)
18
19 # Memprediksi hasil Test set
20 y_pred = predict(regressor, newdata = test_set)
21
# Membandingkan y_pred dengan y_test
22 perbandingan = data.frame(y_pred,test_set$Profit)
23
24 # Membangun model terbaik menggunakan menggunakan metode Backward Elimination
25 regressor = lm(formula = Profit ~ R.D + Administrasi + Marketing + Wilayah, data = dataset)
26 summary(regressor)
27 regressor = lm(formula = Profit ~ R.D + Administrasi + Marketing + factor(Wilayah,
exclude = 2), data = dataset)
28 summary(regressor)
29 regressor = lm(formula = Profit ~ R.D + Administrasi + Marketing, data = dataset)
30 summary(regressor)
31 regressor = lm(formula = Profit ~ R.D + Administrasi + Marketing, data = dataset)
32 summary(regressor)
regressor = lm(formula = Profit ~ R.D, data = dataset)
33 summary(regressor)
Penjelasan:
Line 22 adalah cara lain menuliskan fungsi regresi dalam R. Daripada menuliskan satu
demi satu variabel independen, Anda bisa cukup menuliskan titik (.) setelah tanda ~.
Line 25 adalah memprediksi hasil y_pred melalui pembelajaran train_set. Nantinya kita
akan bandingkan y_pred dengan y_test.
Line 28 membuat data frame gabungan antara y_pred dengan kolom profit dari test_set.
Perbandingannya tampaksebagai berikut:
Secara visual, prediksi kita terhadap y_test cukup baik. Walau demikian, kita harus menentukan
model terbaik kita secara statistik (kuantitatif).
Line 31 sekilas sama dengan line 18, namun berbeda. Kali ini kita menggunakan dataset
awal, karena ingin mencari model terbaik. Kita sudah tidak tertarik lagi membangun
hubungan antara X_train dan y_train.
Line 32 memberikan ringkasan statistik dari line 31. Hasilnya tampak sebagai berikut:
Karena variabel wilayah2 memiliki p value terbesar, maka wilayah2 kita buang.
Line 33 kita membuang wilayah2 dari perbandingan model. Perhatikan bagaimana cara
mengeluarkan wilayah2, yaitu dengan perintah factor(Wilayah, exclude = 2)
Line 35 sampai terakhir didapat bahwa variabel independen yang tersisa adalah R.D,
sehingga hasilnya nampak sebagai berikut:
Jika kita tulis fungsi regresinya maka tampak sebagai berikut:
Fungsinya sama persis antara python dan R, sehingga Anda bisa memilih mana di antara
keduanya yang paling nyaman.
Jika Anda merasa metode backward propagation terlalu melelahkan, karena harus satu demi satu
kita mengeluarkan variabel independen yang tidak signifikan, maka saya siapkan script R di
bawah ini yang secara otomatis menyaring variabel independen yang tidak signifikan tersebut.
Sehingga hidup Anda terasa lebih mudah.
1
2 backwardElimination <- function(x, sl) {
3 numVars = length(x)
4 for (i in c(1:numVars)){
5 regressor = lm(formula = Profit ~ ., data = x)
maxVar = max(coef(summary(regressor))[c(2:numVars), "Pr(>|t|)"])
6 if (maxVar &gt; sl){
7 j = which(coef(summary(regressor))[c(2:numVars), "Pr(>|t|)"] == maxVar)
8 x = x[, -j]
9 }
10 numVars = numVars - 1
}
11 return(summary(regressor))
12 }
13
14 SL = 0.05
15 dataset = dataset[, c(1,2,3,4,5)]
16 backwardElimination(training_set, SL)
17
Tampilan script backward elimination secara otomatis di R
Perlu diingat! Kebetulan model multiple regresi kita hanya menyisakan 1 variabel independen
(yaitu R&D), ini hanyalah kebetulan saja. Bisa jadi untuk kasus lain, semua variabel independen
menjadi signifikan, atau bisa jadi hanya tersisa dua, tiga dan seterusnya.
Kesimpulan apa yang bisa diambil?
Sampai di sini kita bisa mengerti bahwa profit 50 perusahaan sangat ditentukan oleh biaya R&D
nya, sehingga semakin banyak sebuah perusahaan berinvestasi di biaya pengembangan ini, maka
semakin tinggi profitnya. Selian itu kita juga mengetahui bahwa biaya marketing, administrasi
dan jenis wilayah tidak berdampak signifikan terhadap profit perusahaan.
Apakah hasil ini valid (sesuai) bagi semua perusahaan (perusahaan lain di luar 50 perusahaan
ini)? Tentu saja tidak, karena model ini dibangun berdasarkan data 50 perusahaan yang kita
miliki. Tapi setidaknya hasil dari model regresi ini bisa menjadi senjata untuk membuat strategi
tentang bagaimana cara meningkatkan profit ke depannya.
Saya harap Anda bisa membuat model multiple regresi machine learning Anda sendiri. Anda bisa
mengaplikasikannya untuk berbagai persoalan real. Misal, apakah ada hubungan antara nilai
ujian dengan usia pelajar, jenis kelamin, lama belajar, uang bulanan dari orang tua, uang spp yang
dibayarkan, dan faktor-faktor lainnya.
Multiple regresi juga bisa diaplikasikan untuk data biologis seperti data pertumbuhan tanaman,
data DNA, data medis, data eskerimen dan masih banyak lagi. Anda bisa memasukkan banyak
variabel independen yang Anda duga berpengaruh terhadap variabel dependen Anda.
Machine Learning: Polynomial
Regression
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.
Secara visual, maka perbedaanya sebagai berikut:
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 bagian dari kelompok 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 download dulu datasetnya .
Bahasa Python
1 # Mengimpor library
import numpy as np
2
import matplotlib.pyplot as plt
3 import pandas as pd
4
5 # Mengimpor dataset
6 dataset = pd.read_csv('Posisi_gaji.csv')
7 X = dataset.iloc[:, 1:2].values
y = dataset.iloc[:, 2].values
8
9
# Fitting Linear Regression ke dataset
10 from sklearn.linear_model import LinearRegression
11 lin_reg = LinearRegression()
12 lin_reg.fit(X, y)
13
14 # Fitting Polynomial Regression ke dataset
from sklearn.preprocessing import PolynomialFeatures
15
poly_reg = PolynomialFeatures(degree = 2) ## nantinya degree diganti menjadi 4
16 X_poly = poly_reg.fit_transform(X)
17 lin_reg_2 = LinearRegression()
18 lin_reg_2.fit(X_poly, y)
19
20 # Visualisasi hasil regresi sederhana
plt.scatter(X, y, color = 'red')
21 plt.plot(X, lin_reg.predict(X), color = 'blue')
22 plt.title('Sesuai atau tidak (Linear Regression)')
23 plt.xlabel('Level posisi')
24 plt.ylabel('Gaji')
25 plt.show()
26
# Visualisasi hasil regresi polynomial
27 plt.scatter(X, y, color = 'red')
28 plt.plot(X, lin_reg_2.predict(X_poly), color = 'blue')
29 plt.title('Sesuai atau tidak (Polynomial Regression)')
30 plt.xlabel('Level posisi')
31 plt.ylabel('Gaji')
plt.show()
32
33 # Memprediksi hasil dengan regresi sederhana
34 lin_reg.predict(6.5)
35
36 # Memprediksi hasil dengan regresi polynomial
37 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.
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 (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.
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.
1
2
3
4 # Mengimpor dataset
dataset = read.csv('Posisi_gaji.csv')
5
dataset = dataset[2:3]
6
7 # Membuat model regresi sederhana
8 lin_reg = lm(Gaji ~ ., data = dataset)
9
10 # Membuat model regresi polinomial
11 dataset$Level2 = dataset$Level^2
dataset$Level3 = dataset$Level^3
12
dataset$Level4 = dataset$Level^4
13 poly_reg = lm(Gaji ~ ., data = dataset)
14 summary(poly_reg)
15
16 # Visualisasi hasil regresi sederhana
17 # install.packages('ggplot2')
library(ggplot2)
18
ggplot() +
19 geom_point(aes(x = dataset$Level, y = dataset$Gaji), colour = 'red') +
20 geom_line(aes(x = dataset$Level, y = predict(lin_reg, newdata = dataset)), colour = 'blue') +
21 ggtitle('Sesuai atau tidak(Linear Regression)') +
22 xlab('Level') +
ylab('Gaji')
23
24
# Visualisasi hasil regresi polinomial
25 # install.packages('ggplot2')
26 ggplot() +
27 geom_point(aes(x = dataset$Level, y = dataset$Gaji), colour = 'red') +
28 geom_line(aes(x = dataset$Level, y = predict(poly_reg, newdata = dataset)), colour = 'blue') +
ggtitle('Sesuai atau tidak (Polynomial Regression)') +
29
xlab('Level') +
30 ylab('Gaji')
31
32 # Prediksi tingkat 6.5 dengan model regresi sederhana
33 predict(lin_reg, data.frame(Level = 6.5))
34
35 # Prediksi tingkat 6.5 dengan model regresi polinomial
predict(poly_reg, data.frame(Level = 6.5,
36
Level2 = 6.5^2,
37 Level3 = 6.5^3,
38 Level4 = 6.5^4))
39
40
41
Penjelasan:
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:
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:
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.
Kali ini kita akan belajar tentang model regresi lain yang disebut dengan SVR (Support
Vector Regression). Model regresi ini merupakan penggunaan dari metode machine learning yang
lain yaitu klasifikasi menggunakan SVM (Support vector machines). Model ini walaupun memiliki
nama regression di belakangnya, namun kita tidak melakukan regresi yang umum (di bahas di
materi-materi sebelumnya).
Informasi lengkap tentang pembahasan ini bisa melalui tautan ini, namun tentunya pembahasan
di link tersebut sangatlah akademis. Maka akan saya buat cara yang sangat sederhana sehingga
para pembaca bisa memahaminya dengan mudah.
Untuk lebih mudahnya mari kita melihat gambar di bawah ini:
Ilustrasi SVM
Melalui gambar di atas kita dapat melihat ada 3 garis sejajar diagonal dari kiri bawah menuju
kanan atas. Saya akan membaginya menjadi 3 garis:
Garis paling atas (garis putus-putus) adalah garis batas +, artinya garis ini merupakan
garis yang melewati/melalui poin (satu data poin) yang menjadi bagian dari kluster +.
Titik-titik (data points) ini sering disebut juga dengan istilah support vectors. Titik yang
dilewati garis ini adalah titik terluar dari kluster + sekaligus menjadi batas bagi kluster +.
Jarak antara garis ini dengan garis tengah haruslah tegak lurus (perpendicular).
Garis tengah adalah garis pembatas antara kedua zona (+ dan -), yang dalam SVM disebut
dengan istilah hyperplane atau separating plane/line. Garis ini memisahkan dua kluster,
yaitu klaster + dan -. Atau bisa saja kita sebut dengan kluster A dan B, 1 dan 2, dan
seterusnya (penamaan bebas, namun konvensi umum menggunakan + dan -).
Garis paling bawah (garis putus-putus) adalah garis batas -, artinya garis ini merupakan
garis yang memiliki melewati satu data poin yang menjadi bagian dari kluster -.
Penjelasannya sama dengan garis batas +.
Perlu diingat bahwa jarak antara garis paling atas dengan garis tengah, adalah sama dengan jarak
antara garis paling bawah dengan garis tengah. Jarak ini kita sebut dengan epsilon dengan
simbol ε.
Inti dari gambar di atas (kita bahas konsep SVM dulu secara umum agar mudah memahami SVR
nantinya), adalah bagaimana agar bisa membagi dua zona (dua kluster) dengan sebisa mungkin
memaksimalkan jarak epsilon (ε) nya, sehingga didapat sebuah pembagian yang paling optimal.
Pembagian optimal itu seperti apa? Adalah didapat dua zona yang semua data poin masuk ke
dalam salah satu dari dua zona ini, dengan tingkat kepastian yang presisi (jarak epsilon paling
besar).
Jadi bisa dipahami ya apa itu SVM.
Sebagai ringkasan, SVM adalah sebuah cara membagi sebuah dataset ke dalam 2 jenis dataset
dengan menggunakan sebuah hyperplane.
Lalu apa bedanya dengan SVR? Jika SVM itu tujuannya membagi dataset (klasifikasi) ke dalam 2
zona, maka SVR sebaliknya, yaitu bagaimana caranya agar semua dataset masuk ke dalam satu
zona, dengan tetap meminimasi nilai epsilon (ε).
SVM membagi menjadi dua, SVR memasukkan semuanya menjadi satu. Mudah dimengerti
ya sampai di sini.
Sebagai ilustrasi SVR, dapat dilihat melalui gambar di bawah ini:
Ilustrasi SVR
Gambar di atas menunjukkan sebuah hyperplane (garis diagonal di tengah) yang diapit oleh dua
garis batas + dan garis batas – (dijelaskan di atas). Kita juga melihat ada ε sebagai jarak
antara hyperplane dengan 2 garis batas tadi. Bisa dilihat ada beberapa datapoin yang dilingkari
yang menjadi potential support vectors. Artinya titik-titik (data points) ini merupakan data poin
yang bisa menjadi calon pembatas, sehingga semua data poin bisa masuk ke dalam satu kluster,
dengan tetap sebisa mungkin meminimasi nilai ε nya. Sehingga jika divisualisasikan,
garis hyperplane nya sebisa mungkin melewati semua titik-titik data (data points) tadi.
Gambarnya akan tampak seperti grafik regresi pada umunya.
Sekarang mari kita bahas langkah-langkah menggunakan SVR:
Barangkali ada sebagian yang melihat langkah-langkah di atas terlalu rumit, karena ada proses
kalkulasi yang melibatkan vektor. Selain itu ada juga istilah kernel, yang merupakan sebuah istilah
yang menjelaskan tentang cara merubah data dari dua dimensi menjadi multi dimensi. Ada
beberapa kernel yang populer dipakai di ML yaitu kernel linear, polinomial, radial basis
function atau gaussian, dan sigmoid. Tenang saja, tidak perlu mengerti semuanya saat ini. Semua
ini akan menjadi sangat mudah ketika mencobanya memecahkan sebuah contoh nyata.
STUDI KASUS
Kali ini kita akan melakukan sebuah prediksi regresi menggunakan SVR. Kasusnya sama persis
dengan kasus gaji di pembahasan regresi polinomial. Secara ringkas, perusahaan ingin mencari
tahu apakah calon pegawai jujur atau tidak tentang gaji yang ia sampaikan di perusahaan
sebelumnya tempat ia bekerja.
Perlu dicatat melalui pembahasan sebelumnya di regresi polinomial bahwa data kita bukanlah
linear!
Bahasa Python
1 # Mengimpor library
2 import numpy as np
3 import matplotlib.pyplot as plt
4 import pandas as pd
5
# Mengimpor dataset
6 dataset = pd.read_csv('Posisi_gaji.csv')
7 X = dataset.iloc[:, 1:2].values
8 y = dataset.iloc[:, 2:3].values
9
10 # Feature Scaling
11 from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
12 sc_y = StandardScaler()
13 X = sc_X.fit_transform(X)
14 y = sc_y.fit_transform(y)
15
16 # Fitting SVR ke dataset
17 from sklearn.svm import SVR
regressor = SVR(kernel = 'rbf')
18 regressor.fit(X, y)
19
20 # Visualisasi hasil SVR
21 plt.scatter(X, y, color = 'red')
22 plt.plot(X, regressor.predict(X), color = 'blue')
23 plt.title('Jujur atau tidak (SVR)')
plt.xlabel('Tingkat posisi')
24 plt.ylabel('Gaji')
25 plt.show()
26
27 # Memprediksi hasil
28 # y_pred = regressor.predict(6.5)
29 # y_pred = regressor.predict(sc_X.transform(6.5))
# y_pred = regressor.predict(sc_X.transform(np.array([[6.5]])))
30 y_pred = sc_y.inverse_transform(regressor.predict(sc_X.transform(np.array([[6.5]]))))
31
32 # Visualisasi hasi SVR (resolusi tinggi dan kurva yang lebih halus)
33 X_grid = np.arange(min(X), max(X), 0.01) # Pilih 0.01 dan bukan 0.1,
34 karena datanya sudah melalui feature scaling
35 X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(X, y, color = 'red')
36 plt.plot(X_grid, regressor.predict(X_grid), color = 'blue')
37 plt.title('Jujur atau tidak (SVR)')
38 plt.xlabel('Tingkat posisi')
39 plt.ylabel('Gaji')
4 plt.show()
Penjelasan:
Perlu juga diingat alasan mengapa kita membutuhkan FS. Library ML lainya seperti regresi linear
dan regresi polinomial sudah memiliki fitur FS di dalamnya, sehingga tidka perlu melakukan FS
lagi. Namun library SVM tidak memiliki fitur FS, sehingga kali ini kita perlu melakukan FS.
Model SVR
Sekilas grafik di atas tampak seperti grafik regresi polinomial, namun sebenarnya itu merupakan
hasil dari model SVR. Garis biru yang tampak merupakan hyperplane dari model kita, yang sbeisa
mungkin memasukkan semua datapoints ke dalam zona euclideannya.
Perlu dicermati bahwa sumbu x dan y-nya bukanlah nilai awal, karena sudah melalui hasil feature
scalingsebelumnya. Oleh karena itu, bisa dilihat bahwa FS sangat membantu visualisasi hasil
pemodelan SVR. Karena jika tidak maka sumbu y dan sumbu x tidak akan tampak hubungan yang
jelas yang disebabkan satuan x dan y terpaut jauh.
Selain itu, di gambar tersebut dapat dilihat titik merah paling kanan (posisi CEO) tidak terhubung
dengan hyperplane. Hal ini disebabkan karena hyperplane dari SVR menganggap titik tersebut
sebagai outlier karena jaraknya terhadap titik-titik (datapoints) yang lain terlalu jauh. Sehingga
tidak menjadi bagian dari kluster SVR.
Bahasa R
1 # Mengimpor dataset
dataset = read.csv('Posisi_gaji.csv')
2
dataset = dataset[2:3]
3
4 # Membuat model SVR
5 install.packages('e1071')
6 library(e1071)
7 regressor = svm(formula = Gaji ~ .,
data = dataset,
8
type = 'eps-regression',
9 kernel = 'radial')
10
11 # Memprediksi level ke 6.5
12 y_pred = predict(regressor, data.frame(Level = 6.5))
13
14 # Visualisasi SVR
# install.packages('ggplot2')
15 library(ggplot2)
16 ggplot() +
17 geom_point(aes(x = dataset$Level, y = dataset$Gaji),
18 colour = 'red') +
19 geom_line(aes(x = dataset$Level, y = predict(regressor, newdata = dataset)),
colour = 'blue') +
20 ggtitle('Jujur atau tidak (SVR)') +
21 xlab('Tingkat') +
22 ylab('Gaji')
Keputusan kedua adalah memilih data yang nilai X2 lebih kecil dari 170.
Langkah selanjutnya kita bagi lagi:
Keputusan ketiga adalah membagi data yang masuk ke dalam kriteria keputusan pertama dengan
kriteria nilai X2 lebih kecil dari 200.
Pembagian keempat adalah sebagai berikut:
Keputusan keempat adalah membagi data yang masuk ke dalam kriteria keputusan kedua dengan
kriteria nilai X1 lebih kecil dari 40.
Setelah membagi-bagi data ke dalam beberapa kelompok, kita sekarang sudah mendapatkan 5
grup (kelompok). Data points (titik-titik) dalam masing-masing kelompok memiliki nilai Y nya
sendiri-sendiri. Sekarang anggap saja data Y dari masing-masing kelompok kita cari nilai
rataannya, sehingga ilustrasinya seperti ini:
Sama dengan permasalahan regresi sebelumnya di bagian pembahasan regresi polinomial . Kali
ini ingin menilai apakah calon pegawai kita jujur atau tidak saat memberikan informasi gajinya
di perusahaan sebelumnya tempat ia bekerja.
Langsung saja kita bahas menggunakan bahasa Python dan R.
Untuk mengimpor datasetnya.
Bahasa Python
1
2
3 # Mengimpor library
import numpy as np
4
import matplotlib.pyplot as plt
5 import pandas as pd
6
7 # Mengimpor dataset
8 dataset = pd.read_csv('Posisi_gaji.csv')
9 X = dataset.iloc[:, 1:2].values
y = dataset.iloc[:, 2].values
10
11
# Membuat model regresi decision tree
12 from sklearn.tree import DecisionTreeRegressor
13 regressor = DecisionTreeRegressor(random_state = 0)
14 regressor.fit(X, y)
15
16 # Memprediksi hasil model
y_pred = regressor.predict([[6.5]])
17
18
# Visualisasi hasil regresi decision tree
19 X_grid = np.arange(min(X), max(X), 0.01)
20 X_grid = X_grid.reshape((len(X_grid), 1))
21 plt.scatter(X, y, color = 'red')
22 plt.plot(X_grid, regressor.predict(X_grid), color = 'blue')
plt.title('Sesuai atau tidak (Decision Tree Regression)')
23
plt.xlabel('Level Posisi')
24 plt.ylabel('Gaji')
25 plt.show()
26
27
Penjelasan:
1 # Mengimpor dataset
dataset = read.csv('Posisi_gaji.csv')
2
dataset = dataset[2:3]
3
4 # Membuat model regresi decision tree
5 install.packages('rpart')
6 library(rpart)
7 regressor = rpart(formula = Gaji ~ .,
data = dataset,
8
control = rpart.control(minsplit = 1))
9
10 # Memprediksi hasil model decision tree
11 y_pred = predict(regressor, data.frame(Level = 6.5))
12
13 # Visualisasi hasil model decision tree
14 # install.packages('ggplot2')
library(ggplot2)
15
x_grid = seq(min(dataset$Level), max(dataset$Level), 0.01)
16 ggplot() +
17 geom_point(aes(x = dataset$Level, y = dataset$Gaji),
18 colour = 'red') +
19 geom_line(aes(x = x_grid, y = predict(regressor, newdata = data.frame(Level = x_grid))),
colour = 'blue') +
20 ggtitle('Sesuai atau Tidak (Decision Tree Regression)') +
21 xlab('Level') +
22 ylab('Gaji')
23
Penjelasan:
Line 13 adalah memprediksi model regresi decision tree nya untuk level 6.5. Jika kita run,
maka hasilnya adalah 250.000 dollar/tahun. Mengapa berbeda dengan python? Dalam hal
ini, sepertinya library decision tree antara R dan Python memiliki parameter yang
berbeda, sehingga hasilnya juga berbeda. Bisa dibilang, regresi decision tree pada python
sedikit lebih akurat.
ine 16 menginstall library ggplot2 dengan menghilangkan tanda pagarnya.
Line 17 mengimpor library ggplot2.
Line 18-26 adalah perintah visualisasi model regresi decision tree nya. Jika dieksekusi
maka hasilnya tampak sebagai berikut:
Secara visual bisa dikatakan bahwa untuk penggunaan decision tree regression saya lebih
menyukai python. Namun bukan berarti R kurang akurat dalam memprediksi variabel dependen
dengan menggunakan decision tree. Bisa jadi untuk dataset (kasus lain) bisa saja R lebih akurat.
Demikian pembahasan regresi non linear dan non kontinu dengan menggunakan decision tree.
Semoga bermanfaat.
Machine Learning: Random Forest
Regression
Kali ini kita akan belajar tentang teknik regresi lagi,
yaitu Random Forest Regression (RFR). Jika diartikan ke dalam bahasa Indonesia artinya adalah
teknik regresi ala hutan acak, cukup unik namanya memang. Dari sini, mungkin pembaca bisa
menebak, bahwa teknik ini masih bersaudara dengan teknik Decision Tree, karena ada nama
hutan-nya (di mana hutan terdiri dari beberapa pohon). Walau agak aneh namanya jika
diterjemahkan ke bahasa Indonesia, tingkat prediksi teknik ini jangan diragukan.
Teknik RFR ini bisa diaplikasikan untuk dua hal: regresi dan klasifikasi. Namun untuk
pembahasan kali ini, kita bahas regresinya dulu.
Berikut langkah-langkah RFR:
1. Pilih beberapa data di training set sebanyak K buah (Jika datanya terlalu sedikit, misal
kurang dari 30, tidak perlu dibagi ke dalam training dan test set).
2. Buat Decision Tree-nya dari K data yang sudah dipilih sebelumnya.
3. Pilih jumlah N-tree (kumpulan pohon-pohon) yang ingin dibuat. Selanjutnya ulangi
langkah 1 dan 2. Intinya terus membuat decision tree regressionsebanyak-banyaknya
(umumnya sebanyak 200 kali, 300, 500, dst).
4. Untuk dataset yang baru, buat setiap N-tree memprediksi nilai Y untuk dataset yang baru
ini. Jika sudah, cari nilai rataan Y dari hasil prediksi N-treetadi. Misal, kita menghitung 500
prediksi nilai Y untuk dataset baru. Langkah selanjutnya, kita ambil nilai rataan Y dari 500
prediksi tadi.
Jadi alasan mengapa disebut random forest adalah karena kita melakukan penghitungan decision
tree beberapa kali (200, 300, 400, 500, dst) sehingga membentuk sebuah forest (hutan kecil).
Teknik ini memiliki tingkat akurasi cukup tinggi karena dia mengambil rataan (average) dari
sekian banyak prediksi. Dengan demikian, teknik ini bisa meminimumkan bias (error) nya.
Satu atau dua hasil prediksi yang salah memang buruk, namun jika hanya ada 2 prediksi salah
dari 500 prediksi, maka ia tidak akan menganggu nilai rataannya. Semakin banyak prediksi,
semakin baik hasil akurasi dan stabilitasnya. Namun ia akan banyak memakan waktu (waktu
komputasi bertambah).
Jika pembaca masih bingung tentang kosep random forest regression, saya coba pakai analogi lain.
Anggap kita memiliki toples yang berisi permen seperti berikut:
Toples permen
Pertanyaannya adalah, berapa banyak permen yang ada di dalam toples ini?
Logika random forest untuk menyelesaikan masalah di atas bukanlah dengan melihat toplesnya lalu
langsung menebak isinya. Jika kita melihat dan langsung menebak maka kemungkinannya 50:50 (50%
salah, 50% benar). Namun caranya adalah suruh orang lain menebaknya. Bisa dengan cara ia mencoba
melihat isinya, meraba isi toples dan lain-lain. Setiap tebakan yang ia ucapkan, maka kita tulis di
kertas.
Selanjutnya suruh orang lain menebak lagi. Setiap mereka mengucapkan tebakannya,tulis di kertas
lagi. Terus lakukan ini sampai kurang lebih 200 kali misalnya. Selanjutnya, langkah terakhir adalah
cukup menghitung rataan dari 200 tebakan yang sudah Anda catat. Secara statistik, maka semakin
banyak tebakan, semakin dekat Anda untuk memprediksi jumlah permen yang sesungguhnya. Mudah
bukan?
Selanjutnya kita akan mencoba mengaplikasikan konsep random forest regression untuk kasus nyata.
Kali ini kita coba memprediksi apakah dan melihat apakah calon pegawai kita jujur atau tidak saat
memberikan informasi gajinya di perusahaan sebelumnya tempat ia bekerja. Untuk membaca secara
detail permasalahannya silakan buka di bagian pembahasan regresi polinomial
Bahasa Python
Bahasa R
1
2
3 # Mengimpor dataset
4 dataset = read.csv('Posisi_gaji.csv')
dataset = dataset[2:3]
5
6 # Membuat model random forest regression
7 install.packages('randomForest')
8 library(randomForest)
9 set.seed(1234)
10 regressor = randomForest(x = dataset[1],
y = dataset$Gaji,
11 ntree = 500)
12
13 # Memprediksi hasil model regresi random forest
14 y_pred = predict(regressor, data.frame(Level = 6.5))
15
16 # Visualisasi hasil random forest regression
17 # install.packages('ggplot2')
library(ggplot2)
18 x_grid = seq(min(dataset$Level), max(dataset$Level), 0.01)
19 ggplot() +
20 geom_point(aes(x = dataset$Level, y = dataset$Gaji),
21 colour = 'red') +
22 geom_line(aes(x = x_grid, y = predict(regressor, newdata = data.frame(Level = x_grid))),
colour = 'blue') +
23 ggtitle('Sesuai atau tidak (Random Forest Regression)') +
24 xlab('Level') +
25 ylab('Gaji')
26
27
Penjelasan:
Line 14 memprediksi variabel dependen y dengan nilai X=6.5 melalui model yang sudah
dibuat di line 9. Hasil y_pred adalah 160.908 dollar per tahun. Masih baik, jika
dibandingkan decision tree sebelumnya yaitu 250.000 dollar per tahun.
Line 17 menginstall package ggplot2. Jika ingin menginstallnya cukup hilangkan tanda
pagar (#). Jika sudah terinstall, tidak perlu melakukan apa-apa.
Line 18 menjalankan package ggplot2.
Line 19-27 adalah perintah untuk visualisasi hasil modelnya. Jika dieksekusi maka
tampilannya tampak sebagai berikut:
Hasil random forest regression di R
Bisa dilihat bahwa anak tangga random forest regression lebih banyak jika dibandingkan dengan
hasil dari 1 decision tree pada pembahasan sebelumnya. Untuk ilustrasi perbandingan, berikut
grafik dari model 1 decision tree sebelumnya: