Regresi Logistik dengan teknik Gradient Descent


Regresi logistik / model logit, dalam statistika digunakan untuk prediksi probabilitas kejadian suatu peristiwa. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Algoritma ini adalah variasi lain dari Regresi logistik dengan teknik Newton-Raphson yang sudah pernah dibahas sebelumnya. Pada contoh sebelumnya, teknik pembelajaran yang digunakan adalah teknik Newton-Raphson. Sedangkan pada pembahasan kali ini, teknik Gradient Descent akan digunakan sebagai teknik pembelajaran.



Diasumsikan ada 8 data pelanggan yang sudah diketahui datanya, yaitu Pelanggan A,B,C,D,E,F,G,H
Masing-masing pelanggan memiliki kriteria, yaitu umur, jenis kelamin, skor kepribadian, dan memiliki nilai hasil yaitu Diterima / Ditolak
Diasumsikan 8 data tersebut adalah sebagai berikut:

PelangganUmurJenis KelaminSkor KepribadianHasil
Pelanggan A44Laki-laki3.55Diterima
Pelanggan B52Perempuan4.71Diterima
Pelanggan C60Perempuan6.56Ditolak
Pelanggan D56Laki-laki6.8Ditolak
Pelanggan E51Laki-laki6.94Ditolak
Pelanggan F46Perempuan6.52Ditolak
Pelanggan G48Laki-laki4.25Diterima
Pelanggan H58Perempuan5.71Diterima

Contoh data awal adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk kriteria Nilai Hasil:
Jika kondisi Diterima, maka inputan data kolom adalah 1
Jika kondisi Ditolak, maka inputan data kolom adalah 0

Dim data(9)() As Double
data(0) = New Double() {44, -1, 3.55, 1}
data(1) = New Double() {52, +1, 4.71, 1}
data(2) = New Double() {60, +1, 6.56, 0}
data(3) = New Double() {56, -1, 6.8 , 0}
data(4) = New Double() {51, -1, 6.94, 0}
data(5) = New Double() {46, +1, 6.52, 0}
data(6) = New Double() {48, -1, 4.25, 1}
data(7) = New Double() {58, +1, 5.71, 1}



Selanjutnya ada 2 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:

PelangganUmurJenis KelaminSkor Kepribadian
Pelanggan I47Perempuan6.05
Pelanggan J52Laki-Laki5

Contoh data baru adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah -1

data(8) = New Double() {47, +1, 6.05, -1}
data(9) = New Double() {52, -1, 5, -1}

Langkah-langkah penggunaan algoritma ini adalah

1. Lakukan normalisasi data untuk kriteria Umur dan Skor Kepribadian
Normalisasi data dihitung dengan rumus (data – (rata-rata kriteria tersebut)) / standar deviasi kriteria tersebut
Rata-rata adalah jumlah semua data dibagi dengan jumlah datanya
Standar deviasi adalah akar dari ((kuadrat dari (jumlah dari (data – rata-rata))) / jumlah data)
Penjelasan lebih lanjut dapat dilihat pada penjelasan skrip dibawah ini

Dim kolom() As Integer = {0, 2}
Dim jumlahBaris As Integer = data.Length
Dim jumlahKolom As Integer = data(0).Length

Dim hasil(1)() As Double ' [0] = rata-rata, [1] = standar deviasi
For i = 0 To 1
	hasil(i) = New Double(jumlahKolom - 1) {}
Next i

For c = 0 To jumlahKolom - 1
	'Hitung nilai rata-rata tiap-tiap kolom
	'yaitu dengan rumus: jumlah semua data dibagi dengan jumlah datanya
	Dim total As Double = 0.0
	For r = 0 To jumlahBaris - 1
		total += data(r)(c)
	Next r
	Dim rata2 As Double = total / jumlahBaris
	hasil(0)(c) = rata2

	'Hitung nilai standar deviasi tiap-tiap kolom
	'yaitu dengan rumus: akar dari ((kuadrat dari (jumlah dari (data - rata-rata))) / jumlah data)
	Dim totalKuadrat As Double = 0.0
	For r = 0 To jumlahBaris - 1
		totalKuadrat += (data(r)(c) - rata2) * (data(r)(c) - rata2)
	Next r
	Dim stdDev As Double = Math.Sqrt(totalKuadrat / jumlahBaris)
	hasil(1)(c) = stdDev
Next c

For c = 0 To kolom.Length - 1
	Dim j As Integer = kolom(c) ' kolom yang dinormalisasi
	Dim rata2 As Double = hasil(0)(j) ' nilai rata-rata untuk kolom tersebut
	Dim stdDev As Double = hasil(1)(j)
	For i = 0 To jumlahBaris - 1
		data(i)(j) = (data(i)(j) - rata2) / stdDev
	Next i
Next c

2. Tentukan jumlah perulangan / epoch yang digunakan untuk melakukan proses perhitungan
Diasumsikan dalam kasus ini, jumlah perulangan / epoch yang digunakan adalah 1000 kali

Const maksEpoch As Integer = 1000

3. Tentukan alpha, yaitu konstanta untuk nilai pembelajaran
Semakin tinggi nilai alpha, maka hasil perhitungan akan semakin akurat, dan sebaliknya
Diasumsikan dalam kasus ini, nilai alpha adalah 0.005

Const alpha As Double = 0.005

4. Lakukan proses perhitungan matriks bobot terbaik
Teknik yang digunakan dalam perhitungan ini adalah teknik Gradient Descent
Pada teknik ini, nantinya juga terdapat 2 macam perhitungan, yaitu perhitungan secara online (stochastic) atau offline (batch)
Perhitungan yang digunakan pada poin ini adalah perhitungan secara online (stochastic)
Penjelasan tentang fungsi tersebut beserta masing-masing teknik akan dibahas pada perhitungan dibawah (poin 4a dan 4b)

Dim bobotTerbaik() As Double = rl.ProsesPerhitungan(contohData, maksEpoch, alpha, 1) '1 = online, 2 = offline

* Pada fungsi prosesPerhitungan,
Lakukan proses pencarian bobot terbaik sebanyak jumlah perulangan
ada 2 teknik yang dapat digunakan untuk perhitungan nilai bobot ini, yaitu teknik online (stochastic) atau offline (batch)
Penjelasan untuk masing-masing teknik dapat dilihat pada skrip dibawah ini

4a. Skrip ini akan dijalankan jika menggunakan perhitungan dengan teknik online (stochastic)
Dinamakan teknik online karena perhitungan nilai bobot dilakukan langsung pada saat data diproses

4a1. Pada setiap kali perulangan, lakukan pengacakan urutan data
Sehingga perhitungan data tidak dimulai dari indeks terendah sampai ke indeks tertinggi

For j = 0 To urutanData.Length - 1
	Dim r As Integer = rnd.Next(j, urutanData.Length)
	Dim tmp As Integer = urutanData(r)
	urutanData(r) = urutanData(j)
	urutanData(j) = tmp
Next j

4a2. Untuk setiap data dengan urutan yang sudah diacak,
Hitung nilai gradient untuk bobot pada indeks pertama (b0)
Tambahkan nilai gradient ini kedalam matriks bobot b0 dengan rumus alpha * gradient
Kemudian,
Hitung nilai gradient untuk bobot pada indeks ke i (1,2,3,…) untuk masing-masing kolom kriteria ke i (1,2,3,…)
Tambahkan nilai gradient ini pada masing-masing kolom matriks bobot indeks ke i dengan rumus alpha * gradient

Dim nilaiGradient As Double = 0

For ti = 0 To contohData.Length - 1
	Dim i As Integer = urutanData(ti)
	Dim hasilPerhitungan As Double = hitungNilaiOutput(contohData(i), bobot)
	Dim indeksKolomHasil As Integer = contohData(i).Length - 1
	Dim hasilData As Double = contohData(i)(indeksKolomHasil)

	'Hitung nilai gradient untuk bobot pada indeks pertama (b0)
	'Tambahkan nilai gradient ini kedalam matriks bobot b0 dengan rumus alpha * nilaiGradient
	nilaiGradient = (hasilData - hasilPerhitungan) * 1
	bobot(0) += alpha * nilaiGradient

	'Hitung nilai gradient untuk bobot pada indeks ke i (1,2,3,...) untuk masing-masing kolom kriteria ke i (1,2,3,...)
	'Tambahkan nilai gradient ini pada masing-masing kolom matriks bobot indeks ke i dengan rumus alpha * nilaiGradient
	For j = 1 To bobot.Length - 1
		nilaiGradient = (hasilData - hasilPerhitungan) * contohData(i)(j - 1)
		bobot(j) += alpha * nilaiGradient
	Next j
Next ti

4b. Skrip ini akan dijalankan jika menggunakan perhitungan dengan teknik offline (batch)
Dinamakan teknik offline karena perhitungan nilai bobot dilakukan setelah jumlah nilai gradient pada semua data telah didapatkan
Karena semua data akan diproses, maka pengambilan data tidak perlu dilakukan secara acak

4b1 Lakukan perulangan pada setiap data,
Hitung nilai gradient untuk bobot pada indeks pertama (b0)
Kemudian hitung nilai gradient untuk bobot pada indeks ke i (1,2,3,…) untuk masing-masing kolom kriteria ke i (1,2,3,…)

Dim jumlahNilaiGradient(bobot.Length - 1) As Double

For i As Integer = 0 To contohData.Length - 1
	Dim hasilPerhitungan As Double = hitungNilaiOutput(contohData(i), bobot)
	Dim indeksKolomHasil As Integer = contohData(i).Length - 1
	Dim hasilData As Double = contohData(i)(indeksKolomHasil)

	'Hitung nilai gradient untuk bobot pada indeks pertama (b0)
	jumlahNilaiGradient(0) += (hasilData - hasilPerhitungan) * 1

	'Hitung nilai gradient untuk bobot pada indeks ke i (1,2,3,...) untuk masing-masing kolom kriteria ke i (1,2,3,...)
	For j As Integer = 1 To bobot.Length - 1
		jumlahNilaiGradient(j) += (hasilData - hasilPerhitungan) * contohData(i)(j - 1)
	Next j
Next i

4b2. Setelah semua nilai gradient dihitung,
Tambahkan nilai gradient ini pada masing-masing kolom matriks bobot dengan rumus alpha * jumlahNilaiGradient

For j As Integer = 0 To bobot.Length - 1
	bobot(j) += alpha * jumlahNilaiGradient(j)
Next j

5. Lakukan perhitungan dari masing-masing data awal menggunakan matriks bobot yang sudah ditemukan

Dim output As Double = rl.hitungNilaiOutput(contohData(i), bobotTerbaik)

* Gunakan fungsi ini untuk menghitung nilai output
nilai output dihitung dengan rumus:
Pertama, tentukan nilai z, yaitu z = b0 + b1(x1) + b2(x2) + b3(x3)
Kemudian tentukan nilai akhir, yaitu Y = 1.0 / (1.0 + e^-z)
Penjelasan mengenai langkah-langkah perhitungan dapat dilihat pada keterangan skrip dibawah ini

Public Function hitungNilaiOutput(ByVal dataItem() As Double, ByVal bobot() As Double) As Double
	Dim z As Double = bobot(0) 'b0 adalah konstanta

	For i = 0 To bobot.Length - 2
		z += (bobot(i + 1) * dataItem(i))
	Next i
	Return 1.0 / (1.0 + Math.Exp(-z))
End Function

6. Jika nilai output bernilai kurang dari 0.5 maka pelanggan tersebut memiliki nilai hasil Ditolak
Jika nilai output bernilai lebih dari 0.5 maka pelanggan tersebut memiliki nilai hasil Diterima

If output <= 0.5 Then
	Console.Write("-> Ditolak ")
Else
	Console.Write("-> Diterima")
End If

7. Catat tingkat kecocokan perhitungan data dengan hasil awal pada data
Langkah ini tidak wajib, hanya untuk mengetahui seberapa besar tingkat kecocokan perhitungan untuk data baru yang akan dihitung selanjutnya

Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah)
Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F2"))

8. Lakukan perhitungan yang sama (poin 5 dan 6) untuk masing-masing data baru

For i As Integer = 0 To dataBaru.Length - 1
	Console.Write("Pelanggan " & Chr(i + 65 + 8) & "   ")

	Dim input(jumlahKolom - 2) As Double
	Array.Copy(dataBaru(i), input, jumlahKolom - 1)
	For j = 0 To input.Length - 1
		Console.Write(input(j).ToString("F2").PadRight(5) & " ")
	Next j
	Console.Write(" ")

	Dim output As Double = rl.hitungNilaiOutput(dataBaru(i), bobotTerbaik)
	Console.Write(output.ToString("F4") & " ")

	If output <= 0.5 Then
		Console.Write("-> Ditolak ")
	Else
		Console.Write("-> Diterima")
	End If
	Console.WriteLine("")
Next

9. Lakukan proses perhitungan pada poin 4 – 8, tetapi dengan menggunakan perhitungan kedua, yaitu perhitungan secara offline (batch)

* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class RegresiLogistikGD untuk menampung data seperti jumlah kriteria dan matriks bobot. Deklarasi Class Titik adalah sebagai berikut:

Public Class RegresiLogistikGD
    Private jumlahKriteria As Integer 'Jumlah kolom kriteria selain kriteria hasil
    Private bobot() As Double 'matriks bobot yang akan dicari, bobot dengan indeks 0 adalah konstanta, atau disebut b0, dan selanjutnya indeks ke i adalah bobot untuk kolom ke i
    Private rnd As Random

    Public Sub New(ByVal jumlahKriteria As Integer)
        Me.jumlahKriteria = jumlahKriteria
        Me.bobot = New Double(jumlahKriteria) {}
        Me.rnd = New Random(0)
    End Sub
	
	. . .
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd43

Pada hasil akhir perhitungan, dapat dilihat pada gambar bahwa baik perhitungan secara online (stochastic) maupun perhitungan secara offline (batch), hasil kedua perhitungan tersebut sangat mirip. Hanya terjadi sedikit seiisih perhitungan, namun hasil kesimpulan yang dihasilkan tetap sama.

Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *