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:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian | Hasil |
---|---|---|---|---|
Pelanggan A | 44 | Laki-laki | 3.55 | Diterima |
Pelanggan B | 52 | Perempuan | 4.71 | Diterima |
Pelanggan C | 60 | Perempuan | 6.56 | Ditolak |
Pelanggan D | 56 | Laki-laki | 6.8 | Ditolak |
Pelanggan E | 51 | Laki-laki | 6.94 | Ditolak |
Pelanggan F | 46 | Perempuan | 6.52 | Ditolak |
Pelanggan G | 48 | Laki-laki | 4.25 | Diterima |
Pelanggan H | 58 | Perempuan | 5.71 | Diterima |
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:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian |
---|---|---|---|
Pelanggan I | 47 | Perempuan | 6.05 |
Pelanggan J | 52 | Laki-Laki | 5 |
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)
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.