Algoritma Custom Classifier (tanpa nama)


Algoritma ini adalah salah satu algoritma yang digunakan untuk klasifikasi data. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.

Sebetulnya algoritma ini adalah algoritma buatan sendiri, sehingga tidak ada jurnal penelitian khusus untuk membahas algoritma ini. Itulah sebab mengapa algoritma ini disebut sebagai algoritma tanpa nama. Sistem klasifikasi data pada umumnya adalah pencarian nilai bobot / pencarian sejumlah aturan dari data yang sudah ada. Kemudian nilai tersebut akan diuji pada kumpulan data awal untuk mencari tingkat kebenaran. Setelah itu nilai bobot / aturan-aturan tersebut akan digunakan untuk menghitung data baru.

Algoritma ini menggunakan teknik dari beberapa algoritma lain yang sudah ada. Algoritma lain mengenai klasifikasi data secara keseluruhan adalah Algoritma Naive Bayes Inference Clustering dan Algoritma Winnow. Algoritma Naive Bayes Inference Clustering bekerja dengan cara mengelompokkan data sebagai penentu nilai output, sedangkan Algoritma Winnow menggunakan nilai bobot pada masing-masing kriteria untuk menentukan nilai output. Algoritma ini tidak menggunakan kedua teknik tersebut, tetapi menggunakan teknik pencarian aturan-aturan sebagai penentu nilai output, mirip seperti Algoritma AdaBoost (Adaptive Boosting). Pada akhirnya, nilai output tersebut akan digunakan untuk memprediksi semua nilai hasil pada data baru.



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:

Dim data(11)() As String
data(0) = New String() {44, "Laki-laki", 3.55, "Diterima"}
data(1) = New String() {52, "Perempuan", 4.71, "Diterima"}
data(2) = New String() {60, "Perempuan", 6.56, "Ditolak"}
data(3) = New String() {56, "Laki-laki", 6.8, "Ditolak"}
data(4) = New String() {51, "Laki-laki", 6.94, "Ditolak"}
data(5) = New String() {46, "Perempuan", 6.52, "Ditolak"}
data(6) = New String() {48, "Laki-laki", 4.25, "Diterima"}
data(7) = New String() {58, "Perempuan", 5.71, "Diterima"}



Selanjutnya ada 4 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 I47Perempuan6.05
Pelanggan J52Laki-Laki5
Pelanggan K48Perempuan4.5
Pelanggan L42Laki-Laki5.5

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

data(8) = New String() {47, "Perempuan", 6.05, ""}
data(9) = New String() {52, "Laki-laki", 5, ""}
data(10) = New String() {48, "Perempuan", 4.5, ""}
data(11) = New String() {42, "Laki-laki", 5.5, ""}

Langkah-langkah penggunaan algoritma ini adalah

1. Tentukan Pengelompokan untuk masing-masing kriteria
Jumlah pengelompokan bebas tergantung keinginan
Contoh dalam kasus ini:
Kriteria umur hanya dikelompokan menjadi 3 bagian yaitu untuk umur dibawah 40, 41 sampai dengan 50, diatas 50
Kriteria jenis kelamin dikelompokan menjadi 2 bagian yaitu untuk laki-laki dan perempuan
Kriteria skor kepribadian dikelompokan menjadi 4 bagian yaitu untuk skor dibawah 4, 4 sampai dengan 5, 5 sampai dengan 6, diatas 6
Kriteria hasil dikelompokan menjadi 2 bagian yaitu untuk kelompok Diterima dan Ditolak

Dim kriteria() As String = {"Umur", "JK", "Skor", "Hasil"}

Dim kelompokKriteria(kriteria.Length - 1)() As String
kelompokKriteria(0) = New String() {"Dibawah 40", "41 s/d 50", "Diatas 50"}
kelompokKriteria(1) = New String() {"Laki-laki", "Perempuan"}
kelompokKriteria(2) = New String() {"Dibawah 4", "4 s/d 5", "5 s/d 6", "Diatas 6"}
kelompokKriteria(3) = New String() {"Ditolak", "Diterima"}

2. Tentukan matriks data untuk data yang sudah mengalami pengelompokan data sesuai kriteria diatas

Dim baris As Integer = data.Length
Dim kolom As Integer = data(0).Length
Dim dataAwal(baris - 1)() As String
For i = 0 To baris - 1
	dataAwal(i) = New String(kolom - 1) {}
Next i

For i = 0 To data.Length - 1
	For j = 0 To data(i).Length - 1
		Dim v As String = ""

		For k = 0 To kelompokKriteria(j).Length - 1
			If j = 0 Then
				If data(i)(j) < 40 Then
					v = kelompokKriteria(j)(0)
				ElseIf data(i)(j) < 50 Then
					v = kelompokKriteria(j)(1)
				ElseIf data(i)(j) >= 50 Then
					v = kelompokKriteria(j)(2)
				End If

			ElseIf j = 1 Then
				If data(i)(j) = kelompokKriteria(j)(k) Then
					v = kelompokKriteria(j)(k)
				End If

			ElseIf j = 2 Then
				If data(i)(j) < 4 Then
					v = kelompokKriteria(j)(0)
				ElseIf data(i)(j) < 5 Then
					v = kelompokKriteria(j)(1)
				ElseIf data(i)(j) < 6 Then
					v = kelompokKriteria(j)(2)
				ElseIf data(i)(j) >= 6 Then
					v = kelompokKriteria(j)(3)
				End If

			ElseIf j = 3 Then
				If data(i)(j) = kelompokKriteria(j)(k) Then
					v = kelompokKriteria(j)(k)
				End If
			End If
		Next k

		dataAwal(i)(j) = v
	Next j
Next i

Dim contohData(7)() As String
For i = 0 To 7
	contohData(i) = New String(dataAwal(0).Length - 1) {}
	For j = 0 To dataAwal(0).Length - 1
		contohData(i)(j) = dataAwal(i)(j)
	Next
Next

Dim dataBaru(3)() As String
For i = 0 To 3
	dataBaru(i) = New String(dataAwal(0).Length - 1) {}
	For j = 0 To dataAwal(0).Length - 1
		dataBaru(i)(j) = dataAwal(i + 8)(j)
	Next
Next

3. Tentukan jumlah kondisi tiap aturan
DIasumsikan dalam kasus ini, jumlah kondisi tiap aturan ada 2
Artinya dalam setiap aturan akan terdapat 2 kriteria sebagai klausa sebab dan 1 kriteria hasil sebagai klausa akibat

Const jumlahKondisiTiapAturan As Integer = 2

4. Tentukan jumlah maksimum aturan yang dapat dibuat
DIasumsikan dalam kasus ini, jumlah maksimum aturan adalah 50 aturan

Const maksJumlahAturan As Integer = 50

5. Tentukan tingkat kebenaran minimal sebuah aturan terhadap semua data, agar aturan tersebut dapat termasuk dalam aturan yang valid
DIasumsikan dalam kasus ini, tingkat kebenaran minimal adalah 0.9
Artinya untuk setiap aturan yang valid harus memiliki kebenaran sebesar 90% dari semua data

Const persentaseKebenaran As Double = 0.7

6. Lakukan proses pembuatan aturan-aturan berdasarkan contoh data yang sudah tersedia
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan dibawah ini

Dim cc As New Classifier(jumlahKondisiTiapAturan, maksJumlahAturan)
cc.prosesPembuatanAturan(contohData, persentaseKebenaran)

Berikut adalah penjelasan pada fungsi prosesPembuatanAturan (poin 6a – 6b7)

6a. Tentukan semua kelompok kriteria pada semua data, simpan ke dalam variabel stringToInteger dengan tipe Dictionary

Dim jumlahBaris As Integer = contohData.Length
Dim jumlahKolom As Integer = contohData(0).Length

Me.stringToInteger = New Dictionary(Of String, Integer)(jumlahKolom - 1) {} '1 dictionary untuk setiap kriteria, termasuk kriteria hasil

For c As Integer = 0 To jumlahKolom - 1
	stringToInteger(c) = New Dictionary(Of String, Integer)
	Dim idx As Integer = 0
	For r As Integer = 0 To jumlahBaris - 1
		Dim s As String = contohData(r)(c)
		If stringToInteger(c).ContainsKey(s) = False Then
			stringToInteger(c).Add(s, idx)
			idx += 1
		End If
	Next r
Next c

6b. Tentukan aturan-aturan yang didapatkan dari semua data

6b1. Cari kriteria acak sebanyak parameter jumlahKondisiTiapAturan, dalam kasus ini bernilai 2

Dim maksPercobaanKriteriaAcak As Integer = (jumlahKolom - 1) * 2
Dim daftarKriteria() As Integer = Nothing
Dim hasil(jumlahKondisiTiapAturan - 1) As Integer

Dim percobaan As Integer = 0
Do While percobaan < maksPercobaanKriteriaAcak
	'6b1a. Cari kriteria sebanyak variabel maksPercobaanKriteriaAcak 
	'Kriteria acak yang terpilih bisa saja terpilih lebih dari sekali
	For i As Integer = 0 To jumlahKondisiTiapAturan - 1
		hasil(i) = rnd.Next(0, jumlahKolom - 1)
	Next i
	Array.Sort(hasil)

	'6b1b. Apabila ada kriteria yang dobel / muncul lebih dari 1 kali, maka ulangi percobaan ini
	'Jika tidak ada kriteria yang dobel, maka ambil nilainya sebagai jawaban kriteria acak
	'-----------
	Dim HasDups As Boolean = False
	For i As Integer = 0 To hasil.Length - 2
		If hasil(i) = hasil(i + 1) Then
			HasDups = True
			Exit For
		End If
	Next i

	If HasDups = False Then
		daftarKriteria = hasil
		Exit Do
	End If
	'-----------

	percobaan += 1
Loop

6b2. Apabila setelah perhitungan diatas, tidak ditemukan jawaban mengenai kriteria acak,
Maka lakukan pengambilan jawaban dengan cara pemilihan indeks secara acak dari kolom pertama sampai kolom ke variabel jumlahKolom

If daftarKriteria Is Nothing Then
	ReDim daftarKriteria(jumlahKondisiTiapAturan - 1)
	For i As Integer = 0 To jumlahKondisiTiapAturan - 1
		daftarKriteria(i) = i
	Next i

	For t As Integer = jumlahKondisiTiapAturan To (jumlahKolom - 1) - 1
		Dim m As Integer = rnd.Next(0, t + 1)
		If m < jumlahKondisiTiapAturan Then
			daftarKriteria(m) = t
		End If
	Next t
	Array.Sort(daftarKriteria)
End If

6b3. Susun calon aturan dengan cara memasukkan kriteria acak pada baris acak

For i As Integer = 0 To jumlahKondisiTiapAturan - 1
	Dim kriteriaI As Integer = daftarKriteria(i)
	Dim nilaiKriteriaI As String = contohData(barisAcak)(kriteriaI)
	Dim nilaiKelompokKriteriaI As Integer = Me.stringToInteger(kriteriaI)(nilaiKriteriaI)
	calonAturan(i * 2) = daftarKriteria(i)
	calonAturan(i * 2 + 1) = nilaiKelompokKriteriaI
Next i

6b4. Tambahkan nilai hasil pada calon aturan tersebut

Dim nilaiKriteriaHasil As String = contohData(barisAcak)(jumlahKolom - 1)
Dim indeksKriteriaHasil As Integer = stringToInteger(jumlahKolom - 1)(nilaiKriteriaHasil)
calonAturan(jumlahKondisiTiapAturan * 2) = indeksKriteriaHasil

6b5. Tentukan apakah calon aturan ini sudah termasuk dalam daftar sebelumnya?
Jika sudah ada, maka ulangi pencarian calon aturan yang lain

Dim isAturanSudahAda As Boolean = False
For i As Integer = 0 To daftarAturan.Count - 1
	Dim aturanTerpilih() As Integer = daftarAturan(i)

	Dim isAturanSama As Boolean = True
	For j As Integer = 0 To calonAturan.Length - 1
		If calonAturan(j) <> aturanTerpilih(j) Then
			isAturanSama = False
			Exit For
		End If
	Next j

	If isAturanSama Then
		isAturanSudahAda = True
		Exit For
	End If
Next i
If isAturanSudahAda Then Continue Do

6b6. Tentukan apakah calon aturan ini memenuhi syarat lebih dari xx% pada semua data

Dim tingkatKebenaranAturan As Double = 0

Dim jumlahBenar As Integer = 0
Dim jumlahSalah As Integer = 0
For i As Integer = 0 To jumlahBaris - 1
	If isAturanBerlaku(calonAturan, contohData(i)) = False Then Continue For

	Dim nilaiHasilPadaCalonAturan As Integer = calonAturan(calonAturan.Length - 1)
	Dim nilaiHasilPadaContohData As String = contohData(i)(jumlahKolom - 1)
	Dim Y As Integer = Me.stringToInteger(jumlahKolom - 1)(nilaiHasilPadaContohData)
	If nilaiHasilPadaCalonAturan = Y Then
		jumlahBenar += 1
	Else
		jumlahSalah += 1
	End If
Next i

If jumlahBenar + jumlahSalah <> 0 Then tingkatKebenaranAturan = (jumlahBenar * 1.0) / (jumlahBenar + jumlahSalah)
If tingkatKebenaranAturan < persentaseKebenaran Then Continue Do

6b7. Jika memenuhi syarat-syarat diatas, maka tambahkan calon aturan kedalam daftar aturan yang valid

Dim aturanBaru(calonAturan.Length - 1) As Integer
Array.Copy(calonAturan, aturanBaru, calonAturan.Length)

Me.daftarAturan.Add(aturanBaru)

7. Tentukan nilai output untuk masing-masing data baru berdasarkan aturan yang telah dibuat sebelumnya
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan dibawah ini

Dim Y As Integer = cc.hitungOutput(dataBaru(i), True)

* Gunakan fungsi ini untuk menghitung apakah sebuah data memiliki hasil Diterima atau Ditolak
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan dibawah ini

Public Function hitungOutput(ByVal data() As String, Optional ByVal catatAturan As Boolean = False) As Integer
	Dim jumlahDitolak As Integer = 0
	Dim jumlahDiterima As Integer = 0
	For i As Integer = 0 To daftarAturan.Count - 1
		Dim aturan() As Integer = daftarAturan(i)
		If isAturanBerlaku(aturan, data) = False Then Continue For

		If aturan(aturan.Length - 1) = 0 Then
			jumlahDiterima += 1
			If catatAturan Then Console.WriteLine("Termasuk dalam aturan [" & (i + 1).ToString.PadRight(2) & "] dengan hasil Diterima")
		Else
			jumlahDitolak += 1
			If catatAturan Then Console.WriteLine("Termasuk dalam aturan [" & (i + 1).ToString.PadRight(2) & "] dengan hasil Ditolak")
		End If
	Next i

	If jumlahDitolak > jumlahDiterima Then
		Return 0
	ElseIf jumlahDiterima > jumlahDitolak Then
		Return 1
	Else
		Return -1
	End If
End Function

* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah Class Classifier untuk menampung data seperti jumlah kondisi tiap aturan, maksimal jumlah aturan, dan aturan-aturan yang valid. Deklarasi Class Classifier adalah sebagai berikut:

Public Class Classifier
    Private jumlahKondisiTiapAturan As Integer                  'Berapa banyak kriteria yang diperlukan dalam membuat sebuah aturan
    Private maksJumlahAturan As Integer                         'Maksimal aturan yang dapat dibuat
    Public daftarAturan As List(Of Integer())                   'Sebagai contoh, [0 1 2 3 0] artinya jika kriteria3 bernilai 0 dan kriteria2 bernilai 3 maka hasilnya adalah 0
    Public stringToInteger() As Dictionary(Of String, Integer)  'Untuk menyimpan data dengan format (indeks kelompok kriteria dalam sebuah kriteria)(nilai kelompok kriteria tersebut)
    Private Shared rnd As Random

    Public Sub New(ByVal jumlahKondisiTiapAturan As Integer, ByVal maksJumlahAturan As Integer)
        Me.jumlahKondisiTiapAturan = jumlahKondisiTiapAturan
        Me.maksJumlahAturan = maksJumlahAturan
        daftarAturan = New List(Of Integer())()
        rnd = New Random(0)
    End Sub

	. . .
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd40

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 *