Machine Learning : Single Layer Perceptron dengan Stochastic gradient descent (Training and Validasi)

Print Friendly and PDF 0 Viewers

Baca Juga ya

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) 
  1. 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 :
        alpha 0.1, nyaris overfitting
        dan alpha 0.8, overfitting

https://github.com/andriimanundin27/Tugas1_ML_SingleLayerPerceptron

BAGIKAN
Previous
Next Post »
0 Komentar