• Tidak ada hasil yang ditemukan

2.1.1. Ekstraksi Ciri

Proses Ekstraksi ciri diawali dengan tahap pre-processing data sekuen protein, dan dilanjutkan dengan proses ekstraksi ciri. Proses ekstraksi ciri berjalan jika tombol proses diklik kemudian semua data sekuen yang akan digunakan dilooping satu persatu. Data sekuen protein yang tersimpan dalam sebuah folder, untuk melakukan looping nilai i diset untuk folder yang menunjukkan banyaknya kelas yang dimiliki, dalam penelilitian ini ada 3, dalam setiap folder terdapat data sekuen protein yang berbeda- beda, untuk data sehat 37 data sekuen protein, data kanker paru-paru 254 data sekuen protein dan data kanker payudara 125 data sekuen protein. Data sekuen protein harus berformat .fasta, untuk proses looping ditunjukan pada potongan source code berikut.

for i=1:3

folder=['C:\Users\quadran\Documents\MATLAB\decision

tree\class ',num2str(n),'\']; j = 1;

file = [folder,'class ',num2str(n),' (',num2str(j),').fasta']; Kode Program 4. 1 Looping data sekuen protein

Proses pre-processing data sekuen protein menggunakan EIIP based protein value, yaitu mentransformasikan data sekuen protein berformat String menjadi berformat numerik, untuk proses pre-processing ditunjukan pada potongan source kode berikut.

while exist(file, 'file') == 2 %ekstraksi ciri

[f,databaru] = preprosses(file);

Kode Program 4. 2 Pre-processing data sekuen protein

Proses transformasi dengan EIIP based protein value. Tahap pertama yang dilakukan membaca data sekuen protein berformat .fasta dengan menggunakan fungsi fastaread milik matlab, bagian data yang digunakan adalah bagian sequence yang berisi single letter-code dari asam amino. Setiap single letter-code dari asam amino diberi nilai berdasarkan

EIIP based protein value. Berikut ini potongan source code transformasi EIIP. a=fastaread(x); s=a.Sequence; l = length(s); ds = []; for i = 1:l hr = s(i); if hr == 'L' ds(i)=0.0000; elseif hr == 'I' ds(i)=0.0000; elseif hr == 'N' ds(i)=0.0036; elseif hr == 'G' ds(i)=0.0050; elseif hr == 'V' ds(i)=0.0057; elseif hr == 'E' ds(i)=0.0058; elseif hr == 'P' ds(i)=0.0198; elseif hr == 'H' ds(i)=0.0242; elseif hr == 'K' ds(i)=0.0371; elseif hr == 'A' ds(i)=0.0373; elseif hr == 'Y' ds(i)=0.0516; elseif hr == 'W' ds(i)=0.0548; elseif hr == 'Q' ds(i)=0.0761; elseif hr == 'M' ds(i)=0.0823; elseif hr == 'S' ds(i)=0.0829; elseif hr == 'C' ds(i)=0.0829; elseif hr == 'T' ds(i)=0.0941; elseif hr == 'F' ds(i)=0.0954; elseif hr == 'R'

ds(i) =0.0956; elseif hr == 'D' ds(i)=0.1263; end end f=ds;

Kode Program 4. 3 Transformasi sekuen protein menggunakan EIIP based value protein

Proses selanjutnya adalah ektraksi ciri menggunakan FFT. Data sekuen protein ditransformasikan menjadi data bertipe numerik diekstraksi ciri menjadi sinyal frequency based dengan menggunakan FFT. FFT berfungsi mengubah sinyal dari time-base menjadi frequency-base (Yan-Zhi GUO, Meng-Long L, et al. 2005). Proses ini menggunakan function FFT milik matlab, yang ditunjukan pada potongan source code berikut.

%fft

FreqBase = fft(ds);

plot(1:l,abs(FreqBase(1:l)));figure(gcf);

Kode Program 4. 4 Proses FFT data sekuen protein

Data sekuen protein yang telah menjadi sinyal frequency-base selanjutnya diekstraksikan ciri kembali dengan mengunakan LPC dan turunan dari LPC (delta LPC dan delta delta LPC). LPC digunakan untuk menyeragamkan panjang sinyal yang ditentukan berdasarkan order dan mendapatkan ciri dari setiap data. Pada penelitian ini order yang digunakan adalah order 8 dan order 12. Berikut ini adalah potongan source code dari function dolpc.m dan deltas.m

[nbands,nframes] = size(x); if nargin < 2 modelorder = 8; end % Calculate autocorrelation r = real(ifft([x;x([(nbands-1):-1:2],:)])); % First half only

r = r(1:nbands,:);

% Find LPC coeffs by durbin [y,e] = levinson(r, modelorder); % Normalize each poly by gain y = y'./repmat(e',(modelorder+1),1);

end

if nargin < 2 w = 9; end [nr,nc] = size(x); if nc == 0

% empty vector passed in; return empty vector d = x;

else

% actually calculate deltas

% Define window shape

hlen = floor(w/2); w = 2*hlen + 1; win = hlen:-1:-hlen;

% pad data by repeating first and last columns

xx = [repmat(x(:,1),1,hlen),x,repmat(x(:,end),1,hlen)];

% Apply the delta filter

d = filter(win, 1, xx, [], 2); % filter along dim 2 (rows)

% Trim edges

d = d(:,2*hlen + [1:nc]);

end

Kode Program 4. 6 Delta LPC

Setiap data yang telah diolah menggunakan LPC dan deltaLPC dengan order tertentu selanjutnya digabungkan menjadi satu data. Setiap feature menghasilkan nilai sesuai order yang digunakan ditambah satu energi. Contoh feature LPC dengan order 8 menghasilkan 9 nilai pada setiap data yang terdiri dari 8 ciri dan 1 energi. Setiap feature digabungkan menjadi satu data baru yang ditampilkan dengan sinyal steam, yang ditunjukan pada potongan source code berikut. lpc =dolpc (FreqBase,8); % stem(dellpc,'DisplayName','dellpc');figure(gcf); deltalpc = deltas(lpc,8); % stem(deltalpc,'DisplayName','deltalpc');figure(gcf); deltadeltalpc = deltas(deltalpc,8); % stem(deltadeltalpc,'DisplayName','deltadeltalpc');figure(gcf); databaru = [lpc; deltalpc; deltadeltalpc];

stem(databaru,'DisplayName','databaru');figure(gcf) f=databaru;

end

Kode Program 4. 7 Penggabungan LPC, delta LPC, delta delta LPC Data feature LPC yang telah digabungkan selanjutnya ditampilkan pada halaman ekstraksi ciri menggunakan function axes milik matlab. Function axes digunakan untuk menampilkan data dalam bentuk grafik figure yang ditunjukan pada potongan source code berikut.

axes(handles.axTotalLPC)

stem(databaru,'DisplayName','databaru');

pause(0.01);

Kode Program 4. 8 Menampilkan data pada halaman Ekstraksi Ciri Nilai hasil ekstraksi disimpan dalam suatu variabel dan dilakukan proses transpose matriks dengan memberikan (‘) pada variabel yang akan ditranspose. Transpose matriks digunakn untuk mengubah baris menjadi kolom atau sebaliknya. Tujuan dilakukannya transpose adalah untuk memepermudah pembacaan data pada proses klasifikas, yang ditunjukan pada potongan source code berikut.

f = f';

Hasilf=[Hasilf;f]

Kode Program 4. 9 Trasnpose hasil ekstraksi ciri

Data hasil ekstraksi ciri yang telah tersimpan dalam suatu variabel selanjutnya diberi label sesuai dengan kelas dari setiap data. Pemberian label berdasakan folder data yang digunakan dalam proses pre-processing dan ekstraksi ciri. Pemberia label berguna pada proses klasifikasi dan akurasi untuk mencocokan data berada pada kelas mana. Berikut ini adalah potongan source code untuk pelabelan data.

class(m)=n; m=m+1; j=j+1;

file = [folder,'class ',num2str(n),' (',num2str(j),').fasta']; end

n=n+1;

class=class'; [m,n]=size(Hasilf);

Kode Program 4. 10 Pemberian label kelas pada data

Sebelum proses klasifikasi data yang telah diekstraksi ciri dilakukukan cleaning data yaitu data memiliki missing value diberi nilai baru. Pada peneleitian ini data yang memiliki nilai NaN diberikan nilai baru yaitu 0, yang ditunjukan pada potongan source code berikut.

%missing value for i=1:m for j=1:n if isnan(Hasilf(i,j)) Hasilf(i,j)=0; end end end

Kode Program 4. 11 Missing Value

Sebelum masuk dalam proses klasifikasi data dipartisi menjadi n-bagian menggunakan k-fold cross validation. Pada penelitian ini menggunakan 3-fold cross validation. Partisi data menggunakan cvpartition milik matlab. Cvpartition mempartisi data training dan testing secara random, sehingga data yang telah diolah harus disimpan sebelum dilakukan proses klasifikasi. Berikut ini adalah potongan source code partisi data.

Kode Program 4. 12 Partisi Data

Data hasil pre-processing, ekstraksi ciri, pelabelan, missing value disimpan dalam variabel data Hasilf sedangkan hasil partisi berupa data training dan data testing disimpan didalam variabel data Training 1, Trainining 2, Training 3, Testing 1, Testing 2 dan Testing3. Semua data yang telah disimpan dijadikan satu. Data disimpan dengan format .mat untuk mempermudah pemanggilan data dalam proses klasifikasi. Berikut potongan source code menyimpan data.

Hasilf=[class,Hasilf];

[Training1, Testing1, Training2, Testing2, Training3, Testing3] = foldSaya( [N] = size(Hasilf,1);

k = 3;

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_tree(X,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_node(X, Y, inds, p,labels, cols, 1, bVal,coloum);

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_node(X, Y, inds, p, labels, cols, node, bVal, coloum)

% Recursively splits nodes based on information gain % Check if the current leaf is consistent

if numel(unique(Y(inds{node}))) == 1 return; end if size(unique(X(inds{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 = X(inds{node},:); curr_Y = Y(inds{node}); % Loop over each feature

for i = 1:size(X,2) feat = curr_X(:,i);

% Deterimine the values to split on vals = unique(feat);

splits = 0.5*(vals(1:end-1) + vals(2:end)); if numel(vals) < 2

continue

end

% Get binary values for each split value

bin_mat = double(repmat(feat, [1 numel(splits)]) < repmat(splits', [numel(feat) 1]));

% Compute the information gains H = ent(curr_Y);

H_cond = zeros(1, size(bin_mat,2)); for j = 1:size(bin_mat,2)

H_cond(j) = cond_ent(curr_Y, bin_mat(:,j)); end

IG = H - H_cond;

% Find the best split [val ind] = max(IG); if val > best_ig best_ig = val; best_feature = i; best_val = splits(ind); 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 = numel(p)-2;

[inds p labels bVal coloum] = split_node(X, Y, inds, p, labels, cols, n+1, bVal,coloum);

[inds p labels bVal coloum] = split_node(X, 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 treeplot(t.p');

title('Decision tree (Visual Tree)'); [xs,ys,h,s] = treelayout(t.p'); for i = 2:numel(t.p) % Get my coordinate my_x = xs(i); my_y = ys(i);

% Get parent coordinate parent_x = xs(t.p(i)); parent_y = ys(t.p(i));

% Calculate weight coordinate (midpoint) mid_x = (my_x + parent_x)/2;

% Edge label text(mid_x,mid_y,t.labels{i-1}); % Leaf label if ~isempty(t.inds{i}) val = Y(t.inds{i}); if numel(unique(val))==1

text(my_x, my_y, sprintf('y=%2.2f\nn=%d', val(1), numel(val)));

else

%inconsistent data

text(my_x, my_y, sprintf('**y=%2.2f\nn=%d', mode(val),

numel(val))); end

end end

save ('tree.mat','t');

Kode Program 4. 19 Menampilkan Tree

2.1.3. Akurasi Tree

Proses akurasi dilakukan dengan testing tree terlebih dahulu. Proses testing dilakukan pada setiap baris dengan cara mencari cabang node yang memiliki parent yang berupa root. Proses berikut ini berlangsung selama tree masih memiliki cabang. Tentukan nilai atribut node berada pada cabang kanan (lebih besar) atau kiri (lebih kecil). Setelah ditentukan atribut masuk dalam cabang kiri atau kanan, maka cabang tesebut akan menjadi node berikutnya. Tahap selanjutnya adalah mencari cabang node yang memiliki parent dari cabang node yang telah ditentukan sebelumnya. Setelah menemukan node terakhir (tidak memiliki cabang), didapatkan lah prediksi kelas. Data prediksi kelas di simpan dalam sebuah array. Berikut ini source code yang digunakan.

for i = 1 : size(att, 1) curr = 1;

idx = find(tree.p == curr);

while isempty(tree.inds{curr})

if(att(i, tree.coloum{idx(1) - 1}) < tree.bVal{idx(1) - 1}) curr = idx(1);

else

end

idx = find(tree.p == curr); end

tree.inds{curr};

val = X(tree.inds{curr}); class = [class unique(val)];

end

Kode Program 4. 20 Testing tree

Langkah pertama untuk menghitung nilai akurasi dengan mencocokan label kelas data testing dengan prediksi kelas yang didapatkan dari proses Testing tree, lalu hitung rata-rata data yang sama antara label kelas data testing dengan prediksi kelas, yang ditampilkan pada source code dibawah ini.

for i = 1 : size(result, 1) if(result(i, 1) == result(i, 2)) equ = equ + 1; end tot = tot + 1; end

acc = equ * 100 / tot;

Kode Program 4. 21 Menghitung akurasi

Dokumen terkait