Hasilf ; save
hasilPre-processing.mat ,
Hasilf ,
Training1 ,
Testing1 ,
Training2 ,
Testing2 ,
Training3 ,
Testing3 ;
Kode Program 4. 13 Save Data
2.1.2. Algoritma Decision Tree
Pengujian dilakukan dengan membuat pohon keputusan atau tree untuk setiap proses training. Untuk melakukan klasifikasi, langkah
pertama adalah memanggil dataset dari pre-processing dan ekstraksi ciri yang telah dipartisi yang disimpan dalam format.mat dengan function load
dari matlab. Pilih data training yang digunakan dalam proses klasifikasi. Pisah data training menjadi dua bagian yaitu data atribut dan data kelas.
Beri nama untuk setiap atribut sesuai dengan panjang data. Untuk
membuat tree dibutuhkan function bulid_tree.m dengan inputan berupa
kelas, atribut, dan nama atribut, yang ditunjukan pada source code berikut ini.
load hasilPre-processing.mat
; Data = Training3;
We want to predict the first column... Y = Data:,1;
...based on the others X = Data:,2:end;
cols = {
att1 ,
att2 ,
att3 ,
att4 ,
att5 ,
att6 ,
att7 ,
att8 ,
att9 ,
att10 ,
att11 ,
att12 ,
a tt13
, att14
, att15
, att16
, att17
, att18
, ...
att19 ,
att20 ,
att21 ,
att22 ,
att23 ,
att24 ,
att25 ,
att26 ,
att27 };
t = build_treeX,Y,cols;
Kode Program 4. 14 Build decision tree
Langkah pertama yang dilakukan dalam build tree adalah membuat root kosong lalu buat cabang pada root, yang ditunjukan pada source code
berikut ini. [inds p labels bVal coloum] = split_nodeX, Y, inds, p,labels, cols, 1,
bVal,coloum;
Kode Program 4. 15 Membuat root kosong
Untuk membuat cabang pada root, langkah pertama adalah cek nilai Y kelas yang memiliki nilai unique dan cek nilai X atribut pada
baris yang memiliki nilai unique. Looping setiap atribut untuk mendapat nilai information gain terbaik dengan cara yaitu untuk setiap nilai yang
unique dipisahakan jika nilai atribut pada saat itu tidak bisa membuat cabang jumlah nilai unique 2 maka atribut tersebut akan dilewati.
Untuk menghitung information gain perlu mencari nilai biner dari setiap nilai split. Hitung information gain dengan menghitung nilai entropy
semua data pada komposisi kelas dan nilai entropy kondisi kelas pada setiap nilai atribut, jika nilai entropy sudah dihitung maka nilai Informatin
gain merupakan hasil dari entropy semua data terhadap kompisis kelas dikurangi entropy kondisi kelas pada setiap nilai atribut. Cari information
gain terbaik pada nilai atribut yang unique lalu proses information gain terbesar antar atribut untuk mendapatkan nilai pemisah, yang ditampilkan
pada source code berikut Function
[inds p labels bVal coloum] = split_nodeX, Y, inds, p, labels, cols, node, bVal, coloum
Recursively splits nodes based on information gain Check if the current leaf is consistent
if numeluniqueYinds{node} == 1
return ;
end if
sizeuniqueXinds{node},:, rows
,1 == 1 return
; end
best_ig = -inf; best information gain
best_feature = 0; best feature to split on
best_val = 0; best value to split the best feature on
curr_X = Xinds{node},:; curr_Y = Yinds{node};
Loop over each feature for
i = 1:sizeX,2 feat = curr_X:,i;
Deterimine the values to split on vals = uniquefeat;
splits = 0.5vals1:end-1 + vals2:end; if
numelvals 2 continue
end Get binary values for each split value
bin_mat = doublerepmatfeat, [1 numelsplits] repmatsplits, [numelfeat 1];
Compute the information gains H = entcurr_Y;
H_cond = zeros1, sizebin_mat,2; for
j = 1:sizebin_mat,2 H_condj = cond_entcurr_Y, bin_mat:,j;
end IG = H - H_cond;
Find the best split [val ind] = maxIG;
if val best_ig
best_ig = val; best_feature = i;
best_val = splitsind;
end end
Kode Program 4. 16 Split node
Hal yang pertama dilakukan dalam membuat node adalah siapkan cabang terlebih dahulu, lalu cari 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. Beri label untuk cabang kiri dan kanan berupa nama atribut dan nilai terbaik dari pemisah terbaik. Ulangi untuk
membuat node baru yaitu mencari split node Kode Program 4. 17. Berikut ini source code yang digunakan.
Split the current node into two nodes feat = curr_X:,best_feature;
feat = feat best_val; inds = [inds; inds{node}feat; inds{node}~feat];
inds{node} = []; p = [p; node; node];
labels = [labels; sprintf
s 2.2f , cols{best_feature}, best_val;
sprintf s = 2.2f
, cols{best_feature}, best_val]; bVal = [bVal; best_val; best_val];
coloum = [coloum;best_feature;best_feature]; Recurse on newly-create nodes
n = numelp-2; [inds p labels bVal coloum] = split_nodeX, Y, inds, p, labels, cols,
n+1, bVal,coloum; [inds p labels bVal coloum] = split_nodeX, Y, inds, p, labels, cols,
n+2, bVal,coloum;
Kode Program 4. 18 Membuat cabang
Tree yang sudah terbentuk ditampikan dalam sebuah figure baru terlepas dari halaman tree agar tree dapat lebih mudah dilihat. Untuk
menampilkan tree menggunakan treeplot dan treelayout. Treeplot digunakan untuk menampilkan kerangka tree berupa node-node dan
cabang, sedangkan treelayout untuk membuat koordinasi dari tree. Setelah tree ditampilkan niali dari tree akan disimpan sebagai model utuk proses
akurasi. Berikut ini source code yang digunakan. h1 = figure;
Display the tree treeplott.p;
title Decision tree Visual Tree
; [xs,ys,h,s] = treelayoutt.p;
for i = 2:numelt.p
Get my coordinate my_x = xsi;
my_y = ysi;
Get parent coordinate parent_x = xst.pi;
parent_y = yst.pi;
Calculate weight coordinate midpoint mid_x = my_x + parent_x2;
mid_y = my_y + parent_y2;
Edge label textmid_x,mid_y,t.labels{i-1};
Leaf label if
~isemptyt.inds{i} val = Yt.inds{i};
if numeluniqueval==1
textmy_x, my_y, sprintf y=2.2f\nn=d
, val1, numelval; else
inconsistent data textmy_x, my_y, sprintf
y=2.2f\nn=d , modeval,
numelval; end
end end
save tree.mat
, t
;
Kode Program 4. 19 Menampilkan Tree
2.1.3. Akurasi Tree