Tampilkan postingan dengan label Portofolio. Tampilkan semua postingan
Tampilkan postingan dengan label Portofolio. Tampilkan semua postingan

Scrape Film Indonesia Bergenre Horor dengan Python

Add Comment
Scrape Film Indonesia Bergenre Horor dengan Python - Selamat siang semua pengunjung semangat27.com, kali ini admin akan berbagi bagaimana caranya scrape atau scraping dengan menggunakan python atau lebih tepatnya menggunakan jupyter notebook. Untuk pengetahuan dasarnya silakan cari sendiri ya, disini admin hanya akan menceritakan bagian code yang sudah dibuat dalam jupyter notebook dengan menggunakan bahasa python. Semoga saja dapat bermanfaat dan bisa dipahami ya, jika ada kekurangan silakan sampaikan pada kolom komentar dibawah. Terlebih jika diberikan saran, tentunya admin akan sangat senang sekali. Begitupun jika ada pertanyaan, silakankan tulis pada kolom komentar dibawah, insya allah akan admin jawab.

Baik langsung saja, berikut adalah Scrape Indonesian Movie Horror WebPage with Jupyter Notebook Python. Silakan disimak baik-baik karena ada beberapa issue scrape yang menarik seperti scrape multiple page dan fix null value.





Pertama tentu saja kita perlukan library python untuk scrape webpage indonesian horror movie tersebut seperti requests untuk melakukan requests halaman main page yang akan kita gunakan untuk mengambil data yang ada didalamnya, dalam hal ini scrape film indonesia yang bergenre horor. Kemudian kita membutuhkan library BeautifulSoup agar scrape kita tidak berantakan. Scrape dengan beautifulsoup ini akan memudahkan kita mengambil secara spesifik tag (dalam html) mana yang akan kita ambil isinya. Selanjutnya ada pandas yang merupakan library untuk membuat dataframe agar data yang telah kita kumpulkan tadi tersusun rapih layaknya berada dalam tabel yang siap kita outputkan kedalam format CSV biasanya.

Akan tetapi perlu digaris bawahi untuk konsep pemikirannya sendiri tidak serta merta anda menuliskan ketiga library ini. Library tersebut muncul pada saat admin benar-benar akan menggunakannya. Tiga langsung begitu saja ditulis diawal. Tapi dibawah ini admin tuliskan apa adanya code yang telah admin buat terlebih dahulu.

import requests
from bs4 import BeautifulSoup
import pandas as pd

#empty array for stored 
rjudul=[]
rtahun=[]
rlink=[]
rsinopsis=[]

#fix scrape for multipage
page = 0
while (page <= 640):
    url ="http://filmindonesia.or.id/movie/title/list/genre/horor/"+str(page)
    film = requests.get(url)
    page=int(page)
    page += 10
    #print(url)
    soup=BeautifulSoup(film.content,'html.parser')
    #print (soup.prettify())
    
    judul = soup.select(".movie-list .clearfix .content-lead > a:nth-of-type(1)")
    juduls = [js.get_text() for js in judul]
    rjudul+=juduls
    
    tahun = soup.select(".movie-list .clearfix .content-lead > a:nth-of-type(2)")
    tahuns = [ts.get_text() for ts in tahun]
    rtahun+=tahuns
    
    link = soup.select(".movie-list .clearfix .content-lead > a:nth-of-type(1)")
    links = [ls['href'] for ls in link]
    rlink+=links
    
    #issue null value
    sinopsis=soup.find_all('li','clearfix')
    for sinopsiss in sinopsis:
        #sinopsis=sin.p.get_text()
        try:
            sinopsis = sinopsiss.find('p').get_text()
        except AttributeError:
            sinopsis = "sinopsis tidak tersedia"
        rsinopsis.append(sinopsis)
    
#print(len(rjudul))
#print(len(rtahun))
#print(len(rlink))
#print(len(rsinopsis))
#array to dataframe pandas
daftar_film={'juduls':rjudul,'tahuns':rtahun, 'link':rlink, 'sinopsis':rsinopsis}
df=pd.DataFrame(daftar_film)
print(df)
df.to_csv('indonesian_horor_movie.csv')

Berikutnya untuk kerangka berfikirnya, admin membuatnya seperti ini.

Tentukan url main target yang akan kamu scrape, dalam hal ini admin memilih http://filmindonesia.or.id/movie/title/list/genre/horor/ Sebagai halaman yang akan admin scrape dengan menggunakan jupyter notebook pythone.

import requests

Mencari library yang dapat digunakan untuk mengirim request untuk mengakses halaman tersebut untuk berikutnya discrape. Cukup anda ketikan digoogle Library to Scrape with Python or Scrape With Python. Dari sana admin mendapatkannya banyak informasi Akan tetapi kali ini admin mendapatkan informasi tersebut dari teman admin. Yakni dengan menggunakan requests. untuk mengaksesnya cukup anda ketikan requests.get(url) dengan link tadi anda masukan kedalam variabel url.
url ="http://filmindonesia.or.id/movie/title/list/genre/horor/"
film = requests.get(url)
Namun berdasarkan link dari url tersebut ternyata untuk isinya dibagi kedalam beberapa halaman, jadi kita harus melakukan scrape beberapa halaman atau scrape next page atau scrape multiple page. Bagaimana idenya? Admin sendiri menggunakan perulangan atau looping dalam hal ini yakni dengan while. kita bisa melihat dari perbedaan tiap next halamannya yakni dari http://filmindonesia.or.id/movie/title/list/genre/horor/ ke http://filmindonesia.or.id/movie/title/list/genre/horor/10 untuk page atau halaman berikutnya jadi kita menggunakan perubahan itu untuk membuat loopnya. Dimana akan terjadi penambahan 10 setiap loopnya, namun karena 10 merupakan int dan link tersebut dianggap str jadi kita mencoba untuk menyesuaikannya dengan menggunakan variabel page
page = 0
while (page <= 640):
    url ="http://filmindonesia.or.id/movie/title/list/genre/horor/"+str(page)
    film = requests.get(url)
    page=int(page)
    page += 10
untuk pembatasnya disesuaikan dengan jumlah pagenya, namun jika anda tidak mengetahui ambil saja angka terbesar. Disini saya mengambil 640 karena digenre yang lain ada yang menyentuh angka tersebut. Jika tidak salah bergenre film indonesia bergenre action, jadi bisa diganti-ganti ya genrenya, namun karena admin suka horor jadi ambil horor

Berikutnya agar lebih rapih kita akan menggunakan library lainnya yakni beautifulsoup, silakan anda baca documentasinya untuk lebih memahaminya.

from bs4 import BeautifulSoup
Sekarang kita akan mencoba untuk merapikan requests yang telah kita buat sebelumnya didalam soup seperti dibawah ini.

soup=BeautifulSoup(film.content,'html.parser')
Jika anda ingin melihat perbedaannya silakan print beberapa variabel yang memuat request dan variabel yang memuat beautifulsoup. atau silakan print url, apakah sudah berjalan sesuai dengan perulangannya

print (url)
Selanjutnya silakan perhatikan code diatas ya, anda coba-coba sendiri biar paham. Kalau dijelasin semua nanti tidak ada inisiatifnya, anda coba pahami terlebih dahulu, baru jika ada yang bingung silakan ditanyakan. Syukur-syukur bisa paham langsung. Untuk anda yang ingin code dalam bentuk file format jupyter notebook atau hasil scrapenya silakan kunjungi github admin ya di

https://github.com/andriimanundin27/scrape_indonesia_movie_horor_webpage

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

Add Comment
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