Machine Learning : Single Layer Perceptron dengan Stochastic gradient descent (Training and Validasi) - Selamat siang semuanya, kali ini admin akan membagikan laporan dari tugas 2 pembelajaran mesin terkait single layer perceptron dengan menggunakan Stochastic gradient descent (Training dan Validasi) untuk melihat apakah model yang kita buat overfitting atau tidak.
Dibawah ini merupakan coding from scratch yang admin buat, berhubung sudah mulai tertarik dan ketagihan dengan dunia ini, maka admin buat saja dokumentasiya. Selain di github untuk codingnya, juga tidak lupa admin posting di blog semangat27.com untuk laporannya, agar teman-teman semua bisa mempelajarinya juga.
semoga bermanfaat dan jika ada kekurangan mohon dimaafkan karena admin juga masih belajar, dan jangan lupa tambahkan solusinya dikolom komentar, begitupun jika ada pertanyaan, silakan tanyakan juga melalui kolom komentar.
Single Layer Perceptron dengan Stochastic
gradient descent
(Training and Validasi)
- Dataset
Dataset yang digunakan dalam tugas 2 pembelajaran mesin ini masih sama
dengan tugas 1 yakni dataset IRIS yang bisa diperoleh dari https://archive.ics.uci.edu/ml/datasets/iris.
Dataset ini didalamnya berisi data seperti berikut ini
0 1 2
3 4 0 1
2 3 4
0
5.1 3.5 1.4
0.2 Iris-setosa|50 7.0
3.2 4.7 1.4
Iris-versicolor
1
4.9 3.0 1.4
0.2 Iris-setosa|51 6.4
3.2 4.5 1.5
Iris-versicolor
2
4.7 3.2 1.3
0.2 Iris-setosa|52 6.9
3.1 4.9 1.5
Iris-versicolor
3
4.6 3.1 1.5
0.2 Iris-setosa|53 5.5
2.3 4.0 1.3
Iris-versicolor
4
5.0 3.6 1.4
0.2 Iris-setosa|54 6.5
2.8 4.6 1.5
Iris-versicolor
5
5.4 3.9 1.7
0.4 Iris-setosa|55 5.7
2.8 4.5 1.3
Iris-versicolor
6
4.6 3.4 1.4
0.3 Iris-setosa|56 6.3
3.3 4.7 1.6
Iris-versicolor
7
5.0 3.4 1.5
0.2 Iris-setosa|57 4.9
2.4 3.3 1.0
Iris-versicolor
8
4.4 2.9 1.4
0.2 Iris-setosa|58 6.6
2.9 4.6 1.3
Iris-versicolor
9
4.9 3.1 1.5
0.1 Iris-setosa|59 5.2
2.7 3.9 1.4
Iris-versicolor
10 5.4
3.7 1.5 0.2
Iris-setosa|60 5.0 2.0
3.5 1.0 Iris-versicolor
11 4.8
3.4 1.6 0.2
Iris-setosa|61 5.9 3.0
4.2 1.5 Iris-versicolor
12 4.8
3.0 1.4 0.1
Iris-setosa|62 6.0 2.2
4.0 1.0 Iris-versicolor
13 4.3
3.0 1.1 0.1
Iris-setosa|63 6.1 2.9
4.7 1.4 Iris-versicolor
14 5.8
4.0 1.2 0.2
Iris-setosa|64 5.6 2.9
3.6 1.3 Iris-versicolor
15 5.7
4.4 1.5 0.4
Iris-setosa|65 6.7 3.1
4.4 1.4 Iris-versicolor
16 5.4
3.9 1.3 0.4
Iris-setosa|66 5.6 3.0
4.5 1.5 Iris-versicolor
17 5.1
3.5 1.4 0.3
Iris-setosa|67 5.8 2.7
4.1 1.0 Iris-versicolor
18 5.7
3.8 1.7 0.3
Iris-setosa|68 6.2 2.2
4.5 1.5 Iris-versicolor
19 5.1
3.8 1.5 0.3
Iris-setosa|69 5.6 2.5
3.9 1.1 Iris-versicolor
20 5.4
3.4 1.7 0.2
Iris-setosa|70 5.9 3.2
4.8 1.8 Iris-versicolor
21 5.1
3.7 1.5 0.4
Iris-setosa|71 6.1 2.8 4.0 1.3
Iris-versicolor
22 4.6
3.6 1.0 0.2
Iris-setosa|72 6.3 2.5
4.9 1.5 Iris-versicolor
23 5.1
3.3 1.7 0.5
Iris-setosa|73 6.1 2.8
4.7 1.2 Iris-versicolor
24 4.8
3.4 1.9 0.2
Iris-setosa|74 6.4 2.9
4.3 1.3 Iris-versicolor
25 5.0
3.0 1.6 0.2
Iris-setosa|75 6.6 3.0
4.4 1.4 Iris-versicolor
26 5.0
3.4 1.6 0.4
Iris-setosa|76 6.8 2.8
4.8 1.4 Iris-versicolor
27 5.2
3.5 1.5 0.2
Iris-setosa|77 6.7 3.0
5.0 1.7 Iris-versicolor
28 5.2
3.4 1.4 0.2
Iris-setosa|78 6.0 2.9
4.5 1.5 Iris-versicolor
29 4.7
3.2 1.6 0.2
Iris-setosa|79 5.7 2.6
3.5 1.0 Iris-versicolor
30 4.8
3.1 1.6 0.2
Iris-setosa|80 5.5 2.4
3.8 1.1 Iris-versicolor
31 5.4
3.4 1.5 0.4
Iris-setosa|81 5.5 2.4
3.7 1.0 Iris-versicolor
32 5.2
4.1 1.5 0.1
Iris-setosa|82 5.8 2.7
3.9 1.2 Iris-versicolor
33 5.5
4.2 1.4 0.2
Iris-setosa|83 6.0 2.7
5.1 1.6 Iris-versicolor
34 4.9
3.1 1.5 0.2
Iris-setosa|84 5.4 3.0
4.5 1.5 Iris-versicolor
35 5.0
3.2 1.2 0.2
Iris-setosa|85 6.0 3.4
4.5 1.6 Iris-versicolor
36 5.5
3.5 1.3 0.2
Iris-setosa|86 6.7 3.1
4.7 1.5 Iris-versicolor
37 4.9
3.6 1.4 0.1
Iris-setosa|87 6.3 2.3
4.4 1.3 Iris-versicolor
38 4.4
3.0 1.3 0.2
Iris-setosa|88 5.6 3.0
4.1 1.3 Iris-versicolor
39 5.1
3.4 1.5 0.2
Iris-setosa|89 5.5 2.5
4.0 1.3 Iris-versicolor
40 5.0
3.5 1.3 0.3
Iris-setosa|90 5.5 2.6
4.4 1.2 Iris-versicolor
41 4.5
2.3 1.3 0.3
Iris-setosa|91 6.1 3.0
4.6 1.4 Iris-versicolor
42 4.4
3.2 1.3 0.2
Iris-setosa|92 5.8 2.6
4.0 1.2 Iris-versicolor
43 5.0
3.5 1.6 0.6
Iris-setosa|93 5.0 2.3
3.3 1.0 Iris-versicolor
44 5.1
3.8 1.9 0.4
Iris-setosa|94 5.6 2.7
4.2 1.3 Iris-versicolor
45 4.8
3.0 1.4 0.3
Iris-setosa|95 5.7 3.0
4.2 1.2 Iris-versicolor
46 5.1
3.8 1.6 0.2
Iris-setosa|96 5.7 2.9
4.2 1.3 Iris-versicolor
47 4.6
3.2 1.4 0.2
Iris-setosa|97 6.2 2.9
4.3 1.3 Iris-versicolor
48 5.3
3.7 1.5 0.2
Iris-setosa|98 5.1 2.5
3.0 1.1 Iris-versicolor
49 5.0
3.3 1.4 0.2
Iris-setosa|99 5.7 2.8
4.1 1.3 Iris-versicolor
[100 rows x 5 columns]
Terdapat 3 Jenis IRIS : iris-setosa, iris-versicolor dan iris-virginica.
#read data
df = pd.read_csv ('F:/ML/data.csv', header=None, nrows=100)
Terdapat 150 baris data, akan tetapi pada tugas 2 kali ini hanya
digunakan 100 baris data saja. Oleh karena itu hanya 2 jenis IRIS saja yang
muncul yaitu :
●
iris-setosa, yang selanjutnya menjadi fakta 1
●
dan iris-versicolor, yang selanjutnya menjadi
fakta 0
#data cleansing
df[4] = df[4].replace('Iris-setosa', 1)
df[4] = df[4].replace('Iris-versicolor', 0)
Karena dalam tugas 2 ini terdapat pembagian training dan validasi maka
dataset dibagi menjadi 2 dengan rincian sebagai berikut :
Training :
●
Data dengan fakta 1 (iris-setosa ) baris 1 – 40
●
Data dengan fakta 0 (iris-versicolor) baris 51 –
90
Validasi :
●
Data dengan fakta 1 (iris-setosa) baris 40 - 50
●
Data dengan fakta 0 (iris-versicolor) baris 90 -
100
#Slicing Subsets of Rows and Columns
#Training
traindata1 = df.iloc [:40,:4]
traindata0 = df.iloc [50:90,:4]
trainfact1 = df.iloc [:40, 4]
trainfact0 = df.iloc [50:90, 4]
traindata = traindata1.append(traindata0).values
trainfact = trainfact1.append(trainfact0).values
#Validasi
valdata1 = df.iloc [40:50,:4]
valdata0 = df.iloc [90:100,:4]
valfact1 = df.iloc [40:50,4]
valfact0 = df.iloc [90:100,4]
valdata = valdata1.append(valdata0).values
valfact = valfact1.append(valfact0).values
2. Fungsi
Ada beberapa fungsi perhitungan yang digunakan dalam tugas 2 kali ini,
diantaranya sebagai berikut :
h(X,teta,b)
Dengan rumus : (theta1*x1) + (theta2*x2) + (theta3*x3) + (theta4*x4) +
bias
#h
def h (x, t, b) :
return np.dot(x, theta)+b
Sigmoid(h)
Dengan rumus : 1/(1 + e^-h)
#sigmoid
def sigmoid (h) :
return
1/(1+mt.exp(-h))
Prediksi
Jika sigmoid > 0,5 maka nilai prediksi 1
Selain itu nilai prediksi 0
#predict
def pred (sigmoid) :
if sigmoid > 0.5 :
return 1
else :
return 0
Error
Dengan rumus : (sigmoid - fakta)^2
#error
def error (f,sigmoid) :
return (sigmoid-f)**2
Delta Theta n
Dengan rumus : 2*(sigmoid - fakta)*(1 - sigmoid)*sigmoid*
Jika theta1 maka terakhir dikalikan dengan x1, theta2 dikalikan dengan
x2 dan seterusnya,
#delta theta
def delt (f, sigmoid, xn) :
return
2*(sigmoid-f)*(1-sigmoid)*sigmoid*xn
Theta n Baru
Dengan rumus : Theta n sebelumnya-(delta n theta*alpha)
#new theta
def newt(a, tn, dtn) :
return tn-(a*dtn)
Bias Baru
Dengan rumus : Bias Sebelumya-(delta bisa*alpha)
#new bias
def newb (a, b, delb) :
return b-(a*delb)
Selanjutnya berdasarkan fungsi yang ada diatas maka kita harus terlebih
dahulu menentukan theta, bias, dan
juga alphanya
●
Theta 1 =
0.1
●
Theta 2 =
0.15
●
Theta 3 =
0.2
●
Theta 4 =
0.25
●
Bias =
0.3
●
Alpha =
0.1 dan 0.8
#init var
theta = np.array ([0.1,0.15,0.2,0.25])
bias = 0.3
a = 0.1
#a = 0.8
3. Implementasi
Dalam implementasi tugas 2 ini, digunakan bahasa pemrograman python
untuk melakukan pengolahan
datasetnya. Tahapannya terbagi menjadi beberapa bagian sebagai berikut :
A. Library
#library
import pandas as pd
import numpy as np
import math as mt
import matplotlib.pyplot as plt
B. Membaca
data dalam dataframe pandas
#read data
df = pd.read_csv ('F:/ML/data.csv', header=None, nrows=100)
C. Preprosessing,
agar siap diolah (cleansing
#data cleansing
df[4] = df[4].replace('Iris-setosa', 1)
df[4] = df[4].replace('Iris-versicolor', 0)
D. Membagi
dataset menjadi training dan validasi
#Slicing Subsets of Rows and Columns
traindata1 = df.iloc [:40,:4]
traindata0 = df.iloc [50:90,:4]
trainfact1 = df.iloc [:40, 4]
trainfact0 = df.iloc [50:90, 4]
traindata = traindata1.append(traindata0).values
trainfact = trainfact1.append(trainfact0).values
valdata1 = df.iloc [40:50,:4]
valdata0 = df.iloc [90:100,:4]
valfact1 = df.iloc [40:50,4]
valfact0 = df.iloc [90:100,4]
valdata = valdata1.append(valdata0).values
valfact = valfact1.append(valfact0).values
E. Inisiasi
Variabel
#init var
theta = np.array ([0.1,0.15,0.2,0.25])
bias = 0.3
a = 0.1
#a = 0.8
epoch = 60
total_errors = 0
train_errors = np.zeros(epoch)
val_errors = np.zeros(epoch)
F. Membuat
Fungsi
#func
def h (x, t, b) :
return np.dot(x, theta)+b
def sigmoid (h) :
return
1/(1+mt.exp(-h))
def pred (sigmoid) :
if sigmoid > 0.5 :
return 1
else :
return 0
def error (f,sigmoid) :
return (sigmoid-f)**2
def delt (f, sigmoid, xn) :
return
2*(sigmoid-f)*(1-sigmoid)*sigmoid*xn
def delb (f, sigmoid) :
return
2*(sigmoid-f)*(1-sigmoid)*sigmoid
def newt(a, tn, dtn) :
return tn-(a*dtn)
def newb (a, b, delb) :
return b-(a*delb)
G. Perhitungan
#Loop
for i in range (epoch):
#for i in range (1):
for j in
range(len(traindata)):
#for j in range(1):
rh =
h(traindata[j,:4],theta, bias)
#print("h:")
#print(rh)
#print("----------------")
#print(theta)
#print(bias)
rsigmoid =
sigmoid(rh)
#print("sigmoid :")
#print(rsigmoid)
#print("----------------")
rpred =
pred(rsigmoid)
#print("pred
:")
#print(rpred)
#print("----------------")
rerror =
error(trainfact[j],rsigmoid)
#print("error
:")
#print(rerror)
#print("----------------")
#zero array to
save delta
arr_dt =
np.zeros(4)
arr_db =
np.zeros(1)
#print("arr_dt :")
for k in
range(len(arr_dt)):
arr_dt[k] =
delt(trainfact[j],rsigmoid,traindata[j,k])
#print(arr_dt)
#print("----------------")
arr_db =
delb(trainfact[j],rsigmoid)
#print("arr_db :")
#print(arr_db)
#print("----------------")
#print("ntheta :")
for l in range
(len(theta)):
theta[l] =
newt(a, theta[l], arr_dt[l])
#print (theta)
#print("----------------")
bias =
newb(a,bias,arr_db)
#print("nbias
:")
#print(bias)
#print("----------------")
total_errors +=
rerror
#print(total_errors)
train_errors[i]=total_errors
total_errors=0
for m in range
(len(valdata)):
rh =
h(valdata[m,:4],theta, bias)
#print("h:")
#print(rh)
#print("----------------")
#print(theta)
#print(bias)
rsigmoid =
sigmoid(rh)
#print("sigmoid :")
#print(rsigmoid)
#print("----------------")
rpred =
pred(rsigmoid)
#print("pred
:")
#print(rpred)
#print("----------------")
rerror =
error(valfact[m],rsigmoid)
#print("error
:")
#print(rerror)
#print("----------------")
total_errors +=
rerror
#print(total_errors)
val_errors[i]=total_errors
total_errors=0
H. Visualisasi
plt.figure(figsize=(12,6))
plt.plot (train_errors, 'r', val_errors, 'b',)
plt.grid(True)
plt.show ()
4. Kesimpulan
Berdasarkan percobaan yang dilakukan dengan menggunakan masing-masing
alpha yakni :
●
Alpha = 0.1
●
Alpha = 0,8
Selama 60 epoch dengan pembagian dataset testing dan validasi, juga
pemilihan theta dan bias seperti dijelaskan diatas, didapatkan visualisasi data
dalam grafik seperti dibawah ini
Dari kedua percobaan tersebut terlihat bahwa :
●
dan alpha 0.8, overfitting
0 Komentar