Klasifikasi Data Implementasi Source Code .1 Preprocessing Data

4.1.1.2 Klasifikasi Data

Sebelum menjalankan algoritma c4.5, perlu dilakukan pembagian data menggunakan k-fold validation. Data penelitian akan dibagi menjadi data training dan data testing. Potongan source code k-fold validation ditampilkan sebagai berikut : Untuk melakukan klasifikasi, langkah pertama yang dilakukan adalah memanggil dataset dari proses preprocessing data yang telah disimpan dalam file dengan format .mat. Dalam membagi data dengan k- fold validation memisahkan data dengan label [n,m] = sizedataKlasifikasi; label = dataKlasifikasi:,m; mencari banyak jenis kelas dalam label isiLabel = numeluniquelabel; membuat cell baru yang belum isi kelas = cell1,isiLabel; perulangan sebanyak fold kali untuk mengelompokkan data berdasarkan label i1 2 kedalam kelas i1 2 for i = 1:isiLabel kelas{i} = dataKlasifikasifindlabel==i,:; end membuat cell kosong berdasarkan jumlah k dan fold kelasBagi = cellk,isiLabel; for i = 1:isiLabel melihat jumlah data untuk setiap kelas yang sudah tersimpan dalam cell kelas ndata = sizekelas{i},1; menghitung hasil bagi jika data dibagi sebanyak k bagian x = floorndatak; menghitung sisa dari jumlah data jika dibagi sebanyak k bagian y = modndata,k; n = 1:x; for j = 1:k if y jika memiliki sisa n = [n nend+1]; mengambil data sebanyak n+1 mengurangi nilai y y = y-1; end mengambil data sebanyak n kelasBagi{j,i} = kelas{i}n,:; n = nilai n yang paling akhir ditambah 1 sampai nilai n ditambah nilai x n = nend+1:nend+x; Dalam melakukan klasifikasi dengan algoritma c4.5, membentuk pohon perlu dilakukan dengan perhitungan pada setiap atribut untuk mendapatkan nilai gain ratio terbaik. Nilai tersebut terbentuk melalui perhitungan entropy, gain dan split information. Untuk lebih mempermudah proses perhitungan, dilakukan percarian nilai frekuensi tabel terlebih dahulu dari setiap kemungkinan nilai atribut dan kelas. Potongan source code perhitungan frekuensi tabel ditampilkan sebagai berikut : end end membuat cell baru newdata = cell1,k; melakukan perulangan untuk menjumlahkan data yang sudah tersimpan pada kelasBagi sesuai dengan indeks cell baris 1 dijumlahkan, baris 2 dijumlahkan, baris 3 dijumlahkan sehingga terbentuk cell yang baru for i = 1:k for j = 1:isiLabel newdata{i} = [newdata{i};kelasBagi{i,j}]; end end membuat cell baru untuk menyimpan data training dan data testing dTraining = cellk,1; dTesting = cellk,1; for i = 1:k dispi; for j = setdiff1:k,i mengambil data yang tidak ada didata tersebut dTraining{i} = [dTraining{i};newdata{j}]; end dTesting{i} = newdata{i}; end nattr = sizeobj.data,2-1; attrs = cellnattr,1; for i=1:nattr attrs{i} = uniqueobj.data:,i; end class = uniqueobj.data:,end; t = cellnattr+1,1; for i=1:nattr t{i} = zerosnumelattrs{i},numelclass; end Langkah selanjutnya adalah menghitung nilai entropy himpunan kasus setiap nilai atribut. Potongan source code perhitungan entropy ditampilkan sebagai berikut : t{end} = zeros1,numelclass; menghitung banyaknya data dari tiap kelas indexKelas = 1; for i = class t{end}indexKelas = numelfindobj.data:,end==i; indexKelas = indexKelas+1; end for i=1:nattr indeksNilaiAtribut=1; for j=1:numelattrs{i} indexKelas=1; for k=1:numelclass a adalah index dari data yang kelasnya==k a = findobj.data:,end==classk; b adalah data dengan kelas k b = obj.dataa,:; c adalah indeks dari data b yang atribut i nya bernilai j c = findb:,i==attrs{i}j; t{i}j,k=numelc; end end end function e = entropyobj, attrNo, attrVal e = 0; switch nargin case 1 tot = sumobj.freqTable{end}; for i = 1:sizeobj.freqTable{end},2 prob = obj.freqTable{end}itot; e = e-problog2prob; end case 3 x = obj.freqTable{attrNo}; tot = sumx,2; for i=1:sizex,2 prob = xattrVal,itotattrVal; e = e-problog2prob; end case 2 x = obj.freqTable{attrNo}; e = zerossizex,1,1; tot = sumx,2; for i=1:sizex,1 ei = 0; for j=1:sizex,2 prob = xi,jtoti; Setelah didapat nilai entropy, maka dilakukan perhitungan gain dengan cara nilai entropy semua data terhadap komposisi kelas dikurangi entropy kondisi kelas pada setiap nilai atribut. Potongan source code perhitungan gain ditampilkan sebagai berikut : Selanjutnya menghitung nilai split information seperti pada potongan source code berikut : if ~prob continue else ei = ei-problog2prob; end end end end end function g = gainobj,attrNo if nargin==2 entTotal = entropyobj; t = obj.freqTable{attrNo}; sums = sumt,2; e = entropyobj,attrNo; x = sums.eobj.totalData; g = entTotal-sumx; elseif nargin==1 entTotal = entropyobj; g = zerosobj.numAttr,1; for i=1:obj.numAttr t = obj.freqTable{i}; sums = sumt,2; e = entropyobj,i; x = sums.eobj.totalData; gi = entTotal-sumx; end end end function sp = splitInfoobj,attrNo if nargin==2 t = obj.freqTable{attrNo}; s = sumt,2; s = sobj.totalData; s = s.log2s; sp = -sums; elseif nargin==1 sp = zerosobj.numAttr,1; for i = 1:obj.numAttr t = obj.freqTable{i}; s = sumt,2; s = sobj.totalData; Pencarian nilai gain ratio terbaik didapat dari nilai gain dibagi split information untuk setiap nilai atribut. Potongan source code perhitungan gain ratio ditampilkan sebagai berikut : Hal pertama yang dilakukan dalam membuat node adalah menyiapkan cabang terlebih dahulu. Lalu mencari nilai atribut terbaik pada saat itu yang lebih kecil dari nilai pemisah terbaik, cabang kiri untuk cabang yang memiliki nilai lebih kecil sedangkan cabang kanan untuk cabang yang memiliki nilai yang lebih besar. Pembentukan node baru dilakukan dengan mengulangi mencari gain ratio terbaik. Potongan source code pembentukan cabang ditampilkan sebagai berikut : function gr = gainRatioobj, attrNo if nargin==2 gr = gainobj,attrNosplitInfoobj,attrNo; if isnangr;gr=0; end elseif nargin==1 gr = gainobj.splitInfoobj; x = findisnangr; grx = zerossizex; end end s = s.log2s; spi = -sums; end end end function populateobj gr = obj.gainRatio; [maxGain, index] = maxgr; try obj.currentAttr = obj.attrNames{index}; catch e save obj.mat , obj ; end tf = obj.freqTable{index}; [attrVal, cls] = findtf==0; obj.children = cellsizetf,1,1; x = findobj.entropyindex==0; if ~isemptyx for i=x y = findtfi,:~=0; Untuk membentuk suatu aturan rule digunakan fungsi flatten tree yang berguna untuk mengubah bentuk tree menjadi baris. Potongan source code fungsi flatten tree ditampilkan sebagai berikut : Aturan rule yang terbentuk akan ditampilkan pada halaman command window. Untuk mempermudah dalam membaca, disisipkan beberapa kata untuk melengkapi aturan tersebut. Aturan yang terbentuk if numely==1 obj.children{i}=obj.className{y1}; else error hai hai, harusnya nggak error ; end end y = complement1:sizetf,1,attrVal; else y = 1:sizetf,1; end for i=y newcols = 1:obj.numAttr+1~=index; newrows = obj.data:,index==i; newdata = obj.datanewrows,newcols; if sizenewdata,2==2 lengthuniquenewdata:,1==1 obj.children{i}= obj.className{modenewdata:,end}; else newobj = c45newdata,obj.className,obj.attrNamesnewcols; obj.children{i} = newobj; newobj.parent = obj; newobj.populate; end end end function a = flattenTreeroot fungsi untuk mengubah bentuk tree menjadi bentuk baris menampilkan node dengan proses cetak-kiri-kanan a = {root}; for i = 1:numelroot.children c = root.children{i}; if isac, char a{end+1} = c; elseif isac, c45 a = [a, flattenTreec]; end end end akan disimpan dalam file dengan format .mat. Potongan source code untuk menampilkan rule pada command window ditampilkan sebagai berikut :

4.1.1.3 Pengujian Akurasi