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