Multi Regresi Logistik


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 merupakan pengembangan dari Regresi Logistik dengan teknik Gradient Descent yang sudah pernah dibahas sebelumnya. Tujuan Regresi Logistik yang standar adalah untuk memprediksi sebuah nilai jawaban dari beberapa kriteria, dan nilai tersebut hanya dapat dikonversi menjadi salah satu dari 2 jawaban yang tersedia. Pada kasus sebelumnya, nilai jawaban ditampung ke dalam sebuah kriteria hasil, dan nilai tersebut dikonversi menjadi jawaban Diterima atau Ditolak.
Multi Regresi Logistik memungkinkan prediksi jawaban tidak hanya 1 kriteria hasil, melainkan 2 atau lebih kriteria hasil, mirip dengan nilai output pada algoritma jaringan seperti Algoritma JST (Jaringan Saraf Tiruan) / ANN (Artificial Neural Networks) dan Algoritma RBF (Radial Basis Function), sehingga dapat digunakan untuk menyelesaikan kasus yang membutuhkan nilai output lebih dari satu untuk menentukan jawaban.



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:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Jika kondisi Diterima, maka inputan data kolom adalah 1, 0
Jika kondisi Ditolak, maka inputan data kolom adalah 0, 1

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



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:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah -1

data(8) = New Double() {47, +1, 6.05, -1, -1}
data(9) = New Double() {52, -1, 5, -1, -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 100 kali

Const maksEpoch As Integer = 100

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.01

Const alpha As Double = 0.01

4. Tentukan konstanta untuk nilai penyusutan bobot
Nantinya, setelah perhitungan nilai bobot, nilai bobot akan dikurangi sebanyak nilai penyusutan ini untuk mencegah jawaban nilai bobot terlalu menyimpang dari jalur
Nilai ini bebas tergantung kebutuhan, sehingga silahkan mencoba sendiri nilai penyusutan terbaik dengan cara trial and error.
Diasumsikan dalam kasus ini, nilai penyusutan bobot adalah 0.1

Const penyusutanBobot As Double = 0.1

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

mrl.prosesPerhitungan(contohData, maksEpoch, alpha, penyusutanBobot)

5a. Pada setiap kali perulangan / epoch,
Lakukan perulangan pada setiap data,
Hitung jumlah nilai gradient bobot pada masing-masing kolom kriteria
Kemudian lakukan hal yang sama untuk menghitung jumlah nilai gradient bias pada masing-masing kolom kriteria

For j As Integer = 0 To jumlahKriteriaHasil - 1
	For i As Integer = 0 To jumlahKriteria - 1
		For r As Integer = 0 To contohData.Length - 1
			Dim hasilPerhitungan() As Double = hitungNilaiOutput(contohData(r))
			For k As Integer = 0 To jumlahKriteriaHasil - 1
				hasilData(k) = contohData(r)(jumlahKriteria + k)
			Next k
			jumlahGradientBobot(i)(j) += (hasilData(j) - hasilPerhitungan(j)) * contohData(r)(i)
		Next r
	Next i
Next j

For j As Integer = 0 To jumlahKriteriaHasil - 1
	For i As Integer = 0 To jumlahKriteria - 1
		For r As Integer = 0 To contohData.Length - 1
			Dim hasilPerhitungan() As Double = hitungNilaiOutput(contohData(r))
			For k As Integer = 0 To jumlahKriteriaHasil - 1
				hasilData(k) = contohData(r)(jumlahKriteria + k)
			Next k
			jumlahGradientBias(j) += (hasilData(j) - hasilPerhitungan(j)) * 1
		Next r
	Next i
Next j

5b. Setelah semua nilai gradient bobot dan bias dihitung,
Tambahkan nilai gradient ini pada masing-masing kolom matriks bobot dengan rumus alpha * jumlahNilaiGradientBobot
Kemudian kurangi nilai ini sesuai dengan konstanta penyusutanBobot yang sudah ditentukan sebelumnya
Lakukan hal yang sama untuk menghitung matriks nilai bias

For i As Integer = 0 To jumlahKriteria - 1
	For j As Integer = 0 To jumlahKriteriaHasil - 1
		bobot(i)(j) += alpha * jumlahGradientBobot(i)(j)
		bobot(i)(j) *= (1 - penyusutanBobot)
	Next j
Next i

For j As Integer = 0 To jumlahKriteriaHasil - 1
	bias(j) += alpha * jumlahGradientBias(j)
	bias(j) *= (1 - penyusutanBobot)
Next j

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

Dim output() As Double = mrl.hitungNilaiOutput(contohData(i))

* Gunakan fungsi ini untuk menghitung nilai output
nilai output dihitung dengan rumus:
Pertama, tentukan nilai z0, yaitu z0 = (bobot ke 0)(kolom kriteria ke 0) * x0 + (bobot ke 0)(kolom kriteria ke 1) * x1 + … + (bobot ke 0)(kolom kriteria ke n) * xn + (nilai bias ke 0)
Kemudian tentukan nilai akhir untuk z0, yaitu Y0 = 1.0 / (1.0 + e^-z0)
Ulangi langkah diatas untuk perhitungan Y1, Y2, … sampai ke Yn yaitu Y pada kolom kriteria ke n
Kemudian lakukan teknik Softmax untuk menyetarakan semua nilai bobot sehingga berjumlah 1
Penjelasan mengenai langkah-langkah perhitungan dapat dilihat pada keterangan skrip dibawah ini

Public Function hitungNilaiOutput(ByVal contohData() As Double) As Double()
	Dim hasil(jumlahKriteriaHasil - 1) As Double
	For j As Integer = 0 To jumlahKriteriaHasil - 1
		For i As Integer = 0 To jumlahKriteria - 1
			hasil(j) += contohData(i) * bobot(i)(j)
		Next i
		hasil(j) += bias(j)
	Next j

	For j As Integer = 0 To jumlahKriteriaHasil - 1
		hasil(j) = 1.0 / (1.0 + Math.Exp(-hasil(j)))
	Next j

	'Teknik Softmax
	'Semua nilai bobot akan dijumlah, kemudian setiap nilai bobot akan dibagi dengan jumlah tersebut
	'Sehingga, jumlah semua nilai bobot tersebut akan berjumlah 1
	Dim sum As Double = 0.0
	For j As Integer = 0 To jumlahKriteriaHasil - 1
		sum += hasil(j)
	Next j

	For j As Integer = 0 To jumlahKriteriaHasil - 1
		hasil(j) = hasil(j) / sum
	Next j

	Return hasil
End Function

7. Jika hasil kolom pertama lebih dari nilai kolom kedua, maka data baru tersebut termasuk dalam nilai hasil Diterima
Jika hasil kolom kedua lebih dari nilai kolom pertama, maka data baru tersebut termasuk dalam nilai hasil Ditolak

If output(0) > output(1) Then
	Console.WriteLine("Nilai kolom pertama lebih dari nilai kolom kedua, -> kelompok 1 (Diterima)")
ElseIf output(1) > output(0) Then
	Console.WriteLine("Nilai kolom kedua lebih dari nilai kolom pertama, -> kelompok 2 (Ditolak)")
End If

8. 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"))

9. Lakukan perhitungan yang sama (poin 6 dan 7) untuk masing-masing data baru

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

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

	If dataBaru(i)(jumlahKolom - 2) = 1 And dataBaru(i)(jumlahKolom - 1) = 0 Then
		Console.Write("Diterima ")
	ElseIf dataBaru(i)(jumlahKolom - 2) = 0 And dataBaru(i)(jumlahKolom - 1) = 1 Then
		Console.Write("Ditolak ")
	End If
	Console.WriteLine("")

	Console.Write("Hasil Perhitungan: " & vbTab)
	Dim output() As Double = mrl.hitungNilaiOutput(dataBaru(i))
	For j = 0 To output.Length - 1
		Console.Write(output(j).ToString("F2") & " ")
	Next j
	Console.WriteLine()

	If output(0) > output(1) Then
		Console.WriteLine("Nilai kolom pertama lebih dari nilai kolom kedua, -> kelompok 1 (Diterima)")
	ElseIf output(1) > output(0) Then
		Console.WriteLine("Nilai kolom kedua lebih dari nilai kolom pertama, -> kelompok 2 (Ditolak)")
	End If
	Console.WriteLine("")
Next

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

Public Class MultiRegresiLogistik
    Private jumlahKriteria As Integer       'Jumlah kolom kriteria selain kriteria hasil
    Private jumlahKriteriaHasil As Integer  'Jumlah kolom kriteria hasil
    Private bobot()() As Double             'Indeks pertama = kolom kriteria, indeks kedua = kolom kriteria hasil
    Private bias() As Double                'indeks pertama = kolom kriteria hasil

    Public Sub New(ByVal jumlahKriteria As Integer, ByVal jumlahKriteriaHasil As Integer)
        Me.jumlahKriteria = jumlahKriteria
        Me.jumlahKriteriaHasil = jumlahKriteriaHasil

        Dim bobot(jumlahKriteria - 1)() As Double
        For i As Integer = 0 To jumlahKriteria - 1
            bobot(i) = New Double(jumlahKriteriaHasil - 1) {}
        Next i
        Me.bobot = bobot

        Me.bias = New Double(jumlahKriteriaHasil - 1) {}
    End Sub
	
	. . .
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd44

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 *