Machine Learning Dengan Python
Machine Learning Dengan Python
DENGAN PYTHON
Dengan Contoh Pengaplikasian di Bidang Medis
Penerbit ANDI
PRAKATA
S
ebagai pengguna Machine Learning sejak tahun 2020 maka buku yang berjudul Machine
Learning dengan Python – Dengan Contoh Pengaplikasian di Bidang Medis ini dapat
menjadi contoh sederhana bagi para pemula dalam melakukan coding dan analisis
data dengan Python. Buku ini disusun untuk para pemula agar mempunyai pemahaman yang
cukup dan dapat bekerja dengan Machine Learning. Adanya berbagai informasi dari internet
dan YouTube terkait Machine Learning dapat melengkapi pengetahuan yang diperlukan dalam
buku ini.
Buku ini ditulis sebagai kegiatan bersama dengan mahasiswa dalam mempelajari
Machine Learning sehingga materi yang dituliskan juga merupakan bentuk latihan bersama
dengan mahasiswa. Selain itu, materi penulisan dibuat dalam masa pandemi, yaitu tahun
2020-2022. Hal ini menyebabkan salah satu bab, yaitu Bab IV diperuntukkan sebagai bukti
kontribusi penulis dalam melakukan penelitian terkait Covid-19. Oleh karena itu, diharapkan
pembaca juga dapat menggunakan materi buku ini sebagai sumber belajar, khususnya dalam
penelitian pengolahan data Covid-19 dengan Machine Learning.
DAFTAR ISI
PRAKATA................................................................................................................................ iii
DAFTAR ISI............................................................................................................................. iv
Gambar 4.29 Data masih tidak terpisah secara linear pada ruang 3 dimensi
Gambar 4.30 Ilustrasi SVM dengan pemisahan data tak linear
Gambar 5.1 Contoh struktur pohon keputusan (decision tree)
Gambar 5.2 Bola dengan warna sama dan berbeda
Gambar 5.3 Sketsa decision tree yang diperoleh (hasil kode penulisan tidak cukup jelas)
Gambar 6.1 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Suspek (rentan)’ pada
periode 30 Maret-7 November 2020
Gambar 6.2 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Terkonfirmasi’ pada
periode 30 Maret-7 November 2020
Gambar 6.3 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Terkonfirmasi’ pada
periode 30 Maret-7 November 2020
Gambar 6.4 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Terkonfirmasi’, ‘Sembuh’,
dan ‘Meninggal’ pada periode 30 Maret-7 November 2020
Gambar 6.5 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Meninggal’ pada periode
30 Maret-7 November 2020
Gambar 6.6 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Meninggal’ pada periode
30 Maret-7 November 2020
Gambar 6.7 Tampilan data yang akan diolah (kasus Covid-19 hingga 2 Desember 2021)
sebanyak 21759 rows × 38 columns
Gambar 6.8 Kasus aktif untuk Indonesia pada periode Maret-Desember 2021 pada sumbu
horizontal tanggal (ditulis Date) dan banyaknya kasus (sumbu vertikal)
Gambar 6.9 Kasus selesai (meninggal atau sembuh) untuk Indonesia pada periode Maret-
Desember 2021 pada sumbu horizontal tanggal (ditulis Date) dan banyaknya
kasus (sumbu = vertikal)
Gambar 6.10 Kasus pertumbuhan mingguan untuk Indonesia pada periode Maret-Desember
2021 pada sumbu horizontal dan banyaknya kasus (sumbu = vertikal)
Gambar 6.11 Kasus pertumbuhan mingguan total kasus untuk Indonesia periode Maret-
Desember 2021 pada sumbu horizontal dan banyaknya kasus (sumbu =
vertikal)
Gambar 6.12 Kasus pertumbuhan mingguan kasus kematian untuk Indonesia periode Maret-
Desember 2021 pada sumbu horizontal dan banyaknya kasus (sumbu vertikal)
Gambar 6.13 Kasus pertumbuhan kasus kematian, sembuh, total kasus untuk Indonesia
periode Maret-Desember 2021 pada sumbu horizontal dan banyaknya kasus
(sumbu vertikal)
Gambar 6.14 Kasus pertumbuhan harian kasus kematian, sembuh, total kasus untuk
Indonesia periode Maret-Desember 2021 pada sumbu horizontal dan
banyaknya kasus (sumbu vertikal)
DaŌar Gambar xi
Gambar 6.15 Lokasi 10 terbanyak untuk total kasus Covid-19 di Indonesia periode Maret
2021-Oktober 2021
Gambar 6.16 Lokasi 10 terbanyak untuk total kasus sembuh Covid-19 di Indonesia periode
Maret 2021-Oktober 2021
Gambar 6.17 Lokasi 10 terbanyak untuk total kasus kematian Covid-19 di Indonesia periode
Maret 2021-Oktober 2021
Gambar 6.18 Lokasi 10 terbanyak untuk total kasus Covid-19 pada 24 jam terakhir di
Indonesia periode Maret 2021-Oktober 2021
Gambar 6.19 Lokasi 10 terbanyak untuk total kasus sembuh Covid-19 pada 24 jam terakhir
di Indonesia periode Maret 2021-Oktober 2021
Gambar 6.20 Lokasi 10 terbanyak untuk total kasus kematian Covid-19 pada 24 jam terakhir
di Indonesia periode Maret 2021-Oktober 2021
Gambar 6.21 Lokasi 10 provinsi terbanyak untuk total kasus aktif Covid-19 di Indonesia
periode Maret 2021-Oktober 2021
Gambar 6.22 Lokasi 10 provinsi terbanyak untuk total kasus selesai (mati/sembuh) Covid-19
di Indonesia periode Maret 2021-Oktober 2021
Gambar 6.23 Hasil model Elbow pada klasterisasi K-means data kematian dan sembuh
kasus Covid-19 di Indonesia periode Maret 2021-Oktober 2021
Gambar 6.24 Hasil klasterisasi hierarki data kematian dan sembuh kasus Covid-19 di
Indonesia periode Maret 2021-Oktober 2021
Gambar 6.25 Klasifikasi data kasus Covid-19 antara kematian dan sembuh dalam kelompok
provinsi dalam 3 kluster dengan memperhatikan rata-rata tingkat sembuh dan
rata-rata tiap kematian
Gambar 6.26 Daftar tanggal pada data yang diolah
Gambar 6.27 Contoh tampilan yang terkonfirmasi dari 5 baris pertama (‘confirmed’) data
yang diolah
Gambar 6.28 Hasil pendataan yang didaftar dengan melakukan running program pada
tanggal 16 Juli 2022 maka tercatat data hingga 15 Juli 2022
Gambar 6.29 Visualisasi prediksi linear dan data uji dengan kasus yang terkonfirmasi data
kasus Covid-19 dunia sejak Januari 2020 hingga Maret 2020
Gambar 6.30 Visualisasi prediksi model Bayesian terhadap data uji dengan kasus yang
terkonfirmasi data kasus Covid-19 dunia
BAB 1
PENGENALAN PEMBELAJARAN
MESIN (MACHINE LEARNING)
UNTUK ANALISIS DATA
mudahnya dengan pertanyaan berikut: dapatkah mesin melakukan apa yang kita pikirkan?
Pada tahun 2006, Tom Michell juga menegaskan bahwa ML sebagai irisan dari Ilmu Komputer
dan Statistik. Pada ilmu komputer lebih memfokuskan bagaimana komputer diprogram,
sedangkan pada ML memfokuskan pada bagaimana komputer memprogram sendiri dengan
diberikan struktur awal. Demikian pula, statistik memfokuskan pada kesimpulan yang dapat
di inferensi dari data, sedangkan ML menambahkan pada pertanyaan tentang bagaimana
arsitektur komputasi dan algoritma dapat digunakan secara paling efektif, penggabungan
data, bagaimana mempelajari subtugas (multitasking) yang dapat disusun dalam sistem yang
lebih besar; ML juga menjawab pertanyaan tentang penelusuran komputasi (Mohammed et
al., 2017).
Contoh sederhana berikut memberikan motivasi bagaimana algoritma dibangun. Misalkan
kawanan tikus mencari makanan dan menemukan secara tiba-tiba dengan kelihatan bagus dan
menarik maka tikus akan memakannya sedikit demi sedikit. Jika makanan terasa enak maka
tikus akan melanjutkan makan. Jika tikus merasakan makanan tidak enak maka makanan tidak
dimakan. Jika makanan memuat racun dimakan tikus maka pada periode tertentu tikus tidak
mencari makanan pada lokasi di mana makanan tikus diperoleh. Ada proses pembelajaran
secara natural di mana tikus dapat mengenali bahwa makanan pada lokasi yang sama beracun
sehingga tidak datang pada lokasi tersebut untuk periode tertentu.
Diinspirasi oleh sifat natural tersebut, misalkan kita dapat membangun algoritma untuk
mengoleksi e-mail yang tergolong spam. Mesin akan mengingat bagaimana berdasarkan
pengetahuan sebelumnya bahwa e-mail dikatakan spam oleh pengguna maka email yang
datang selanjutnya dapat tergolong spam dan bukan spam. Jadi pendekatan cara kerja
demikian dikatakan ‘pembelajaran karena pengingat’. Hal ini mempunyai kekurangan dalam
aspek pembelajaran, yaitu kemampuan memberi label pada pesan e-mail yang tidak terlihat.
Suatu pembelajaran berhasil jika dapat melakukan kemajuan secara individu dalam melakukan
perumuman yang lebih luas. Untuk mencapai perumuman dalam tugas melakukan filterisasi
e-mail pada spam, pembelajar dapat menelusuri e-mail-e-mail yang sebelumnya dilihat dan
melakukan ekstraksi kata-kata dalam pesan yang terindikasi spam. Ketika e-mail baru datang,
mesin dapat menguji apakah kata-kata dalam e-mail tersebut sebagai spam dan menduga
labelnya. Sistem yang demikian dapat menduga secara benar pelabelan dalam e-mail-e-mail
yang tidak terlihat. Cara seperti ini disebut cara berpikir induktif. Akan tetapi, cara induktif ini
bisa selalu benar sebagaimana dijelaskan pada kasus perilaku merpati berikut.
Kasus tersebut dikenal sebagai Pigeon Superstition. Seorang tokoh psikolog pada
bidang perilaku dari Amerika menempatkan sekumpulan burung merpati dalam suatu sangkar.
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 3
Mekanisme otomatis dilakukan, yaitu mengirimkan makanan dalam sangkar pada interval
waktu tertentu tanpa memperhatikan perilaku burung-burung tersebut sebelumnya. Burung-
burung tersebut makan pada makanan yang pertama kali dikirimkan dan setiap burung
melakukan beberapa aktivitas (mengambil makanan, memutar kepala, dan seterusnya).
Setiap awal pengiriman makanan, setiap burung melakukan aksi spesifik dan akibatnya
setiap burung cenderung memerlukan waktu untuk melakukan aksi yang sama. Kemudian,
perubahan pengiriman makanan dilakukan secara random, setiap burung melakukan hal yang
sama, pada saat awal bagaimana makanan dikirimkan. Hal ini dilakukan dengan disiplin oleh
burung-burung itu. Video yang terkait dengan penjelasan Skinner dijelaskan pada YouTube
(https://yout.com/video/QKSvu3mj-14/). Pada video ditunjukkan bagaimana burung dalam
eksperimen diberi makan pada awal dengan suara pemberian makan tertentu. Jika pemberian
makan diberi kode dengan cahaya maka burung tidak menunjukkan perilaku mengambil
makanannya. Pada video serupa, seorang anak diberi makanan dari suatu meja. Jika meja
ditinggikan, anak tersebut secara otomatis mengambil kursinya untuk dapat meraih makanan
yang semula terjangkau, tetapi menjadi tidak terjangkau.
Mekanisme pembelajaran apa yang membedakan antara perilaku burung dengan
pembelajar pada manusia? Hal ini merupakan pertanyaan krusial dalam pengembangan
pembelajar otomatis. Pembelajar manusia dapat bersandar pada common sense (pemahaman
umum) untuk melakukan filter terhadap pembelajaran yang tidak bermakna secara random.
Jika kita sudah menyerahkan tugas demikian pada mesin, kita harus membuat prinsip crisp
(pengodean) yang baik yang akan melindungi program dari pencapaian kesimpulan yang tidak
bermakna. Pengembangan prinsip demikian merupakan pusat teori dari mesin pembelajaran
(machine learning). Yang menjadi masalah: mengapa pada tikus berhasil menggunakan
induksi, sedangkan pada burung merpati tidak bisa berlaku? Hal inilah yang dipelajari dalam
ML. Perbedaan keduanya inilah yang membuat bias dalam mekanisme pembelajaran dan juga
bias dalam induksi.
Machine learning atau pembelajaran mesin adalah ilmu atau studi yang mempelajari
tentang algoritma dan model statistik yang digunakan oleh sistem komputer untuk melakukan
tugas tertentu tanpa instruksi eksplisit. Machine learning bergantung pada pola dan kesimpulan.
Untuk mendapatkan pola dan kesimpulan tersebut, algoritma Machine learning menghasilkan
model matematika yang didasari dari data (Ghada et al., 2020)we present the most recent
breast cancer detection and classification models that are machine learning based models
by analyzing them in the form of comparative study. Also, in this paper, the datasets that are
public for use and popular as well are listed in the recent work to facilitate any new experiments
4 Machine Learning dengan Python
and comparisons. The comparative analysis shows that the recent highest accuracy models
based on simple detection and the classification architectures are You Only Look Once (YOLO.
Misalkan untuk mempelajari kanker payudara maka diambil sampel data penderita kanker
payudara yang sering disebut dengan ‘training data’.
Pembelajaran mesin digolongkan sebagai aplikasi kecerdasan buatan yang mampu
menyediakan sistem secara otomatis untuk mempelajari dan memperbaiki dari pengalaman
tanpa secara eksplisit deprogram. Pembelajaran mesin fokus pada perkembangan komputer
program yang dapat mengakses data dan menggunakannya untuk dirinya sendiri. Proses
pembelajaran dimulai dari mengobservasi data langsung dari pengamanan atau berdasarkan
instruksi untuk melihat pola data dan membuat keputusan yang lebih baik untuk mendatang
berdasarkan contoh-contoh yang disediakan. Tujuan utama adalah untuk mengizinkan
komputer mempelajari secara otomatis tanpa intervensi manusia dan dapat melakukan aksi
penyesuaian yang terkait.
pertama (training data) digunakan untuk pengembangan model. Bagian kedua (test data),
digunakan sebagai referensi.
4. Mengevaluasi Model
Untuk menguji keakuratan, bagian kedua dari data uji digunakan. Langkah ini menentukan
ketepatan dalam pemilihan algoritma berdasarkan hasil pengujian. Pengujian yang lebih
baik untuk memeriksa ketepatan model adalah dengan melihat kinerjanya pada data
yang tidak digunakan sama sekali selama pembuatan model.
5. Meningkatkan Kinerja
Langkah ini mungkin melibatkan pemilihan model yang berbeda atau memperkenalkan
lebih banyak variabel untuk meningkatkan efisiensi. Itulah sebabnya dibutuhkan banyak
waktu untuk pengumpulan data dan persiapan data.
Y = f(x)
Tujuannya adalah mendekati fungsi pemetaan sebaik mungkin sehingga input baru x dapat
memprediksi luaran Y untuk data tersebut. Tentunya mahasiswa pernah melakukan hal ini.
Proses algoritma ini dikatakan SL karena proses algoritma menggunakan himpunan data
latih (data training) yang dianggap sebagai pengajar yang membimbing dalam proses belajar.
Algoritma secara iteratif membuat prediksi pada data latih dan dikoreksi oleh pengajar. Proses
pembelajaran berhenti ketika algoritma pada level yang dapat diterima.
Catatan: perhatikan bahwa istilah pengajar di sini bukan personal selaku seseorang,
tetapi merupakan bagian dari algoritma.
Masalah SL dinyatakan dalam 2 grup, yaitu masalah regresi dan masalah klasifikasi.
Masalah klasifikasi: ketika variabel output sebagai variabel kategori, seperti merah atau biru,
berpenyakit atau tidak berpenyakit.
Masalah regresi: ketika variabel output berupa nilai real, seperti nilai rupiah, berat.
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 7
Sebenarnya SL untuk tingkat lanjut, masih memuat beberapa bagian sebagaimana pada
Tabel 1.2 yang ditulis dalam bahasa Inggris agar pembaca dapat merujuk dengan kata kunci
yang sama pada literatur ataupun internet.
8 Machine Learning dengan Python
Tabel 1.2 Daftar SL dalam Bahasa Inggris dan Bahasa Indonesia Tingkat Lanjut
Daftar SL Tingkat Lanjut dalam Bahasa Daftar SL Tingkat Lanjut dalam Bahasa
Inggris Indonesia
Naive Bayes Classifiers Klasifikasi Bayes Standard
Random Forests Hutan Acak
Gradient Boosted Decision Trees Pohon Keputusan yang Ditingkatkan
Neural Networks Kemiringannya
Deep Learning (Optional) Pembelajaran Dalam
Data Leakage Kebocoran Data
Dimensionality Reduction Pengurangan Dimensi
Manifold Learning Clustering Berlapis Klastering
premiums, and for low-risk areas, there will be an increase in the premium burden that
must be paid. On the basis of the results of the analysis on the insurance model, it was
found that the insurance premiums in each province varied. The results of this study are
expected to be a reference for the government and private companies in implementing
disaster insurance in Indonesia. In addition, the results of this study can be a means of
developing innovations for disaster risk management that occurs.”,”author”:[{“dropping-pa
rticle”:””,”family”:”Kalfin”,”given”:””,”non-dropping-particle”:””,”parse-names”:false,”suffix”:
””},{“dropping-particle”:””,”family”:”Sukono”,”given”:””,”non-dropping-particle”:””,”parse-na
mes”:false,”suffix”:””},{“dropping-particle”:””,”family”:”Supian”,”given”:”Sudradjat”,”non-
dropping-particle”:””,”parse-names”:false,”suffix”:””},{“dropping-particle”:””,”family”:”Mam
at”,”given”:”Mustafa”,”non-dropping-particle”:””,”parse-names”:false,”suffix”:””}],”contain
er-title”:”Computation”,”id”:”ITEM-1”,”issue”:”10”,”issued”:{“date-parts”:[[“2022”]]},”title”:”I
nsurance Premium Determination Model and Innovation for Economic Recovery Due to
Natural Disasters in Indonesia”,”type”:”article-journal”,”volume”:”10”},”uris”:[“http://www.
mendeley.com/documents/?uuid=895d0e19-cceb-46e2-a410-83ca5c2e4dcb”]}],”mendel
ey”:{“formattedCitation”:”(Kalfin et al., 2022. Beberapa contoh algoritma yang digunakan
adalah Nearest Neighbor, Naïve Bayes, Decision Tree, Regression, dan lain-lain.
2. Model Unsupervised Learning
Model ini digunakan untuk melatih di mana tidak ada target yang ditetapkan dan tidak ada
faktor yang penting dari yang lainnya. Sebagai contoh, penggunaan model unsupervised
learning ini, bila seorang penjual pengecer ingin mengetahui kombinasi produk apa yang
cenderung lebih sering dibeli konsumen. Di industri farmasi, digunakan untuk memprediksi
penyakit mana yang mungkin terjadi bersamaan dengan diabetes. Contoh algoritma yang
digunakan di model ini: K-Means Clustering Algorithm.
3. Reinforcement Learning (RL)
Model ini adalah contoh pembelajaran mesin di mana mesin dilatih untuk mengambil
keputusan spesifik berdasarkan kebutuhan bisnis dengan tujuan utama untuk
memaksimalkan efisiensi (kinerja). Ide dari Reinforcement Learning ini adalah mesin/
perangkat lunak melatih dirinya secara terus-menerus berdasarkan lingkungan yang
dipengaruhinya, dan menerapkan pengetahuan yang diperkaya untuk memecahkan
masalah bisnis. Proses belajar yang terus-menerus ini memastikan lebih sedikit
keterlibatan manusia sehingga akan banyak menghemat waktu. Contoh algoritma yang
digunakan dalam RL adalah Markov Decision Process.
10 Machine Learning dengan Python
gunakan dalam algoritma SL sebagai data training dan menggunakan model untuk membuat
prediksi pada data baru yang tidak terlihat.
Kesimpulan Sementara
Sebagai kesimpulan untuk diskusi di atas, kita dapat mengatakan:
SL : Semua data berlabel dan algoritma belajar untuk memprediksi luaran dari data input.
UL : semua data tidak berlabel dan algoritma mempelajari struktur data input.
SSL : beberapa data berlabel, tetapi sebagian besar tidak berlabel dan campuran metode SL
dan USL digunakan.
Apakah selama ini para peneliti belum melakukan pengembangan hal ini sebelum istilah atau
ilmu ML dikembangkan? Jika dicermati, ML muncul sehubungan kompleksitas data yang timbul
dan perubahan yang berlaku secara simultan dengan perubahan data serta sangat cepat. ML
memberikan generalisasi terhadap beberapa metode klasik yang sudah ada, seperti regresi
dan clustering, serta memberikan pengembangan terhadap metode klasik tersebut dengan
bahasa pemrograman yang up to date saat ini.
Data
(Te)
(Te)
Perhatikan bahwa dalam penulisan di atas kita hanya belajar dalam membaca data,
membersihkan data, dan mengevaluasi data terhadap beberapa model sehingga dapat dipilih
secara otomatis atas model-model yang dipilih. Terdapat banyak model yang sudah diujicobakan
terhadap data tersebut di mana kita belum menelusuri masing-masing model secara lebih
detail, yaitu K-Nearest Neighbors, Support Vector Classifier, Logistic Regression,
Gaussian Naive Bayes, Random Forest and Gradient Boost, akan tetapi telah dipelajari
melalui video. Pemilihan data terhadap model Logistic Regression menunjukkan bahwa model
yang lain dapat underfitting atau overfitting. Selain memahami masing-masing model lebih
detail maka hasil pemodelan terhadap data dengan LR perlu diperhatikan lebih lanjut.
Contoh 1.1
Misalkan kita membangkitkan data sebagai fungsi + di mana dan sebagai bilangan random
agar data yang dibangkitkan dari fungsi memuat derau (noise). Kemudian diasumsikan bahwa
data (pasangan (x,y)) tersebut sebagai fungsi polinomial derajat 1, 4, dan 15. Tentu saja
polinomial derajat 1 tidak cukup. Secara langsung, telah diketahui data tidak berpola linear
sehingga pendekatan sebagai fungsi polinomial derajat 1 masih kurang tepat. Pendekatan ini
dikatakan underfitting. Sedangkan polinomial derajat 4 dan 15 merupakan kandidat yang dapat
dianggap tepat menyatakan fungsi cosinus di atas. Akan tetapi, jika polinomial derajat 4 sudah
terlihat cukup baik secara visual menyatakan fungsi cosinus di atas maka polinomial derajat
15 mendekati data tersebut terlalu berlebihan sehingga disebut overfitting. Perhatikan bahwa
menyatakan fungsi sebagai polinomial derajat 15 berarti terdapat 16 parameter polinomial
yang harus ditentukan. Secara komputasi, polinomial derajat 15 lebih kompleks dibandingkan
menentukan polinomial derajat 4. Program di bawah menjelaskan hal ini dengan luaran
Gambar 1.3.
Contoh 1.2a
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
def true_fun(X):
return np.cos(1.5 * np.pi * X)
np.random.seed(0)
n_samples = 30
degrees = [1, 4, 15]
X = np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1
18 Machine Learning dengan Python
plt.figure(figsize=(14, 5))
for i in range(len(degrees)):
ax = plt.subplot(1, len(degrees), i + 1)
plt.setp(ax, xticks=(), yticks=())
polynomial_features =
PolynomialFeatures(degree=degrees[i],
include_bias=False)
linear_regression = LinearRegression()
pipeline = Pipeline([(“polynomial_features”,
polynomial_features),
“linear_regression”, linear_regression)])
pipeline.fit(X[:, np.newaxis], y)
plt.legend(loc=”best”)
plt.title(“Derajat polinomial {}\nMSE = {:.2e}(+/-
{:.2e})”.format(
degrees[i], -scores.mean(), scores.std()))
plt.show()
Gambar 1.3 Ilustrasi underfitting (kiri), overfitting (kanan), dan fitting yang tepat (tengah)
Pada Gambar 1.3 ditunjukkan bagaimana kedua istilah, yaitu underfitting dan overfitting
diilustrasikan. Pola data dapat diilustrasikan secara masuk akal dengan polinomial derajat 4.
Sebelum kita melakukan penjelasan tahap-tahap pengolahan data dalam ML maka berikut ini
perlu dijelaskan bagaimana proses pengolahan data dengan ML dilakukan.
Contoh 1.2b
Pada bagian ini akan ditunjukkan tahapan yang dijelaskan di atas untuk data observasi yang
diperoleh di internet, yaitu untuk observasi terhadap penyakit diabetes.
1. Latar Belakang
Diabetes dikenal sebagai penyebab kematian dini dan disabilitas. Oleh karena itu,
diabetes merupakan salah satu dari 4 penyakit yang ditargetkan untuk dicegah dan
dikontrol dalam dunia sejak 2013 menurut WHO. Pada tahun 2012, tercatat bahwa 1.5
kematian manusia di bumi dikarenakan diabetes di mana sebagai tingkat ke-8 penyebab
kematian dan sebagai penyebab kematian pada wanita tingkat ke-5 di dunia.
20 Machine Learning dengan Python
Diabetes merupakan salah satu penyakit yang dianggap kronis ketika pankreas tidak
berfungsi dalam menghasilkan insulin (hormon yang mengatur gula darah) dan/atau
ketika tubuh tidak efektif memproduksi insulin. Ada 2 tipe diabetes yang juga dikenal.
Tipe 1 diabetes dikenal sebagai kebergantungan insulin yang dicirikan oleh penurunan
produksi insulin sehingga penderita harus secara teratur mengonsumsi insulin untuk
mengatur glukosa dalam darah. Tipe ini tidak diketahui penyebabnya dan masih belum
dapat dicegah. Untuk penderita diabetes tipe 2 disebut juga penderita yang bergantung
pada non-insulin yang sebagian besar terjadi pada manusia dewasa di mana gejalanya
seperti pada tipe 1 hanya saja tidak terdiagnosis pada beberapa tahun hingga terjadi
komplikasi. Jenis lain adalah bentuk transisi antara tipe 1 dan tipe 2 yang disebut Impaired
Glucose Tolerance (IGT) dan Impaired Fasting Glycaemia (IFG) di mana orang dalam
kondisi ini sering kali dalam kondisi gula darah tidak normal sehingga terjadi serangan
jantung dan stroke. Demikian pula Gestational Diabetes (GDM) merupakan salah satu
jenis penyakit diabetes dengan kondisi temporer yang mana terjadi pada kehamilan.
Hal ini terjadi ketika glukosa dalam darah bernilai di atas normal, tetapi masih kondisi di
bawah terdiagnosis sebagai penderita diabetes. Risiko meningkat selama kehamilan dan
dapat diturunkan kepada calon bayi.
Dengan memperhatikan tingginya pengaruh penyakit diabetes terhadap kematian
manusia di dunia, penelitian terhadap pencegahan dan penyembuhan terhadap penyakit
ini telah banyak dilakukan oleh para peneliti. Salah satu data penelitian telah dinyatakan
di internet terhadap 768 orang wanita dengan 9 faktor dari National Institute of Diabetes
and Digestive and Kidney Diseases. Data dicatat baik terhadap pasien yang terdiagnosis
diabetes ataupun tidak. Beberapa faktor tersebut akan ditinjau lebih detail dalam tulisan
ini. Faktor yang diukur tentunya faktor-faktor yang dianggap berpengaruh secara signifikan
terindikasi tidaknya seseorang sebagai penderita diabetes. Oleh karena itu, keadaan
hamil atau tidak dicatat sebagai salah satu faktor.
Adapun faktor-faktor selengkapnya adalah:
Kehamilan : Banyaknya kehamilan yang pernah dialami.
Glukosa : Konsentrasi glukosa dalam 2 jam tes toleransi glukosa dalam uji gula
darah.
Tekanan darah : tekanan darah dalam keadaan diastolik (mm/Hg).
Tebal kulit : ketebalan lipatan dalam otot di bawah kulit (mm).
Insulin : serapan serum insulin dalam 2 jam (mu U/ml satuan).
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 21
BMI (Body Mass Index): berat dalam kg/tinggi dalam meter kuadrat.
Fungsi pedigree : merupakan sejarah diabetes mellitus yang relatif terkait dengan faktor
genetik.
Umur : umur pasien (dalam tahun).
Luaran : variabel kelas (0 atau 1), 1: untuk pasien terdiagnosis diabetes, 0: untuk
pasien terdiagnosis tidak diabetes.
BMI pada umumnya pada 18.5-24.9 dikatakan normal, sedangkan dalam nilai 25-29.9
dikatakan berat berlebih, dan jika > 30 maka dikategorikan obesitas.
2. Langkah-Langkah Pengolahan Data
a. Pembacaan Data
Penamaan variabel untuk 9 faktor di atas sebagai berikut: Kehamilan, Glukosa,
Tekanan Darah, Tebal Kulit, Insulin, BMI, Fungsi Pedigree, Umur, Luaran. Contoh
daftar data ditunjukkan pada Tabel 1.3.
Tabel 1.3 Contoh data yang Dianalisis Hasil Observasi oleh National Institute of Diabetes
and Digestive and Kidney Diseases terhadap 768 wanita
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
diabetes= pd.read_csv(.....diabetesIndo.csv’)
diabetes.columns
Hasil program:
Index([u’Kehamilan’, u’Glukosa’, u’Tekanandarah’,
u’Tebalkulit’, u’Insulin’,
u’BMI’, u’FungsiPedigree’, u’Umur’, u’Luaran’],
dtype=’object’)
Hasil program:
Hasil program:
Dimensi data diabetes: (768, 9)
Hasil program:
Luaran
0 500
1 268
dtype: int64
Hasil program:
Luaran
0 [[AxesSubplot(0.125,0.670278;0.215278x0.209722...
1 [[AxesSubplot(0.125,0.670278;0.215278x0.209722...
dtype: object
24 Machine Learning dengan Python
Penjelasan:
Perhatikan bahwa Gambar 1.4 dan 1.5 menunjukkan distribusi data untuk masing-masing
faktor.
26 Machine Learning dengan Python
b. Membersihkan Data
Beberapa proses membersihkan data dikarenakan:
1) Observasi ganda ataupun tidak relevan.
2) Salah dalam pelabelan, kategori yang sama terjadi berulang.
3) Data hilang atau ada data yang kosong (null data).
4) Terdapat outlier yang tidak diharapkan.
Pada kegiatan ini dapat dianggap bahwa tentang bagian a atau b sudah baik
(observasi relevan dan tidak salah dalam pelabelan). Untuk itu, kita mengobservasi
ada tidaknya data yang hilang.
Langkah 6. #Untuk mengenali ada tidaknya missing data, ternyata hasil menunjukkan
tidak adanya data yang kosong.
diabetes.isnull().sum()
diabetes.isna().sum()
Hasil program:
Kehamilan 0
Glukosa 0
Tekanandarah 0
Tebalkulit 0
Insulin 0
BMI 0
FungsiPedigree 0
Umur 0
Luaran 0
dtype: int64
Penjelasan: tidak ada data yang missing. Akan tetapi, ketika data ditelusuri, terdapat
kesalahan karena seseorang tidak mungkin mempunyai tekanan darah 0. Dengan
menelusuri data maka terdapat 35 orang yang terhitung bertekanan darah 0.
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 27
Hasil program:
(‘Total : ‘, 35)
Luaran
0 19
1 16
Name: Umur, dtype: int64
Langkah 8. Mencermati level glukosa plasma: sekalipun sudah puasa, level glukosa
tidak mungkin 0 sehingga jika level glukosa bernilai 0 berarti terdapat kesalahan data.
Dengan mengobservasi data maka diperoleh 5 orang mempunyai nilai glukosa 0.
print(“Total : “, diabetes[diabetes.Glukosa ==
0].shape[0])
Hasil program:
(‘Total : ‘, 5)
Langkah 9. Dari 5 orang di atas akan dicermati berapa orang yang teridentifikasi diabetes
(berlabel 1) dan yang tidak diabetes (berlabel 0)
print(diabetes[diabetes.Glukosa ==0].groupby(‘Luaran’)
[‘Umur’].count())
28 Machine Learning dengan Python
Hasil program:
Luaran
0 3
1 2
Name: Umur, dtype: int64
Langkah 10. Demikian pula, kita akan mencermati berdasarkan Tebal kulit di mana orang
normal ketebalan bawah kulit tidak boleh lebih kecil dari 10 mm. Dari program diperoleh
bahwa yang bernilai 0 sebanyak 227.
Program
print(“Total : “, diabetes[diabetes.Tebalkulit ==
0].shape[0])
print(diabetes[diabetes.Tebalkulit ==
0].groupby(‘Luaran’)[‘Umur’].count())
Hasil program:
(‘Total : ‘, 227)
Luaran
0 139
1 88
Name: Umur, dtype: int64
Penjelasan: Jadi dari 227 orang teridentifikasi tebal kulit 0 maka untuk orang yang tidak
teridentifikasi diabetes (berlabel 0) ada 139 dan yang berlabel 1 ada 88 orang.
Langkah 11. Demikian pula untuk BMI, tidak boleh teridentifikasi BMI bernilai 0, untuk itu
dihitung berapa orang BMI bernilai 0 dan berdasarkan kelasnya maka dapat teridentifikasi
dengan 9 orang yang tidak diabetes dengan BMI bernilai 0 dan 2 orang BMI dengan nilai
0 untuk 2 orang diabetes.
#BMI tidak boleh lebih kecil dari nol
print(“Total : “, diabetes[diabetes.BMI ==
0].shape[0])
print(diabetes[diabetes.BMI == 0].groupby(‘Luaran’)
[‘Umur’].count())
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 29
Hasil program:
Outcome
0 9
1 2
Name: Age, dtype: int64
Langkah 12. Secara sama, kita dapat mengidentifikasi kadar insulin pada tiap kelas.
Pada situasi sangat jarang, seseorang dapat mempunyai insulin 0, tetapi berdasarkan
data observasi maka terdapat 374 orang dinyatakan berkadar insulin 0.
Program:
print(“Total : “, diabetes[diabetes.Insulin ==
0].shape[0])
print(diabetes[diabetes.Insulin ==
0].groupby(‘Luaran’)[‘Umur’].count())
Hasil program:
(‘Total : ‘, 374)
Luaran
0 236
1 138
Name: Umur, dtype: int64
Hasil program:
(724, 9)
Penjelasan: Jadi semula data observasi memuat 768 orang maka data dibuang menjadi
724 di mana data yang dibuang memuat data yang invalid.
30 Machine Learning dengan Python
Umumnya, faktor teknis ditunjukkan sebelum pemilihan model. Akan tetapi, pada makalah
ini kita melakukan pendekatan yang berbeda. Faktor teknis (ditulis dalam bahasa Inggris
adalah Feature Engineering). Pendekatan tersebut yaitu mencermati semua faktor dalam
data dan mendiskusikan seberapa penting faktor-faktor tersebut dalam model.
f. Pemilihan Model
Pemilihan model atau algoritma pemilihan merupakan algoritma yang paling menarik
dan menjadi jantung utama dalam machine learning. Hal ini merupakan fase di
mana kita memilih model dan menampilkan data secara terbaik. Langkah awal yang
dilakukan adalah melakukan Uji Akurasi dari model-model klasifikasi berdasarkan
parameter yang sudah ditetapkan untuk tiap model dikatakan baik. Algoritma
utama untuk hal ini adalah K-Nearest Neighbors, Support Vector Classifier, Logistic
Regression, Gaussian Naive Bayes, Random Forest and Gradient Boost sebagai
pengklasifikasi model terbaik.
Langkah 15. Kita akan menginisialisasi model-model klasifikasi dengan parameter yang
sudah baku (default) dan menambahkan parameter tersebut dalam daftar model.
Program:
models = []
models.append((‘KNN’, KNeighborsClassifier()))
models.append((‘SVC’, SVC()))
models.append((‘LR’, LogisticRegression()))
models.append((‘DT’, DecisionTreeClassifier()))
models.append((‘GNB’, GaussianNB()))
models.append((‘RF’, RandomForestClassifier()))
models.append((‘GB’, GradientBoostingClassifier()))
g. Mengevaluasi Model
Model mempunyai tujuan untuk memprediksi data yang di luar sampel data dan
model dapat kompleks sehingga dapat terjadi overfitting. Untuk menghindari hal-hal
demikian, terdapat 2 langkah awal:
1) Memisahkan data menjadi data latih dan data uji yang disebut train/test method.
2) Melakukan validasi silang K-kali yang disebut K-Fold Cross Validation.
Selanjutnya, algoritma akan memberikan nilai cross_val_score dari langkah ke-2 di
atas untuk mengevaluasi akurasi dari model dalam metode train/test.
Selanjutnya, kita akan memasangkan data terhadap setiap model dan menghitung akurasi
setiap model dengan nilai akurasi.
Program:
names = []
scores = []
for name, model in models:
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
scores.append(accuracy_score(y_test, y_pred))
names.append(name)
tr_split = pd.DataFrame({‘Nama’: names, ‘Nilai’:
scores})
print(tr_split)
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 33
Hasil program:
Nama Nilai
0 KNN 0.729282
1 SVC 0.657459
2 LR 0.767956
3 DT 0.701657
4 GNB 0.734807
5 RF 0.767956
6 GB 0.773481
Penjelasan: setiap model mempunyai nilai akurasi. Jika semua angka di belakang koma
signifikan maka model LR (Logistic Regression) dianggap paling akurat.
Hasil program:
Nama Nilai
0 KNN 0.719787
1 SVC 0.656279
2 LR 0.766781
3 DT 0.696252
4 GNB 0.757021
5 RF 0.743265
6 GB 0.776427
Penjelasan: dengan K=10 dinyatakan pada variabel nsplit=10 maka diperoleh bahwa
LR masih tetap sebagai kandidat model terbaik untuk memodelkan data yang sudah
dibersihkan atau mempunyai 77.64% akurasi.
Langkah 19. Bagian ini merupakan bagian yang menampilkan tabel akurasi dengan
grafik dan kita menggunakan menu seabond untuk itu.
Program:
axis = sns.barplot(x = ‘Nama’, y = ‘Nilai’, data = kf_
cross_val)
axis.set(xlabel=’Klasifikasi’, ylabel=’Akurasi’)
for p in axis.patches:
tinggi = p.get_height()
axis.text(p.get_x() + p.get_width()/2, tinggi +
0.005, ‘{:1.4f}’.format(tinggi), ha=”center”)
plt.show()
j. Kesimpulan
Model dipilih adalah Logistik Regression (LR). Untuk itu, data selanjutnya diolah
menggunakan model ini. Oleh karena itu, sebelum melakukan LR kita harus
menyimpan data yang sudah dibersihkan dalam format *csv yang baru untuk
dilakukan pemodelan.
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 35
Langkah 21. Memanggil data yang bersih saja setelah observasi di atas
diabetes_mod = diabetes[(diabetes.Tekanandarah != 0) &
(diabetes.BMI != 0) & (diabetes.Glukosa != 0)]
print(diabetes_mod.shape)
Luaran
(724, 9)
Tahap 1.
# hitung jarak Euclide dari data
from math import sqrt
# fungsi untuk menghitung jarak euclide antar 2 vektor
def euclidean_jarak(baris1, baris2):
jarak = 0.0
for i in range(len(baris1)-1):
jarak += (baris1[i] - baris2[i])**2
return sqrt(jarak)
38 Machine Learning dengan Python
distances = list()
for train_row in train:
dist = euclidean_jarak(test_row, train_row)
distances.append((train_row, dist))
distances.sort(key=lambda tup: tup[1])
neighbors = list()
for i in range(num_neighbors):
neighbors.append(distances[i][0])
return neighbors
Tahap 5.
#Data yang diuji
dataset = [[2.7810836,2.550537003,0],
[1.465489372,2.362125076,0],
[3.396561688,4.400293529,0],
[1.38807019,1.850220317,0],
[3.06407232,3.005305973,0],
[7.627531214,2.759262235,1],
[5.332441248,2.088626775,1],
[6.922596716,1.77106367,1],
[8.675418651,-0.242068655,1],
[7.673756466,3.508563011,1]]
dugaan = predict_classification(dataset, dataset[0], 3)
print(‘Yang diharapkan %d, Diperoleh %d.’ %
(dataset[0][-1], dugaan))
Luaran
Yang diharapkan 0, Diperoleh 0.
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 41
Bermain di luar
Hari ke- Cuaca Kelembapan Angin
Tidak (T)/Ya (Y)
H1 Panas Tinggi Lemah Tidak
H2 Panas Tinggi Kuat Tidak
H3 Nyaman Tinggi Lemah Ya
H4 Hujan Tinggi Lemah Ya
H5 Hujan Normal Lemah Ya
H6 Hujan Normal Lemah Ya
H7 Nyaman Normal Kuat Ya
H8 Panas Tinggi lemah Tidak
H9 Panas Normal Lemah Ya
H10 Hujan Normal Lemah Ya
H11 Panas Normal Kuat Ya
H12 Nyaman Tinggi Kuat Ya
H13 Nyaman Normal Lemah Ya
H14 Hujan Tinggi Kuat Tidak
Kemudian kita susun tabel frekuensi dengan setiap atribut dari data di atas
P(c)=P(yes)=10/14=0.71
Secara sama, kita dapat menyusun tabel likelihood untuk atribut yang lain.
NBC yang muncul bagi para dokter adalah bahwa semua informasi yang digunakan untuk
menjelaskan keputusan. Diagnosis dan prognosis medis dapat dilakukan untuk memberikan
diagnosis kepada pasien.
Ketika terdapat data medis, NBC memedulikan kejadian dengan banyak atribut untuk
membuat prediksi akhir dan memberikan penjelasan secara transparan untuk keputusan-
keputusan yang dibuat. Oleh karena itu, NBC dipandang sebagai salah satu klasifikasi yang
paling sangat berguna bagi kalangan dokter.
plt.scatter(3, 4, color=’red’)
circle = plt.Circle((3, 4), radius=2, alpha=0.4)
plt.gca().add_patch(circle)
plt.axis(‘scaled’)
plt.show()
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 47
self.no_of_classes = np.max(self.y_train) + 1
#
#Input: X - himpunan data uji
#
# radius = parameter yangmenyatakan seberapa besar
lingkaran untuk data yang baru, default=2
def predict(self, X, radius=0.4):
pred = []
for t in range(len(X)):
#Membuat list kosong untuk setiap
probabilitas klas
prob_of_classes = []
#Looping pada setiap klass dalam data
for i in range(self.no_of_classes):
for j in range(len(self.X_train)):
if self.euclidianDistance(X[t],
self.X_train[j]) < radius:
inRadius_no += 1
if self.y_train[j] == i:
inRadius_no_current_class
+= 1
margin_prob = inRadius_no/len(self.X_
train)
#3. step : likelihood P(X|currect_
class) - banyaknya element dalam klas sekarang/total
element
likelihood = inRadius_no_current_
class/len(self.X_train)
return pred
Tahap 3. Menyusun fungsi untuk menguji akurasi
Lanjutkan pada file di atas
def akurasi(y_tes, y_pred):
benar = 0
for i in range(len(y_pred)):
if(y_tes[i] == y_pred[i]):
benar += 1
return (benar/len(y_tes))*100
Pengenalan Pembelajaran Mesin (Machine Learning) untuk Analisis Data 51
Tahap 4.a Lanjutkan dalam file di atas, untuk menguji Naive Bayes yang dibuat.
Perhatikan bahwa kasus yang diujicobakan adalah file Social_Network_Ads.csv yang dapat
diperoleh dari internet dengan kata ini.
Tujuan dari data tersebut adalah untuk mempelajari apakah konsumen memesan atau tidak
untuk suatu barang.
Sebagian bentuk data berisi berikut ini:
User ID,Gender,Age,EstimatedSalary,Purchased
15624510,Male,19,19000,0
15810944,Male,35,20000,0
15668575,Female,26,43000,0
15603246,Female,27,57000,0
15804002,Male,19,76000,0
15728773,Male,27,58000,0
15598044,Female,27,84000,0
15694829,Female,32,150000,1
15600575,Male,25,33000,0
15727311,Female,35,65000,0
15570769,Female,26,80000,0
15606274,Female,26,52000,0
Kita dapat mencermati bagaimana isi data, berapa baris dan berapa kolom dengan perintah
berikut:
#Kita ingin mempelajari data file di atas (karena dalam
fungsi run, kita tidak bisa panggil,
#sehingga diulang panggil)
dataset = pd.read_csv(‘Social_Network_Ads.csv’)
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
dataset.columns
dataset.head()
52 Machine Learning dengan Python
Luaran
Dimensi data : (400, 5)
Tahap 4.b
Kita melanjutkan diskusi kita untuk mencoba melakukan pengujian program NBC yang dibuat
untuk file data ‘Social_Network_Ads.csv’
def run():
# Data dicoba
dataset = pd.read_csv(‘Social_Network_Ads.csv’)
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
#Pemisahan data menjadi data latih (training set
dan data uji (test set))
# from sklearn.model_selection import model_
selection
from sklearn.model_selection import train_test_
split
X_train, X_test, y_train, y_test = train_test_
split(X, y, test_size = 0.25, random_state = 0)
# Penyekalaan faktor-faktor
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
NB.fit(X_train, y_train)
#sklearn
from sklearn.naive_bayes import GaussianNB
NB_sk = GaussianNB()
NB_sk.fit(X_train, y_train)
sk_pred = NB_sk.predict(X_test)
print(“Akurasi untuk NBC disini adalah: “,
akurasi(y_test, y_pred), “%”)
print(“Akurasi NBC dari sklearn: “,akurasi(y_test,
sk_pred), “%”)
run()
Luaran:
Akurasi untuk NBC disini adalah: 93.0 %
Akurasi NBC dari sklearn: 90.0 %
Tahap 5.
Kita akan melakukan pengujian NBC yang dibuat untuk data breast cancer di mana nama file
data breastCancer.csv yang dapat diperoleh dari internet (Web 7). Yang perlu diperhatikan
terdapat beberapa jenis file pengukuran untuk breastCancer sehingga pembaca perlu
mencermati karena program mengikuti bentuk data pada file. Beberapa baris pertama data
ditulis berisi berikut ini.
“id”,”clump_thickness”,”size_uniformity”,”shape_
uniformity”,”marginal_adhesion”,”epithelial_
size”,”bare_nucleoli”,”bland_chromatin”,”normal_
nucleoli”,”mitoses”,”class”
54 Machine Learning dengan Python
1000025,5,1,1,1,2,1,3,1,1,2
1002945,5,4,4,5,7,10,3,2,1,2
1015425,3,1,1,1,2,2,3,1,1,2
1016277,6,8,8,1,3,4,3,7,1,2
1017023,4,1,1,3,2,1,3,1,1,2
1017122,8,10,10,8,7,10,9,7,1,4
1018099,1,1,1,1,2,10,3,1,1,2
1018561,2,1,2,1,2,1,3,1,1,2
1033078,2,1,1,1,2,1,1,1,5,2
1033078,4,2,1,1,2,1,2,1,1,2
Perhatikan bahwa class didefinisikan dengan label 2 dan 4. Untuk itu, beberapa baris dalam
program mengonversi label 2 menjadi 0 dan yang berlabel 4 menjadi 1.
y_new.append(1)
y_new = np.array(y_new)
#sklearn
from sklearn.naive_bayes import GaussianNB
NB_sk = GaussianNB()
NB_sk.fit(X_train, y_train)
sk_pred = NB_sk.predict(X_test)
print(“Akurasi untuk NBC yang dibuat: “,
akurasi(y_test, y_pred), “%”)
print(“Akurasi untuk NBC dari sklearn:
“,akurasi(y_test, sk_pred), “%”)
from sklearn import metrics
print(‘Rata error absolut:’, metrics.mean_
absolute_error(y_test, y_pred))
print(‘Kuadrat error rerata:’, metrics.mean_
squared_error(y_test, y_pred))
56 Machine Learning dengan Python
breastCancerTest()
Luaran:
Akurasi untuk NBC yang dibuat: 96.57142857142857 %
Akurasi untuk NBC dari sklearn: 95.42857142857143 %
Rata error absolut: 0.06857142857142857
Kuadrat error rerata: 0.13714285714285715
Akar kuadrat error rerata: 0.3703280399090206
z = y_pred-y_test
Diperoleh luaran:
[ 0 0 2 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0
0 -2 0 0 0 0 0 0 0 0 0 0 0 0]
Ringkasan Bab I
Pada bagian ini, telah dijelaskan tentang Machine Learning (ML), bagaimana kaitan ML
dengan ilmu-ilmu yang lain. Selain itu, ditunjukkan pula langkah-langkah yang dilakukan
dalam Machine Learning. Agar pembaca dapat memahami dengan mudah pada implementasi
Machine Learning, pada bab ini telah ditunjukkan beberapa algoritma untuk mempelajari
data dengan maksud pembaca mendapat praktik langsung terhadap cara kerja algoritma
dalam ML. Penjelasan lebih lanjut terhadap masing-masing algoritma ditunjukkan pada bab-
bab selanjutnya. Beberapa hal secara detail tentang Machine Learning tidak dibahas dalam
buku ini karena buku ini memberikan pengantar bagi pembaca untuk dapat terjun langsung
menggunakan algoritma yang telah disediakan dalam program Python, serta mengembangkan
sendiri penggunaannya terhadap kasus yang dihadapi.
DAFTAR PUSTAKA
Alonso-Robisco, A., & Carbó, J. M. 2022. Can Machine Learning Models Save Capital for
Banks? Evidence from a Spanish Credit Portfolio. International Review of Financial
Analysis, 84 (November), 1–8. https://doi.org/10.1016/j.irfa.2022.102372.
An, C., Lim, H., Kim, D. W., Chang, J. H., Choi, Y. J., & Kim, S. W. 2020. Machine Learning
Prediction for Mortality of Patients Diagnosed with Covid-19: A Nationwide Korean Cohort
Study. Scientific Reports, 10(1), 1–11. https://doi.org/10.1038/s41598-020-75767-2.
Dönmez, P. 2013. Introduction to Machine Learning. In A. Ethem (Ed.), Natural Language
Engineering (Vol. 19, Issue 2). https://doi.org/10.1017/s1351324912000290.
Ghada, H., Mohammed, A. E.-R. M., & Safaa El-Sayed, Amin, Mohamed Fahmy, T. 2020. Deep
Learning in Breast Cancer Detection and Classification. Proceedings of the International
Conference on Artificial Intelligence and Computer Vision AICV 2020, 322–333. https://
link.springer.com/book/10.1007/978-3-030-44289-7.
Guégan, D., & Hassani, B. 2018. Regulatory Learning: How to Supervise Machine Learning
Models? An Application to Credit Scoring. Journal of Finance and Data Science, 4(3),
157–171. https://doi.org/10.1016/j.jfds.2018.04.001.
Huber, J., & Stuckenschmidt, H. 2020. Daily Retail Demand Forecasting Using Machine
Learning with Emphasis on Calendric Special Days. International Journal of Forecasting,
36(4), 1420–1438. https://doi.org/10.1016/j.ijforecast.2020.02.005.
58 Machine Learning dengan Python
Kalfin, Sukono, Supian, S., & Mamat, M. 2022. Insurance Premium Determination Model and
Innovation for Economic Recovery Due to Natural Disasters in Indonesia. Computation,
10 (10). https://doi.org/10.3390/computation10100174.
Mohammed, M., Khan, M. B., & Bashie, E. B. M. 2017. Machine Learning: Algorithms and
Applications. In Machine Learning: Algorithms and Applications (Issue December).
https://doi.org/10.1201/9781315371658.
Parhusip, H. A., Susanto, B., Linawati, L., & Trihandaru, S. 2020. Classification Breast Cancer
Revisited with Machine Learning. 1 (1), 33–41.
Shirmard, H., Farahbakhsh, E., & Chandra, R. 2022. A Review of Machine Learning in
Processing Remote Sensing Data for Mineral Exploration. 268 (January), 4–7. https://
doi.org/https://doi.org/10.1016/j.rse.2021.112750.
Vasileios, L., Maria, D., Panagiotis, T., & Yannis L, K. 2022. Machine Learning in Disaster
Management: Recent Developments in Methods and Applications. Mach. Learn. Knowl.
Extr, 4 (2), 446–473. https://doi.org/https://doi.org/10.3390/make4020020.
BAB 2
METODE KLASTER
BERDASARKAN PUSAT
2.1. Pendahuluan
Salah satu metode klaster yang dikenal adalah metode klaster berdasarkan pusat yang sering
disebut K-Means Clustering. Ide algoritma K-Means adalah diberikan pengelompokan awal,
tetapi tidak optimal. Kemudian pindahkan setiap titik ke pusat terdekat yang baru, perbarui
pusat pengelompokan dengan menghitung rata-rata titik anggota, dan ulangi proses relokasi
dan pembaharuan hingga kriteria konvergensi (seperti jumlah iterasi yang telah ditentukan,
perbedaan nilai fungsi distorsi) terpenuhi. Kita akan mempelajari contoh penggunaan ide
K-Means data pada bidang (Dabbura, 2018), sedangkan beberapa aplikasi, pembaca dapat
membaca dari beberapa hasil penelitian para peneliti (Li & Wu, 2012) (Kobylin & Lyashenko,
2020), serta aplikasi K-means pada pengelompokan untuk data Covid-19 (Virgantari &
Faridhan, 2020).
1. Tetapkan banyaknya klaster (K)
Misal pilih K = 2. Titik secara random sebagai pusat klaster ditandai dengan kotak pada
Gambar 2.1.
60 Machine Learning dengan Python
Gambar 2.1 Ilustrasi pusat klaster terhadap anggota yang lain pada K-Means
Gambar 2.2 Ilustrasi pusat klaster perpindahan pusat klaster pada iterasi tertentu terhadap anggota
yang lain pada K-Means
Pada bagian ini merupakan masalah optimasi dalam meminimalkan menjadi 2 bagian.
Peminimalan pertama adalah meminimalkan J terhadap w ik di mana k dipilih tetap. Kemudian
meminimalkan J terhadap k di mana w ik dipilih tetap. Secara teknis, kita menurunkan J
terhadap w ik kemudian klaster diperbarui (langkah-E). Selanjutnya, J diturunkan terhadap k
dan pusat klaster diulang dihitung berdasarkan klaster yang sebelumnya diperoleh (langkah
M). Jadi langkah E adalah:
m K
J
w ik
x
i 1 k 1
i
k 2 (2.2)
argmin
1 jika k xi j 2
Di mana w ik j .
0, lainnya
Hal ini berarti menempatkan data x i pada klaster terdekat yang ditempatkan berdasarkan
jumlah jarak kuadrat terhadap pusat klaster, sedangkan langkah M dilakukan dengan
menghitung:
m
J
2 w ik x i k 0 (2.3)
k i 1
w x
m i
i 1 ik
sehingga k .
w
m
i 1 ik
Hal ini menunjukkan menghitung kembali pusat klaster untuk menjelaskan penugasan
baru. Perlu dicatat: karena algoritma klaster K-means menggunakan pengukuran jarak untuk
menentukan kesamaan data maka disarankan data distandardisasi sehingga mempunyai rata-
rata nol dan standar deviasi 1 karena hampir selalu setiap atribut/variabel mempunyai satuan
yang berbeda, seperti umur dan gaji.
Diberikan K-means secara natural iteratif dan pusat klaster diawali random. Oleh karena
itu, pusat awal berbeda akan memberikan hasil klaster berbeda karena algoritma K-means
akan bermasalah pada optimum lokal dan bisa tidak mendapat konvergen global optimum.
Oleh karena itu, disarankan menjalankan algoritma dengan pusat klaster awal yang berbeda-
beda dan diambil yang mempunyai jarak kuadrat paling minimum.
62 Machine Learning dengan Python
x ci
2
WCSS i (2.4)
i 1
Metode Elbow akan menghasilkan iterasi yang menyebabkan WCSS menuju nol sebagaimana
ditunjukkan pada Gambar 2.3.
Metode Klaster Berdasarkan Pusat 63
Gambar 2.3 Iterasi metode Elbow terhadap nilai WCSS yang menunjukkan konvergensi
Gambar 2.4 Klaster mula-mula (kiri) dan hasil klaster (kanan) pada K-Means
x = [1,5,1.5,8,1,9]
y = [2,8,1.8,8,.6,11]
plt.scatter(x,y)
plt.show()
X =
np.array([[1,2],[5,8],[1.5,1.8],[8,8],[1,.6],[9,11]])
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)
Metode Klaster Berdasarkan Pusat 65
centroids = kmeans.cluster_centers_
labels = kmeans.labels_
print(centroids)
print(labels)
colors = [‘r’,’b’,’y’,’g’,’c’,’m’]
for i in range(len(X)):
print(“koordinat:”,X[i], “label:”, labels[i])
plt.plot(X[i][0], X[i][1], colors[labels[i]],
markersize = 10)
plt.scatter(centroids[:, 0],centroids[:, 1], marker =
“x”, s=150, linewidths = 5, zorder = 10)
plt.show()
plt.scatter(x,y)
plt.scatter(centroids[:, 0],centroids[:, 1], marker =
“x”, s=150, linewidths = 5, zorder = 10)
plt.show()
Gambar 2.6 Penampilan data yang akan di klaster dan pusat klaster pada awal iterasi
kmeans = KMeans(n_clusters=4)
Gambar 2.7 Penampilan data yang akan di klaster dan pusat klaster pada awal selanjutnya setelah
proses dengan hasil Gambar 2.6
Metode Klaster Berdasarkan Pusat 67
Contoh 2.2
Kita akan mencoba melakukan clustering terhadap data kasus positif Covid-19 dan yang
sembuh di semua provinsi pada 2 hari berturutan, yaitu pada 22 April 2020 dan 23 April 2020.
Yang menjadi masalah: apakah terjadi pola pengelompokan?
Langkah 2.
# Tulis nilai dan gambar
f1 = data[‘V1’].values
f2 = data[‘V2’].values
X = np.array(list(zip(f1, f2)))
plt.scatter(f1, f2, c=’black’, s=50)
Luaran:
68 Machine Learning dengan Python
Gambar 2.8 Penampilan data yang akan di klaster yang mengelompok pada 2 lokasi
Sekilas terlihat bahwa data mengumpul pada 2 kelompok dengan 1 kelompok 2 anggota
pada ujung kanan atas. Kita akan coba bagaimana menyusun klaster dengan K-Means.
Andaikan dianggap banyaknya klaster 3.
Langkah 3.
# Hitung jarak Euclid
def dist(a, b, ax=1):
return np.linalg.norm(a - b, axis=ax)
# banyaknya klater
k = 3
# X koordinat random pusat klaster
C_x = np.random.randint(0, np.max(X)-20, size=k)
# Y koordinat y untuk pusat
C_y = np.random.randint(0, np.max(X)-20, size=k)
C = np.array(list(zip(C_x, C_y)), dtype=np.float32)
print(C)
Luaran:
Metode Klaster Berdasarkan Pusat 69
[[ 159. 3279.]
[ 817. 3022.]
[3463. 2461.]]
Langkah 4.
# Gambarkan data dengan pusat klaster
plt.scatter(f1, f2, c=’#050505’, s=50)
plt.scatter(C_x, C_y, marker=’*’, s=200, c=’g’)
Gambar 2.9 Penampilan data yang akan di klaster yang mengelompok pada 2 lokasi serta penentuan
titik pusat klaster
Pada langkah 4 ditunjukkan bahwa pusat klaster yang dibuat tidak pada sekitar data. Hal
inilah yang menyebabkan K-Means standar perlu diperbaiki. Jika proses iterasi dilanjutkan
maka clustering tidak terjadi.
Melakukan clustering yang sama, tetapi dengan cara yang berbeda (manual). Data clustering
menggunakan metode K-Means Clustering ini secara umum dilakukan dengan algoritma dasar
sebagai berikut:
1. Tentukan jumlah cluster.
2. Alokasikan data ke dalam cluster secara random.
3. Hitung centroid/rata-rata dari data yang ada di masing-masing cluster.
4. Alokasikan masing- masing data ke pusat/rata-rata terdekat.
70 Machine Learning dengan Python
Kembali ke Step 3, apabila masih ada data yang berpindah cluster atau apabila perubahan
nilai centroid, ada yang di atas nilai threshold yang ditentukan atau apabila perubahan nilai pada
fungsi tujuan yang digunakan di atas nilai threshold yang ditentukan.
Contoh 2.3
Langkah 1. Memanggil Librari
Program:
# Inisialisasi
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
np.random.seed(200)
k = 3
# pusat[i] = [x, y]
pusat = {i+1: [np.random.randint(0, 25), np.random.
randint(0, 25)]for i in range(k)}
fig = plt.figure
plt.scatter(df[‘x’], df[‘y’], color=’k’,)
colmap = {1: ‘r’, 2: ‘r’, 3: ‘r’}
for i in pusat.keys():
plt.scatter(*pusat[i], color=colmap[i],
marker=’*’,s=50)
plt.xlim(0, 20)
Metode Klaster Berdasarkan Pusat 71
plt.ylim(0, 20)
plt.show()
Gambar 2.10 Penampilan data yang akan di klaster dengan pusat klaster yang diletakkan random
untuk kasus Contoh 2.3
Sekilas terlihat bahwa data mengumpul pada 2 kelompok dengan 1 kelompok 2 anggota
pada ujung kanan atas. Kita akan coba bagaimana menyusun klaster dengan K-Means.
Andaikan dianggap banyaknya klaster 3.
Langkah 3.
# Hitung jarak Euclid
def dist(a, b, ax=1):
return np.linalg.norm(a - b, axis=ax)
# banyaknya klater
k = 3
72 Machine Learning dengan Python
Langkah 4.
#Gambarkan data dengan pusat klaster
plt.scatter(f1, f2, c=’#050505’, s=50)
plt.scatter(C_x, C_y, marker=’*’, s=200, c=’g’)
Metode Klaster Berdasarkan Pusat 73
Pada langkah 4 ditunjukkan bahwa pusat klaster yang dibuat tidak pada sekitar data. Hal
inilah yang menyebabkan K-Means standard perlu diperbaiki. Jika proses iterasi dilanjutkan
maka clustering tidak terjadi.
Melakukan clustering yang sama, tetapi dengan cara yang berbeda (manual). Data clustering
menggunakan metode K-Means Clustering ini secara umum dilakukan dengan algoritma dasar
sebagai berikut:
1. Tentukan jumlah cluster.
2. Alokasikan data ke dalam cluster secara random.
3. Hitung centroid/rata-rata dari data yang ada di masing- masing cluster.
4. Alokasikan masing- masing data ke pusat/rata-rata terdekat.
Kembali ke Step 3, apabila masih ada data yang berpindah cluster atau apabila perubahan
nilai centroid, ada yang di atas nilai threshold yang ditentukan atau apabila perubahan nilai pada
fungsi tujuan yang digunakan di atas nilai threshold yang ditentukan.
Contoh 2.4
Program:
# Inisialisasi
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.DataFrame({
‘x’: [1, 5, 7, 6.5, 9.5, 13.75, 17.15, 14, 12, 16],
‘y’:[3, 2, 4, 1.5, 6.25, 8.5, 11.25, 10.6, 8, 19.5]})
np.random.seed(200)
k = 3
# pusat[i] = [x, y]
pusat = {i+1: [np.random.randint(0, 25), np.random.
randint(0, 25)]for i in range(k)}
74 Machine Learning dengan Python
fig = plt.figure
plt.scatter(df[‘x’], df[‘y’], color=’k’,)
colmap = {1: ‘r’, 2: ‘r’, 3: ‘r’}
for i in pusat.keys():
plt.scatter(*pusat[i], color=colmap[i],
marker=’*’,s=50)
plt.xlim(0, 20)
plt.ylim(0, 20)
plt.show()
Tahap Penugasan
## Penugasan
import copy
pusat_lama = copy.deepcopy(pusat)
def update(k):
for i in pusat.keys():
pusat[i][0] = np.mean(df[df[‘terdekat’] == i]
[‘x’])
pusat[i][1] = np.mean(df[df[‘terdekat’] == i]
[‘y’])
return k
pusat = update(pusat)
fig = plt.figure
ax = plt.axes()
plt.scatter(df[‘x’], df[‘y’], color=df[‘warna’],
alpha=0.5, edgecolor=’k’)
for i in pusat.keys():
plt.scatter(*pusat[i],
color=colmap[i],marker=’*’,s=50)
plt.xlim(0, 20)
plt.ylim(0, 20)
76 Machine Learning dengan Python
for i in pusat_lama.keys():
x_lama = pusat_lama[i][0]
y_lama = pusat_lama[i][1]
dx = (pusat[i][0] - pusat_lama[i][0]) * 0.75
dy = (pusat[i][1] - pusat_lama[i][1]) * 0.75
plt.show()
plt.scatter(*pusat[i],
color=colmap[i],marker=’*’,s=50)
plt.xlim(0, 20)
plt.ylim(0, 20)
plt.show()
Luaran
Terus dilanjutkan sampai tidak ada data yang berubah dan sudah terkelompokkan dengan
baik.
# Dilanjutkan hingga pusat tidak berubah
while True:
pusat_terdekat = df[‘terdekat’].copy(deep=True)
pusat = update(pusat)
df = penugasan(df, pusat)
if pusat_terdekat.equals(df[‘terdekat’]):
break
fig = plt.figure
78 Machine Learning dengan Python
Maka telah dipunyai 2 klaster dengan 2 pusat (means) atau center di tiap klaster. Untuk satu
pusat di atas kanan tidak ada data di sekitarnya.
0 1 2
1 4 3
2 5 6
3 8 7
4 9 10
5 12 11
6 13 14
7 16 15
8 17 18
9 20 19
Program
import numpy as np
import matplotlib.pyplot as plt
list = [[1,2],[4,3],[5, 6],[8, 7],[9, 10],[12,
11],[13,14],[16, 15],[17,18],[20, 19]]
x, y = zip(*list)
plt.plot(x,y, linestyle = ‘’,color=’darkblue’,marker =
‘*’,markersize=5,markeredgecolor=’darkblue’,
markerfacecolor=’purple’ )
plt.xlabel(“x”)
plt.ylabel(“y”)
plt.show()
Luaran
Sekilas kita dapat memperhatikan bahwa pasangan titik di atas dapat dipisahkan menjadi
2 klaster dengan menentukan pusat klaster, misalkan tanpa teknik matematika kita dapat
menemukan pusat klaster sekitar (5.4 5.6) dan (15.6 15.4) pada gambar di atas. Lalu dilakukan
percobaan untuk menentukan pemisahan menjadi 2 klaster dengan menu pada scikit-learn.
Metode Klaster Berdasarkan Pusat 81
Program
Luaran
x y
0 1 2
1 4 3
2 5 6
3 8 7
4 9 10
5 12 11
6 13 14
7 16 15
8 17 18
82 Machine Learning dengan Python
9 20 19
[[15.6 15.4]
[ 5.4 5.6]]
Dapat diketahui dengan gambar di atas manakah yang dalam klaster 1 dan yang
digolongkan klaster 2. Perhatikan bahwa data pasangan data di mana x sekitar 1-11 merupakan
1 klaster ke-1, dan data di mana x sekitar 12-20 pada klaster yang ke-2. Hasil pusat klaster
yang menggunakan Python diperoleh (5.4 5.6) pusat klaster ke-1 dan (15.6 15.4) pada klaster
ke-2.
df = DataFrame(Data,columns=[‘x’,’y’])
kmeans = KMeans(n_clusters=4).fit(df)
centroids = kmeans.cluster_centers_
print(centroids)
Luaran:
[[43.2 16.7 ]
[30.83333333 74.66666667]
[27.75 55. ]
[55.1 46.1 ]]
<matplotlib.collections.PathCollection at 0x39a6950>
84 Machine Learning dengan Python
Langkah 2.
# Menyusun pandas DataFrame dengan nama-nama serta
koordinat (x,y)
data = pd.DataFrame({
‘Obyek’: obj_names,
‘Nilai_X’: X[:, 0],
Metode Klaster Berdasarkan Pusat 85
Luaran
Obyek Nilai_X Nilai_Y
0 Obyek1 1.005079 4.594642
1 Obyek2 1.128478 4.328122
2 Obyek3 2.117881 0.726845
3 Obyek4 0.955626 4.385907
4 Obyek5 -1.354017 2.769449
86 Machine Learning dengan Python
Langkah 3.
#langkah awal: initialisasi pusat
#
c1 = (-1, 4)
c2 = (-0.2, 1.5)
c3 = (2, 2.5)
# Tampilkan data
print(data.head())
Luaran:
Obyek Nilai_X Nilai_Y C1_Jarak C2_Jarak
C3_Jarak
0 Obyek1 1.005079 4.594642 2.091397 3.320997
2.318921
1 Obyek2 1.128478 4.328122 2.153620 3.124601
2.025236
2 Obyek3 2.117881 0.726845 4.520479 2.443428
1.777070
3 Obyek4 0.955626 4.385907 1.993339 3.108686
2.155774
4 Obyek5 -1.354017 2.769449 1.280462 1.715592
3.364823
pusat1_baru))
print(‘Pusat 2 ({}, {})’.format(x_pusat2_baru, y_
pusat2_baru))
Luaran :
Pusat 1 (-0.500753347459331, 3.4851226841526897)
Pusat 2 (1.7821539902873855, 1.7821539902873855)
Ei Ri
x x zi 2 d x
Di mana ρ(·) adalah fungsi distribusi probabilitas, yang mana fungsi kontinu didefinisikan
pada ruang, dan zi sebagai pusat dari daerah Ri . Jumlah semua Ei adalah total ukuran error.
Sampel random dari data dapat dianggap dugaan yang bagus dari fungsi distribusi probabilitas
ρ(·). Sampel yang demikian memberikan himpunan pusat-pusat yang mewakili dan dugaan
yang baik dari ukuran error tanpa menggunakan titik-titik data dari data asli. Karena keduanya
memberikan titik-titik referensi dan titik-titik data untuk update dipilih oleh sampel acak,
algoritma K-means kontinu pada umumnya lebih cepat daripada yang standar.
90 Machine Learning dengan Python
Contoh 2.6
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
labels = KMeans(2, random_state=0).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels,s=50,
cmap=’viridis’);
#Clustering untuk bentuk batas kompleks
from sklearn.datasets import make_moons
X, y = make_moons(200, noise=.05, random_state=0)
from sklearn.cluster import SpectralClustering
model = SpectralClustering(n_clusters=2,
affinity=’nearest_neighbors’,assign_labels=’kmeans’)
labels = model.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels,s=50,
cmap=’viridis’);
92 Machine Learning dengan Python
Dengan kernel yang digunakan, K-Means berhasil melakukan pemisahan. Salah satu
kelemahan lain K-means adalah algoritma berjalan lambat untuk sampel yang banyak. Untuk
itu, dilakukan perbaikan dengan cara menggunakan sebagian data untuk memperbarui
pusat klaster tiap tahap iterasi. Hal inilah yang kemudian menjadi dasar untuk modul dalam
scikitlearn, yaitu sklearn.cluster.MiniBatchKMeans. Hal ini serupa dengan standar KMeans
yang selanjutnya akan dijelaskan perbedaannya.
MiniBatchKMeans adalah varian dari algoritma K-Means yang menggunakan mini-batch
untuk mengurangi waktu komputasi, sambil tetap berusaha untuk mengoptimalkan fungsi
tujuan yang sama. Mini-batch adalah himpunan bagian dari data input, yang diambil sampelnya
secara acak di setiap iterasi pelatihan. Mini-batch ini secara drastis mengurangi jumlah
perhitungan yang diperlukan untuk konvergen ke solusi lokal. Berbeda dengan algoritma lain
yang mengurangi waktu konvergensi K-means, K-means mini-batch menghasilkan hasil yang
umumnya hanya sedikit lebih buruk daripada algoritma standar. MiniBatchKMeans melakukan
konvergensi lebih cepat daripada KMeans, tetapi kualitas hasilnya berkurang. Dalam praktiknya,
perbedaan kualitas ini bisa sangat kecil. Algoritma ini beralih di antara dua langkah utama, mirip
dengan vanilla K-means. Pada langkah pertama, sampel b diambil secara acak dari dataset
untuk membentuk mini-batch. Ini kemudian ditugaskan ke centroid terdekat. Pada langkah
kedua, centroid diperbarui. Berbeda dengan K-means, ini dilakukan berdasarkan per sampel.
Untuk setiap sampel dalam mini-batch, centroid yang ditugaskan diperbarui dengan mengambil
rata-rata streaming dari sampel dan semua sampel sebelumnya yang ditugaskan ke centroid
tersebut. Ini memiliki efek penurunan tingkat perubahan untuk centroid dari waktu ke waktu.
Langkah-langkah ini dilakukan sampai konvergensi atau jumlah iterasi yang telah ditentukan
tercapai. Salah satu aplikasi yang menunjukkan kecepatan Mini Batch K-means adalah
dengan adanya pengelompokan cepat untuk data sel tunggal Cell RNA-Sequencing (scRNA-
seq), yaitu suatu teknologi tinggi yang paling banyak digunakan untuk mengukur ekspresi gen
Metode Klaster Berdasarkan Pusat 93
lebar genom pada tingkat sel tunggal. Salah satu analisis data scRNA-seq yang paling umum
mendeteksi subpopulasi sel yang berbeda melalui penggunaan algoritma pengelompokan
unsupervised-learning. Namun, kemajuan terbaru dalam teknologi scRNA-seq menghasilkan
kumpulan data saat ini mulai dari ribuan hingga jutaan sel. Algoritma pengelompokan yang
populer, seperti K-means, biasanya membutuhkan data untuk dimuat seluruhnya ke dalam
memori dan karenanya bisa lambat atau tidak mungkin dijalankan dengan dataset besar,
sedangkan Mini Batch K-means dapat bekerja lebih baik (Hicks et al., 2021)recent advances in
scRNA-seq technologies result in current datasets ranging from thousands to millions of cells.
Popular clustering algorithms, such as k-means, typically require the data to be loaded entirely
into memory and therefore can be slow or impossible to run with large datasets. To address this
problem, we developed the mbkmeans R/Bioconductor package, an open-source implementation
of the mini-batch k-means algorithm. Our package allows for on-disk data representations,
such as the common HDF5 file format widely used for single-cell data, that do not require
all the data to be loaded into memory at one time. We demonstrate the performance of the
mbkmeans package using large datasets, including one with 1.3 million cells. We also highlight
and compare the computing performance of mbkmeans against the standard implementation
of k-means and other popular single-cell clustering methods. Our software package is available
in Bioconductor at https://bioconductor.org/packages/ mbkmeans.”,”author”:[{“dropping-pa
rticle”:””,”family”:”Hicks”,”given”:”Stephanie C.”,”non-dropping-particle”:””,”parse-names”:fa
lse,”suffix”:””},{“dropping-particle”:””,”family”:”Liu”,”given”:”Ruoxi”,”non-dropping-particle”:””-
,”parse-names”:false,”suffix”:””},{“dropping-particle”:””,”family”:”Ni”,”given”:”Yuwei”,”non-
dropping-particle”:””,”parse-names”:false,”suffix”:””},{“dropping-particle”:””,”family”:”Purdom
”,”given”:”Elizabeth”,”non-dropping-particle”:””,”parse-names”:false,”suffix”:””},{“dropping-
particle”:””,”family”:”Risso”,”given”:”Davide”,”non-dropping-particle”:””,”parse-names”:false,”suf
fix”:””}],”container-title”:”PLoS Computational Biology”,”id”:”ITEM-1”,”issue”:”1”,”issued”:{“date-
parts”:[[“2021”]]},”page”:”1-18”,”title”:”Mbkmeans: Fast clustering for single cell data using
mini-batch k-means”,”type”:”article-journal”,”volume”:”17”},”uris”:[“http://www.mendeley.com/
documents/?uuid=f9a67b19-1188-44fd-82f6-2cf798422567”]}],”mendeley”:{“formattedCitation
”:”(Hicks et al., 2021.
94 Machine Learning dengan Python
DAFTAR PUSTAKA
Dabbura, I. 2018. K-means Clustering: Algorithm, Applications, Evaluation Methods, and
Drawbacks. https://towardsdatascience.com/k-means-clustering-algorithm-applications-
evaluation-methods-and-drawbacks-aa03e644b48a.
Gan, G., Ma, C., & Wu, J. 2007. Data Clustering. American Statistical Association and SIAM
Philadelpia.
Hicks, S. C., Liu, R., Ni, Y., Purdom, E., & Risso, D. 2021. Mbkmeans: Fast Clustering for
Single Cell Data using Mini-Batch K-means. PLoS Computational Biology, 17(1), 1–18.
https://doi.org/10.1371/JOURNAL.PCBI.1008625.
Kobylin, O., & Lyashenko, V. 2020. Time Series Clustering Based on the K-Means Algorithm.
Journal La Multiapp, 1(3), 1–7. https://doi.org/10.37899/journallamultiapp.v1i3.191.
Li, Y., & Wu, H. 2012. A Clustering Method Based on K-Means Algorithm. Physics Procedia, 25,
1104–1109. https://doi.org/10.1016/j.phpro.2012.03.206.
Virgantari, F., & Faridhan, Y. E. 2020. K-Means Clustering of Covid-19 Cases in Indonesia’s
Provinces. ADRI International Journal of Engineering and Natural Science, 5(2), 1–7.
BAB 3
NATURAL LANGUAGE PROCESS
(NLP): MACHINE LEARNING
UNTUK DATA TEKS
Manusia berkomunikasi melalui beberapa bentuk bahasa, baik dengan teks atau ucapan.
Untuk melakukan interaksi antara komputer dan manusia, komputer perlu memahami
bahasa alami yang digunakan oleh manusia. Oleh karena itu, dibuatlah bahasa yang disebut
Pemrosesan Bahasa Alami atau Natural Language Process (NLP) yang membahas tentang
membuat komputer belajar, memproses, dan memanipulasi bahasa alami. NLP adalah cabang
kecerdasan buatan yang berurusan dengan analisis, pemahaman, dan menghasilkan bahasa
yang digunakan manusia secara alami untuk berinteraksi dengan komputer dalam konteks
tertulis dan lisan menggunakan bahasa alami manusia, bukan bahasa komputer.
ini pun akan memakan waktu yang cukup lama karena mengumpulkan data bukanlah hal
yang mudah.
3. Setelah berhasil mengumpulkan cukup data, Anda dapat mulai menganalisis data
tersebut. Bagaimana kualitas dan kuantitas corpus yang dikumpulkan? Apakah sesuai
dengan kualitas yang diharapkan? Di sini, eksplorasi dan visualisasi awal dari data
menjadi penting. Anda pun akan perlu untuk melakukan pra-pemrosesan data.
Memahami masalah
Kumpulkan dataset/corpus
Analisis dataset/corpus
Preprocessing dataset
Menentukan fitur-fitur
Menentukan fitur-fitur
Kami berharap Anda sudah memiliki program Python yang terinstal di komputer ketika
membaca buku ini. Jika belum, mungkin ini saatnya mencari komunitas bertumbuh yang
cocok untuk mendorong perkembangan skill Anda. Sama halnya dengan berbagai bahasa
pemrograman yang lain, Python juga bekerja dengan menggunakan berbagai modul
atau biasanya dikenal dengan istilah library. Library pada umumnya dapat dimiliki dengan
melakukan pip-installation (pip install) dari anaconda-prompt. Beberapa library dasar yang
sebaiknya Anda miliki, misalnya Jupyterlab, Pandas, Numpy, Scipy, Matplotlib.pyplot, Seaborn,
Sklearn, Tkinter, NLTK, dan Sastrawi (khusus bagi mereka yang hendak menekuni NLP Bahasa
Indonesia). Fungsi dan kegunaan dari masing-masing library tentunya akan dipelajari seiring
Anda melangkah maju ke bagian-bagian selanjutnya.
Python memiliki banyak sekali library yang tersedia untuk mengekstraksi konten digital
yang tersebar di internet. Di antara library yang tersedia, tiga library berikut digunakan secara
populer untuk tujuan tersebut, yaitu BeautifulSoup, LXml, dan RegEx. Sebuah studi statistik
yang dilakukan pada kumpulan data yang tersebar menunjukkan bahwa RegEx mampu
memberikan jawaban rata-rata 153,7 ms. Namun, RegEx memiliki kelemahan yang melekat
pada ekstraksi aturan terbatas ketika datang ke halaman web dengan lebih banyak tag
dalam. Karena kekurangan ini, RegEx disebut hanya mampu melakukan konteks yang cukup
kompleks. Namun, BeautifulSoup dan LXml mampu mengekstraksi konten web di bawah
lingkungan demikian, serta menghasilkan tingkat respons masing-masing 458,68 ms dan
202,96 ms.
Ada banyak alasan menggunakan corpus untuk mengembangkan aplikasi NLP, beberapa
di antaranya:
1. Dengan bantuan corpus, beberapa analisis statistik dapat dilakukan, misalnya frekuensi
distribusi, kejadian kemunculan bersama beberapa kata, dan sebagainya (Lane et al.,
2019).
2. Dengan corpus, berbagai aturan linguistik untuk sebuah aplikasi NLP dapat didefinisikan
maupun divalidasi. Misalnya, jika Anda membangun sistem koreksi tata bahasa, Anda
dapat menggunakan korpus teks dan mencoba mencari tahu contoh tata bahasa yang
salah, dan kemudian dapat menentukan aturan tata bahasa yang diinginkan.
Dalam corpus, kumpulan besar data dapat disimpan dalam format teks (naskah tertulis),
artinya bahan tertulis maupun data ucapan, materi yang diucapkan (rekaman suara). Data
dengan teks adalah kumpulan informasi tertulis yang biasanya bersumber dari artikel berita,
buku, perpustakaan digital, pesan e-mail, web halaman atau blog, sosial media, seperti Twitter,
Facebook, dan Instagram, maupun sumber lainnya, seperti yang tersedia pada beberapa modul
pemrograman Python. Sebagian besar data teks ini tersimpan dalam format txt. Walaupun ada
juga corpus yang tersimpan dalam format lainnya, misalnya json. Di bab ini, kita akan sama-
sama berlatih mengakses dan memanggil data teks pada Python. Silakan men-download
corpus Othello pada link berikut https://github.com/hannaariniparhusip/Indo_MachineLearning
di mana terdapat file Othelo.txt.
Natural Language Process (NLP): Machine Learning untuk Data Teks 101
Selanjutnya, Anda perlu mengecek direktori penyimpanan hasil download corpus. Dalam
bahasa pemrograman Python, data text ekstensi ini dapat dipanggil dengan sangat mudah
mengikuti tahapan di bawah ini:
1. Bukalah anaconda prompt pada PC Anda.
2. Selanjutnya Anda dapat membuka jendela editor jupyter notebook pada lokasi direktori
yang diinginkan. Sebagai contoh, kode di bawah ini digunakan untuk membuka jendela
editor jupyter notebook pada drive D: di dalam folder dengan nama Latihan.
3. Jika pada jendela anaconda prompt muncul tampilan yang sama seperti pada Gambar
3.5, ini berarti instalasi berhasil dan selanjutnya hanya perlu menunggu jendela editor
jupyter notebook terbuka pada browser. Jika jendela editor tidak juga muncul, Anda dapat
mengopi salah satu link dari URLs yang muncul pada jendela anaconda prompt, paste di
browser dan tekan Enter.
4. Pada browser akan muncul jendela, seperti yang tampak pada Gambar 3.6 maka
selanjutnya Anda dapat membuat file notebook baru (biasanya dengan format .ipynb)
dengan cara memilih tombol New kemudian klik pada pilihan Python 3.
5. Anda dapat terlebih dahulu mengubah nama dari file notebook Anda seperti yang tampak
pada Gambar 3.7.
6. Sekarang kita akan mulai memanggil data corpus yang sebelumnya telah kita download.
Proses pembacaan data teks dimulai dengan memanggil file dari direktori penyimpanannya.
alamat=r’C:\Users\DELL\Documents\Othello.txt’
with open(alamat,’r’,encoding=”utf8”) as f:
corpus=f.read()
f.close()
7. Dari Gambar 3.8 dapat dilihat tampilan teks di dalam corpus Othello.txt yang berhasil
dipanggil. Di sini tampak karakter ‘\n’ pada file teks yang ditampilkan. Karakter ini
merupakan tempat bagi spasi dalam file teks. Ini menunjukkan bahwa corpus yang
berhasil dipanggil masih memerlukan banyak pengolahan lainnya sebelum siap untuk
digunakan dalam pelatihan algoritma model yang diinginkan.
8. Selanjutnya, teks corpus keseluruhan ini akan dipenggal ke dalam beberapa bagian
menggunakan perintah
corpus_pisah=corpus.split(‘\n’)
Gambar 3.8 Tampilan teks di dalam Corpus Othello.txt yang berhasil dipanggil
9. Jika Anda tidak nyaman dengan kehadiran banyak string kosong (‘’) dalam corpus, Anda
tentu dapat membersihkannya.
Perintah di atas akan menciptakan sebuah list bagi Anda dengan nama corpus_oke,
kemudian setiap anggota corpus yang ukuran (panjang) stringnya tidak sama dengan nol
akan ditambahkan ke dalam list baru corpus_oke.
Natural Language Process (NLP): Machine Learning untuk Data Teks 105
Corpus yang lebih rapi dapat dilihat pada Gambar 3.10. Langkah selanjutnya akan
dilakukan pra-pemrosesan yang bertujuan untuk menyiapkan data corpus Anda untuk
digunakan dalam proses pelatihan algoritma/model, baik Machine Learning maupun deep
learning.
Langkah Tokenisasi
Langkah Tokenisasi (Tokenization), yaitu proses memenggal kata/teks menjadi kata, frasa
ataupun elemen bermakna yang disebut token. Daftar token kemudian digunakan sebagai
proses lebih lanjut. Pada library nltk mempunyai word_tokenize dan sent_tokenize yang
memudahkan daftar kalimat untuk dipenggal menjadi kata atau kalimat-kalimat. Ada beberapa
library di Python yang dapat digunakan untuk menyelesaikan tugas ini. Salah satu library yang
paling sering digunakan ialah NLTK dengan nltk.tokenize. Tokenizer akan membantu Anda
untuk membagi sebuah string menjadi beberapa substring. Adapun cara untuk menggunakan
berbagai metode pada library NLTK antara lain:
import nltk
nltk.download(‘punkt’)
from nltk.tokenize import word_tokenize
token_kata=word_tokenize(corpus_oke)
Dapat dilihat pada di atas, word_tokenize tidak mampu memisahkan ‘nasi+tempe’ dan
membacanya sebagai satu kesatuan saja, sedangkan di sisi lain dengan menggunakan
wordpunct_tokenize token yang dihasilkan juga sensitif terhadap tanda baca sehingga hasil
dari wordpunct_tokenize mampu memisahkan ‘nasi+tempe’ mejadi ‘nasi’, ‘+’ dan ‘tempe’.
Perhatian!
Saat membuat tokenisasi string Unicode, pastikan Anda tidak menggunakan versi string yang
disandikan (mungkin perlu didekodekan terlebih dahulu, misalnya dengan s.decode(“utf8”).
Seperti yang dapat dilihat di atas, huruf A kapital dan huruf a kecil dianggap oleh Python
sebagai dua objek yang berbeda. Perintah untuk melakukan perubahan huruf kecil pada
sebuah string adalah:
Pada Gambar 3.13 menunjukkan bahwa seluruh teks di dalam corpus tercetak dalam
huruf kecil.
Langkah Lemmatisasi
Langkah Lemmatisasi (Word Stemming/Lemmatization) bertujuan sama dengan proses di
atas, yaitu mereduksi bentuk-bentuk infleksi dari tiap kata menjadi bentuk dasar atau akar
kata, misalkan kata eating menjadi eat. Lemmatization hampir dekat dengan stemming,
perbedaannya adalah bahwa stemmer mengoperasikan suatu kata tanpa ada pengetahuan
tentang konteks dan oleh karena itu tidak dapat membedakan kata yang mempunyai perbedaan
arti (misal roti dimakan dengan dimakan roti jelas berbeda, tetapi di sini tidak dibedakan).
Stemmer biasanya lebih mudah diimplementasikan dan lebih cepat dan penurunan akurasi
dapat menjadi tidak penting untuk beberapa aplikasi. Berikut ini adalah langkah lengkap yang
menyusun tahapan pre-processing:
1. Membuang baris yang blank dari data jika ada.
2. Mengubah semua huruf dalam huruf kecil.
3. Men-token kata.
4. Membuang stop word.
5. Membuang text non-alpha.
6. Meng-lemma kata.
Tahap 3. Encoding
Dengan encoding berarti memberikan pelabelan pada variabel target. Hal ini dilakukan dengan
mentransformasikan data kategori bertipe pada tipe string dalam data menjadi data bernilai
numerik.
Tanpa detail matematika, TF-IDF adalah nilai frekuensi kata (word) yang diupayakan
menonjolkan lebih menarik, misal muncul sangat sering dokumen, tetapi tidak pada seluruh
dokumen. TF-IDF membangun koleksi kata yang telah dipelajari dari data corpus dan yang
menunjuk bilangan bulat secara tunggal kepada kata-kata ini. Terdapat 5000 kata/fitur
yang tunggal yang ditunjukkan pada parameter max_features=5000. Akhirnya, kita akan
mentransformasi Train_X dan Test_X yang divektorisasi Train_X_Tfidf dan Test_X_Tfidf.
Kemudian kita dapat menggunakan algoritma ML untuk memprediksi luaran, misal dengan
menggunakan Naïve Bayes sebagaimana ditunjukkan pada bagian selanjutnya.
Tahap 2. Membangkitkan random sedemikian hingga setiap luaran nantinya memberikan hasil
yang konsisten
np.random.seed(500)
import nltk
nltk.download(‘punkt’)
Luaran:
[nltk_data] Downloading package punkt to /root/nltk_
data...
[nltk_data] Unzipping tokenizers/punkt.zip.
True
nltk.download(‘averaged_perceptron_tagger’)
Luaran:
Natural Language Process (NLP): Machine Learning untuk Data Teks 113
nltk.download(‘stopwords’)
[nltk_data] Downloading package stopwords to /root/
nltk_data...
[nltk_data] Unzipping corpora/stopwords.zip.
True
print(Corpus[‘text_final’].head())
Luaran:
0 [‘stun’, ‘even’, ‘sound’, ‘track’, ‘beautiful’...
1 [‘best’, ‘soundtrack’, ‘ever’, ‘anything’, ‘re...
2 [‘amaze’, ‘soundtrack’, ‘favorite’, ‘music’, ‘...
3 [‘excellent’, ‘soundtrack’, ‘truly’, ‘like’, ‘...
4 [‘remember’, ‘pull’, ‘jaw’, ‘floor’, ‘hear’, ‘...
Name: text_final, dtype: object
Encoder = LabelEncoder()
Train_Y = Encoder.fit_transform(Train_Y)
Test_Y = Encoder.fit_transform(Test_Y)
Tahap 5. Sekarang kita dapat menggunakan algoritma yang berbeda untuk mengklasifikasi
data untuk
#menguji akurasi
#DISINI dengan Algoritma Naive Bayes
Natural Language Process (NLP): Machine Learning untuk Data Teks 115
names = []
scores = []
for name, model in models:
model.fit(Train_X_Tfidf, Train_Y)
y_pred = model.predict(Test_X_Tfidf)
scores.append(accuracy_score(Test_Y, y_pred))
names.append(name)
tr_split = pd.DataFrame({‘Nama’: names, ‘Nilai’:
scores})
print(tr_split)
Luaran:
Nama Nilai
0 KNN 0.712667
1 SVC 0.849667
2 LR 0.852000
3 DT 0.713667
4 RF 0.820000
5 GB 0.783000
Analisis: dari hasil ini diperoleh bahwa klasifikasi dengan LR paling tinggi.
(bentuk kata dasar). Di sini dipelajari cara menghitung probabilitas bayes dari datasets email
dan digunakan untuk memprediksi apakah email baru termasuk ke kategori spam atau tidak.
Di bagian terakhir diberikan juga cara memakai sklearn untuk melakukan hal yang sama.
Referensi yang cukup mudah dibaca telah diperoleh dari internet (Chauhan, 2018). Beberapa
referensi informal diperoleh pada beberapa alamat yang lain https://www.mdpi.com/1099-
4300/19/6/247/pdf; https://www.youtube.com/watch?v=O2L2Uv9pdDA.
Ketika membaca data, sebagaimana biasanya pada machine learning, kita perlu
membersihkan data. Pada bagian ini kita harus melihat apakah ada data email yang
kosong. Kalau ada, data kosong dihapus saja. Yang dimaksud dengan email kosong
adalah jika isi email tidak mengandung string apa pun, walaupun email tersebut mempunyai
ukuran file tidak nol. Mungkin hal itu karena email terkirim tanpa isi, atau file bukan email
yang tersimpan di database, dan lain-lain. Jadi kita akan mencari email kosong saja.
Secara ringkas, klasifikasi biner spam dan non-spam dilakukan dengan langkah-langkah
sebagai berikut:
1. Proses teks. Pada proses ini dilakukan pembersihan data mentah dan melakukan
tokenisasi. Pada proses pembersihan data terdapat tahapan, yaitu: kasus membuat huruf
menjadi semua huruf kecil (lowering), membuang karakter-karakter khusus (removal),
membuang kata-kata stop words, membuang hyperlinks, dan membuang spasi.
Contoh lowering: kata ‘TEXT’, ‘text’, ‘Text’ adalah sama nilainya dan ditulis sebagai ‘text’.
Contoh membuang karakter khusus: kata Hallo dan hallo! perlu menjadi ‘hallo’ saja.
Contoh stop words: kata the dan a memberikan pengertian yang sama sehingga perlu
dibuang karena tidak memberi arti tertentu pada suatu kata.
Contoh membuang hyperlinks: tentu pada bagian ini tidak perlu alamat URL sehingga
URL perlu dibuang.
2. Tokenisasi. Pada tokenisasi ini merupakan proses memecah teks menjadi beberapa
bagian kecil yang disebut token. Setiap token adalah input fitur pada algoritma machine
learning nantinya. Pada python terdapat fungsi keras.preprocessing.text.
Tokenizer yang melakukan tokenisasi atau membuat teks menjadi token-token dengan
menjaga kata-kata yang tetap paling sering muncul pada corpus. Jika tokenisasi selesai,
kita akan memperoleh sejumlah kamus kata-kata. Itu pun belum khusus. Masih perlu
dibatasi dengan parameter max-features yang menetapkan kata-kata yang frekuensi
tertinggi yang akan kita perhatikan.
Natural Language Process (NLP): Machine Learning untuk Data Teks 119
max_feature = 50000
from keras. preprocessing.text
import Tokenizertokenizer = Tokenizer(num_words=max_
feature)
3. Pengurutan teks (Sequencing): pada bagian ini dilakukan padding dan encoding.
Padding, yaitu token dari semua e-mail dengan panjang sama di mana panjang semua
token yang maksimum ditandai dengan parameter ‘len’. Pada langkah selanjutnya adalah
memberikan pelabelan pada variabel target dengan encoding.
4. Pemilihan model. Model yang dimaksud di sini adalah model-model yang digunakan,
misalkan model klasifikasi yang digunakan ditetapkan terlebih dahulu. Contohnya, pada
subbab di atas digunakan model Naïve Bayes untuk klasifikasi email spam vs non-spam.
5. Implementasi. Pada tahap ini, kita kemudian melakukan coding untuk mengimplementasi
model yang sudah dipilih pada tahap sebelumnya sebagaimana ditunjukkan pada sub-
subbab berikut ini.
Langkah 1:
“””## PERSIAPAN DATA”””
# Siapkan os untuk membaca file-file dalam folder
import os
# Di sini email dibaca satu per satu dengan walk.
# Untuk beralih dari file satu ke file berikutnya
dilakukan dengan
# membuat generator sebagai berikut:
# Jangan lupa pilih encoding=’latin-1’
def generator_iterasi_baca_email(lokasi):
for root, dirs, files in os.walk(lokasi,
120 Machine Learning dengan Python
topdown=False):
for file in files:
namafile=os.path.join(root, file)
#print(namafile)
bukafile=open(namafile,’r’,
encoding=’latin-1’)
simpan_baris=[] # isi email akan disimpan
disini
isi_email=False # awal baris adalah
header, bukan isi email
for baris in bukafile:
if isi_email: # Kalau sudah
diperoleh isi (awalnya belum ya)
simpan_baris.append(baris) #
simpanlah baris yang dibaca
elif (baris==’\n’): # Kalau diperoleh
baris kosong
isi_email=True # maka diperoleh
bagian isi
bukafile.close()
email=’’.join(simpan_baris) # baris-baris
yang ditemukan disambung jadi satu
yield email, file
# Kita buat fungsi baca email, hasil disimpan dalam suatu list, sekalian dengan informasi
klasifikasinya
# Klasifikasi = 0 adalah untuk non-spam, dan 1 untuk spam
def baca_semua_email(lokasi, klasifikasi):
dataemail=[]
for em, nf in generator_iterasi_baca_
Natural Language Process (NLP): Machine Learning untuk Data Teks 121
email(lokasi):
dataemail.append({‘EMAIL’:em, ‘FILE’:nf,
‘FOLDER’:lokasi, ‘KLASIFIKASI’: klasifikasi})
return dataemail
FOLDER_SPAM_0=’../DATASETS/spam_0’
FOLDER_SPAM_1=’../DATASETS/spam_1’
FOLDER_SPAM_2=’../DATASETS/spam_2’
FOLDER_NONSPAM_0=’../DATASETS/easy_ham_0’
FOLDER_NONSPAM_1=’../DATASETS/easy_ham_1’
FOLDER_NONSPAM_2=’../DATASETS/easy_ham_2’
# Definisikan Klasifikasi
EMAIL_SPAM=1
EMAIL_NONSPAM=0
# Baca E-mail:
email=baca_semua_email(FOLDER_SPAM_0,EMAIL_SPAM)
# Kita memerlukan pandas untuk mempermudah mengelola data teks seperti di atas
# Dengan pandas kita bisa menampilkan data lebih menarik juga:
import pandas as pd
DATA=pd.DataFrame(email)
DATA.head()
DATA.tail()
contoh=”hallo”
len(contoh)==0
Luaran:
False
Natural Language Process (NLP): Machine Learning untuk Data Teks 123
contoh=””
len(contoh)==0
Luaran:
True
# Untuk melihat apakah ada yang kosong di dataFrame DATA pada kolom EMAIL:
DATA.EMAIL.str.len()==0
Luaran:
0 False
1 False
2 False
3 False
4 False
...
9744 False
9745 False
9746 False
9747 False
9748 True
Name: EMAIL, Length: 9749, dtype: bool
(DATA.EMAIL.str.len()==0).any()
Luaran:
True
124 Machine Learning dengan Python
(DATA.EMAIL.str.len()==0).sum()
Luaran:
5
DATA[DATA.EMAIL.str.len()==0].index
Int64Index([500, 1898, 3295, 8347, 9748],
dtype=’int64’)
DATA[DATA.EMAIL.str.len()==0].FILE
500 cmds
1898 cmds
3295 cmds
8347 cmds
9748 cmds
Name: FILE, dtype: object
DATA[DATA.EMAIL.str.len()==0]
hapus=DATA[DATA.EMAIL.str.len()==0].index
hapus
# sebelum hapus:
DATA.tail()
Natural Language Process (NLP): Machine Learning untuk Data Teks 125
DATA.drop(hapus, inplace=True)
# setelah hapus:
DATA.tail()
(DATA.EMAIL.str.len()==0).sum()
Luaran:
0
# reset index
DATA.reset_index(inplace=True)
DATA.tail()
# Kita akan menggambar jumlah spam dan jumlah non-spam dalam sebuah grafik pie.
# untuk ini diperlukan matplotlib:
# Kalau pakai jupyter, agar bisa menggambar secara langsung ketik perintah ini:
# %matplotlib inline
# Jumlah spam dan non-spam dapat dihitung melalui kolom KLASIFIKASI pada DATA:
DATA.KLASIFIKASI.value_counts()
Luaran:
0 6451
1 3293
Name: KLASIFIKASI, dtype: int64
126 Machine Learning dengan Python
jumlah_nonspam=DATA.KLASIFIKASI.value_counts()[0]
jumlah_spam=DATA.KLASIFIKASI.value_counts()[1]
print(‘Jumlah nonspam =’ , jumlah_nonspam)
print(‘Jumlah spam =’ , jumlah_spam)
Luaran:
Jumlah nonspam = 6451
Jumlah spam = 3293
plt.figure(figsize=(4, 4))
plt.pie(jumlah_klasifikasi,labels=nama_klasifikasi,
textprops={‘fontsize’: 20}, startangle=90,
autopct=’%1.0f%%’, colors=warna_klasifikasi,
explode=[0, 0.1])
plt.show()
![Screenshot%20%289641%29.png]
(attachment:Screenshot%20%289641%29.png)
# tokenizing
kata=contoh.lower().split()
kata
Luaran:
[‘saya’, ‘makan’, ‘tomat’]
# cleaning (stopwording)
kata.remove(‘saya’)
kata
Luaran:
[‘makan’, ‘tomat’]
“””Di sini kita akan memakai librari NLTK untuk melakukan tokenizing, cleaning, dan
stemming.”””
import nltk
from nltk.tokenize import word_tokenize # untuk
tokenizing
from nltk.corpus import stopwords # daftar kata yang
dibuang
from nltk.stem import SnowballStemmer # untuk
stemming
nltk.download(‘punkt’)
Luaran:
[nltk_data] Downloading package punkt to
[nltk_data] C:\Users\User\AppData\Roaming\nltk_
128 Machine Learning dengan Python
data...
[nltk_data] Package punkt is already up-to-date!
Out[36]:
True
nltk.download(‘stopwords’)
Luaran:
[nltk_data] Downloading package stopwords to
[nltk_data] C:\Users\User\AppData\Roaming\nltk_
data...
[nltk_data] Package stopwords is already up-to-date!
Out[37]:
True
kata_stop_en = set(stopwords.words(‘english’))
# Ada berapa kata stopwords di atas:
len(kata_stop_en)
Luaran:
179
# Isi stopwords:
kata_stop_en
Luaran:
Natural Language Process (NLP): Machine Learning untuk Data Teks 129
{‘a’,
‘about’,
‘above’,
‘after’,
‘again’,
‘against’,
‘ain’,
‘all’,
‘am’,
‘an’,
‘and’,
‘any’,
‘are’,
‘aren’,
“aren’t”,
‘as’,
‘at’,
‘be’,
‘because’,
‘been’,
‘before’,
‘being’,
‘below’,
‘between’,
‘both’,
‘but’,
‘by’,
‘can’,
‘couldn’,
130 Machine Learning dengan Python
“couldn’t”,
‘d’,
‘did’,
‘didn’,
“didn’t”,
‘do’,
‘does’,
‘doesn’,
“doesn’t”,
‘doing’,
‘don’,
“don’t”,
‘down’,
‘during’,
‘each’,
‘few’,
‘for’,
‘from’,
‘further’,
‘had’,
‘hadn’,
“hadn’t”,
‘has’,
‘hasn’,
“hasn’t”,
‘have’,
‘haven’,
“haven’t”,
‘having’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 131
‘he’,
‘her’,
‘here’,
‘hers’,
‘herself’,
‘him’,
‘himself’,
‘his’,
‘how’,
‘i’,
‘if’,
‘in’,
‘into’,
‘is’,
‘isn’,
“isn’t”,
‘it’,
“it’s”,
‘its’,
‘itself’,
‘just’,
‘ll’,
‘m’,
‘ma’,
‘me’,
‘mightn’,
“mightn’t”,
‘more’,
‘most’,
132 Machine Learning dengan Python
‘mustn’,
“mustn’t”,
‘my’,
‘myself’,
‘needn’,
“needn’t”,
‘no’,
‘nor’,
‘not’,
‘now’,
‘o’,
‘of’,
‘off’,
‘on’,
‘once’,
‘only’,
‘or’,
‘other’,
‘our’,
‘ours’,
‘ourselves’,
‘out’,
‘over’,
‘own’,
‘re’,
‘s’,
‘same’,
‘shan’,
“shan’t”,
Natural Language Process (NLP): Machine Learning untuk Data Teks 133
‘she’,
“she’s”,
‘should’,
“should’ve”,
‘shouldn’,
“shouldn’t”,
‘so’,
‘some’,
‘such’,
‘t’,
‘than’,
‘that’,
“that’ll”,
‘the’,
‘their’,
‘theirs’,
‘them’,
‘themselves’,
‘then’,
‘there’,
‘these’,
‘they’,
‘this’,
‘those’,
‘through’,
‘to’,
‘too’,
‘under’,
‘until’,
134 Machine Learning dengan Python
‘up’,
‘ve’,
‘very’,
‘was’,
‘wasn’,
“wasn’t”,
‘we’,
‘were’,
‘weren’,
“weren’t”,
‘what’,
‘when’,
‘where’,
‘which’,
‘while’,
‘who’,
‘whom’,
‘why’,
‘will’,
‘with’,
‘won’,
“won’t”,
‘wouldn’,
“wouldn’t”,
‘y’,
‘you’,
“you’d”,
“you’ll”,
“you’re”,
Natural Language Process (NLP): Machine Learning untuk Data Teks 135
“you’ve”,
‘your’,
‘yours’,
‘yourself’,
‘yourselves’}
kata_stop_indo = set(stopwords.words(‘indonesian’))
kata_stop_indo
{‘ada’,
‘adalah’,
‘adanya’,
‘adapun’,
‘agak’,
‘agaknya’,
‘agar’,
‘akan’,
‘akankah’,
‘akhir’,
‘akhiri’,
‘akhirnya’,
‘aku’,
‘akulah’,
‘amat’,
‘amatlah’,
‘anda’,
‘andalah’,
‘antar’,
‘antara’,
‘antaranya’,
136 Machine Learning dengan Python
‘apa’,
‘apaan’,
‘apabila’,
‘apakah’,
‘apalagi’,
‘apatah’,
‘artinya’,
‘asal’,
‘asalkan’,
‘atas’,
‘atau’,
‘ataukah’,
‘ataupun’,
‘awal’,
‘awalnya’,
‘bagai’,
‘bagaikan’,
‘bagaimana’,
‘bagaimanakah’,
‘bagaimanapun’,
‘bagi’,
‘bagian’,
‘bahkan’,
‘bahwa’,
‘bahwasanya’,
‘baik’,
‘bakal’,
‘bakalan’,
‘balik’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 137
‘banyak’,
‘bapak’,
‘baru’,
‘bawah’,
‘beberapa’,
‘begini’,
‘beginian’,
‘beginikah’,
‘beginilah’,
‘begitu’,
‘begitukah’,
‘begitulah’,
‘begitupun’,
‘bekerja’,
‘belakang’,
‘belakangan’,
‘belum’,
‘belumlah’,
‘benar’,
‘benarkah’,
‘benarlah’,
‘berada’,
‘berakhir’,
‘berakhirlah’,
‘berakhirnya’,
‘berapa’,
‘berapakah’,
‘berapalah’,
‘berapapun’,
138 Machine Learning dengan Python
‘berarti’,
‘berawal’,
‘berbagai’,
‘berdatangan’,
‘beri’,
‘berikan’,
‘berikut’,
‘berikutnya’,
‘berjumlah’,
‘berkali-kali’,
‘berkata’,
‘berkehendak’,
‘berkeinginan’,
‘berkenaan’,
‘berlainan’,
‘berlalu’,
‘berlangsung’,
‘berlebihan’,
‘bermacam’,
‘bermacam-macam’,
‘bermaksud’,
‘bermula’,
‘bersama’,
‘bersama-sama’,
‘bersiap’,
‘bersiap-siap’,
‘bertanya’,
‘bertanya-tanya’,
‘berturut’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 139
‘berturut-turut’,
‘bertutur’,
‘berujar’,
‘berupa’,
‘besar’,
‘betul’,
‘betulkah’,
‘biasa’,
‘biasanya’,
‘bila’,
‘bilakah’,
‘bisa’,
‘bisakah’,
‘boleh’,
‘bolehkah’,
‘bolehlah’,
‘buat’,
‘bukan’,
‘bukankah’,
‘bukanlah’,
‘bukannya’,
‘bulan’,
‘bung’,
‘cara’,
‘caranya’,
‘cukup’,
‘cukupkah’,
‘cukuplah’,
‘cuma’,
140 Machine Learning dengan Python
‘dahulu’,
‘dalam’,
‘dan’,
‘dapat’,
‘dari’,
‘daripada’,
‘datang’,
‘dekat’,
‘demi’,
‘demikian’,
‘demikianlah’,
‘dengan’,
‘depan’,
‘di’,
‘dia’,
‘diakhiri’,
‘diakhirinya’,
‘dialah’,
‘diantara’,
‘diantaranya’,
‘diberi’,
‘diberikan’,
‘diberikannya’,
‘dibuat’,
‘dibuatnya’,
‘didapat’,
‘didatangkan’,
‘digunakan’,
‘diibaratkan’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 141
‘diibaratkannya’,
‘diingat’,
‘diingatkan’,
‘diinginkan’,
‘dijawab’,
‘dijelaskan’,
‘dijelaskannya’,
‘dikarenakan’,
‘dikatakan’,
‘dikatakannya’,
‘dikerjakan’,
‘diketahui’,
‘diketahuinya’,
‘dikira’,
‘dilakukan’,
‘dilalui’,
‘dilihat’,
‘dimaksud’,
‘dimaksudkan’,
‘dimaksudkannya’,
‘dimaksudnya’,
‘diminta’,
‘dimintai’,
‘dimisalkan’,
‘dimulai’,
‘dimulailah’,
‘dimulainya’,
‘dimungkinkan’,
‘dini’,
142 Machine Learning dengan Python
‘dipastikan’,
‘diperbuat’,
‘diperbuatnya’,
‘dipergunakan’,
‘diperkirakan’,
‘diperlihatkan’,
‘diperlukan’,
‘diperlukannya’,
‘dipersoalkan’,
‘dipertanyakan’,
‘dipunyai’,
‘diri’,
‘dirinya’,
‘disampaikan’,
‘disebut’,
‘disebutkan’,
‘disebutkannya’,
‘disini’,
‘disinilah’,
‘ditambahkan’,
‘ditandaskan’,
‘ditanya’,
‘ditanyai’,
‘ditanyakan’,
‘ditegaskan’,
‘ditujukan’,
‘ditunjuk’,
‘ditunjuki’,
‘ditunjukkan’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 143
‘ditunjukkannya’,
‘ditunjuknya’,
‘dituturkan’,
‘dituturkannya’,
‘diucapkan’,
‘diucapkannya’,
‘diungkapkan’,
‘dong’,
‘dua’,
‘dulu’,
‘empat’,
‘enggak’,
‘enggaknya’,
‘entah’,
‘entahlah’,
‘guna’,
‘gunakan’,
‘hal’,
‘hampir’,
‘hanya’,
‘hanyalah’,
‘hari’,
‘harus’,
‘haruslah’,
‘harusnya’,
‘hendak’,
‘hendaklah’,
‘hendaknya’,
‘hingga’,
144 Machine Learning dengan Python
‘ia’,
‘ialah’,
‘ibarat’,
‘ibaratkan’,
‘ibaratnya’,
‘ibu’,
‘ikut’,
‘ingat’,
‘ingat-ingat’,
‘ingin’,
‘inginkah’,
‘inginkan’,
‘ini’,
‘inikah’,
‘inilah’,
‘itu’,
‘itukah’,
‘itulah’,
‘jadi’,
‘jadilah’,
‘jadinya’,
‘jangan’,
‘jangankan’,
‘janganlah’,
‘jauh’,
‘jawab’,
‘jawaban’,
‘jawabnya’,
‘jelas’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 145
‘jelaskan’,
‘jelaslah’,
‘jelasnya’,
‘jika’,
‘jikalau’,
‘juga’,
‘jumlah’,
‘jumlahnya’,
‘justru’,
‘kala’,
‘kalau’,
‘kalaulah’,
‘kalaupun’,
‘kalian’,
‘kami’,
‘kamilah’,
‘kamu’,
‘kamulah’,
‘kan’,
‘kapan’,
‘kapankah’,
‘kapanpun’,
‘karena’,
‘karenanya’,
‘kasus’,
‘kata’,
‘katakan’,
‘katakanlah’,
‘katanya’,
146 Machine Learning dengan Python
‘ke’,
‘keadaan’,
‘kebetulan’,
‘kecil’,
‘kedua’,
‘keduanya’,
‘keinginan’,
‘kelamaan’,
‘kelihatan’,
‘kelihatannya’,
‘kelima’,
‘keluar’,
‘kembali’,
‘kemudian’,
‘kemungkinan’,
‘kemungkinannya’,
‘kenapa’,
‘kepada’,
‘kepadanya’,
‘kesampaian’,
‘keseluruhan’,
‘keseluruhannya’,
‘keterlaluan’,
‘ketika’,
‘khususnya’,
‘kini’,
‘kinilah’,
‘kira’,
‘kira-kira’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 147
‘kiranya’,
‘kita’,
‘kitalah’,
‘kok’,
‘kurang’,
‘lagi’,
‘lagian’,
‘lah’,
‘lain’,
‘lainnya’,
‘lalu’,
‘lama’,
‘lamanya’,
‘lanjut’,
‘lanjutnya’,
‘lebih’,
‘lewat’,
‘lima’,
‘luar’,
‘macam’,
‘maka’,
‘makanya’,
‘makin’,
‘malah’,
‘malahan’,
‘mampu’,
‘mampukah’,
‘mana’,
‘manakala’,
148 Machine Learning dengan Python
‘manalagi’,
‘masa’,
‘masalah’,
‘masalahnya’,
‘masih’,
‘masihkah’,
‘masing’,
‘masing-masing’,
‘mau’,
‘maupun’,
‘melainkan’,
‘melakukan’,
‘melalui’,
‘melihat’,
‘melihatnya’,
‘memang’,
‘memastikan’,
‘memberi’,
‘memberikan’,
‘membuat’,
‘memerlukan’,
‘memihak’,
‘meminta’,
‘memintakan’,
‘memisalkan’,
‘memperbuat’,
‘mempergunakan’,
‘memperkirakan’,
‘memperlihatkan’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 149
‘mempersiapkan’,
‘mempersoalkan’,
‘mempertanyakan’,
‘mempunyai’,
‘memulai’,
‘memungkinkan’,
‘menaiki’,
‘menambahkan’,
‘menandaskan’,
‘menanti’,
‘menanti-nanti’,
‘menantikan’,
‘menanya’,
‘menanyai’,
‘menanyakan’,
‘mendapat’,
‘mendapatkan’,
‘mendatang’,
‘mendatangi’,
‘mendatangkan’,
‘menegaskan’,
‘mengakhiri’,
‘mengapa’,
‘mengatakan’,
‘mengatakannya’,
‘mengenai’,
‘mengerjakan’,
‘mengetahui’,
‘menggunakan’,
150 Machine Learning dengan Python
‘menghendaki’,
‘mengibaratkan’,
‘mengibaratkannya’,
‘mengingat’,
‘mengingatkan’,
‘menginginkan’,
‘mengira’,
‘mengucapkan’,
‘mengucapkannya’,
‘mengungkapkan’,
‘menjadi’,
‘menjawab’,
‘menjelaskan’,
‘menuju’,
‘menunjuk’,
‘menunjuki’,
‘menunjukkan’,
‘menunjuknya’,
‘menurut’,
‘menuturkan’,
‘menyampaikan’,
‘menyangkut’,
‘menyatakan’,
‘menyebutkan’,
‘menyeluruh’,
‘menyiapkan’,
‘merasa’,
‘mereka’,
‘merekalah’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 151
‘merupakan’,
‘meski’,
‘meskipun’,
‘meyakini’,
‘meyakinkan’,
‘minta’,
‘mirip’,
‘misal’,
‘misalkan’,
‘misalnya’,
‘mula’,
‘mulai’,
‘mulailah’,
‘mulanya’,
‘mungkin’,
‘mungkinkah’,
‘nah’,
‘naik’,
‘namun’,
‘nanti’,
‘nantinya’,
‘nyaris’,
‘nyatanya’,
‘oleh’,
‘olehnya’,
‘pada’,
‘padahal’,
‘padanya’,
‘pak’,
152 Machine Learning dengan Python
‘paling’,
‘panjang’,
‘pantas’,
‘para’,
‘pasti’,
‘pastilah’,
‘penting’,
‘pentingnya’,
‘per’,
‘percuma’,
‘perlu’,
‘perlukah’,
‘perlunya’,
‘pernah’,
‘persoalan’,
‘pertama’,
‘pertama-tama’,
‘pertanyaan’,
‘pertanyakan’,
‘pihak’,
‘pihaknya’,
‘pukul’,
‘pula’,
‘pun’,
‘punya’,
‘rasa’,
‘rasanya’,
‘rata’,
‘rupanya’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 153
‘saat’,
‘saatnya’,
‘saja’,
‘sajalah’,
‘saling’,
‘sama’,
‘sama-sama’,
‘sambil’,
‘sampai’,
‘sampai-sampai’,
‘sampaikan’,
‘sana’,
‘sangat’,
‘sangatlah’,
‘satu’,
‘saya’,
‘sayalah’,
‘se’,
‘sebab’,
‘sebabnya’,
‘sebagai’,
‘sebagaimana’,
‘sebagainya’,
‘sebagian’,
‘sebaik’,
‘sebaik-baiknya’,
‘sebaiknya’,
‘sebaliknya’,
‘sebanyak’,
154 Machine Learning dengan Python
‘sebegini’,
‘sebegitu’,
‘sebelum’,
‘sebelumnya’,
‘sebenarnya’,
‘seberapa’,
‘sebesar’,
‘sebetulnya’,
‘sebisanya’,
‘sebuah’,
‘sebut’,
‘sebutlah’,
‘sebutnya’,
‘secara’,
‘secukupnya’,
‘sedang’,
‘sedangkan’,
‘sedemikian’,
‘sedikit’,
‘sedikitnya’,
‘seenaknya’,
‘segala’,
‘segalanya’,
‘segera’,
‘seharusnya’,
‘sehingga’,
‘seingat’,
‘sejak’,
‘sejauh’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 155
‘sejenak’,
‘sejumlah’,
‘sekadar’,
‘sekadarnya’,
‘sekali’,
‘sekali-kali’,
‘sekalian’,
‘sekaligus’,
‘sekalipun’,
‘sekarang’,
‘sekecil’,
‘seketika’,
‘sekiranya’,
‘sekitar’,
‘sekitarnya’,
‘sekurang-kurangnya’,
‘sekurangnya’,
‘sela’,
‘selain’,
‘selaku’,
‘selalu’,
‘selama’,
‘selama-lamanya’,
‘selamanya’,
‘selanjutnya’,
‘seluruh’,
‘seluruhnya’,
‘semacam’,
‘semakin’,
156 Machine Learning dengan Python
‘semampu’,
‘semampunya’,
‘semasa’,
‘semasih’,
‘semata’,
‘semata-mata’,
‘semaunya’,
‘sementara’,
‘semisal’,
‘semisalnya’,
‘sempat’,
‘semua’,
‘semuanya’,
‘semula’,
‘sendiri’,
‘sendirian’,
‘sendirinya’,
‘seolah’,
‘seolah-olah’,
‘seorang’,
‘sepanjang’,
‘sepantasnya’,
‘sepantasnyalah’,
‘seperlunya’,
‘seperti’,
‘sepertinya’,
‘sepihak’,
‘sering’,
‘seringnya’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 157
‘serta’,
‘serupa’,
‘sesaat’,
‘sesama’,
‘sesampai’,
‘sesegera’,
‘sesekali’,
‘seseorang’,
‘sesuatu’,
‘sesuatunya’,
‘sesudah’,
‘sesudahnya’,
‘setelah’,
‘setempat’,
‘setengah’,
‘seterusnya’,
‘setiap’,
‘setiba’,
‘setibanya’,
‘setidak-tidaknya’,
‘setidaknya’,
‘setinggi’,
‘seusai’,
‘sewaktu’,
‘siap’,
‘siapa’,
‘siapakah’,
‘siapapun’,
‘sini’,
158 Machine Learning dengan Python
‘sinilah’,
‘soal’,
‘soalnya’,
‘suatu’,
‘sudah’,
‘sudahkah’,
‘sudahlah’,
‘supaya’,
‘tadi’,
‘tadinya’,
‘tahu’,
‘tahun’,
‘tak’,
‘tambah’,
‘tambahnya’,
‘tampak’,
‘tampaknya’,
‘tandas’,
‘tandasnya’,
‘tanpa’,
‘tanya’,
‘tanyakan’,
‘tanyanya’,
‘tapi’,
‘tegas’,
‘tegasnya’,
‘telah’,
‘tempat’,
‘tengah’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 159
‘tentang’,
‘tentu’,
‘tentulah’,
‘tentunya’,
‘tepat’,
‘terakhir’,
‘terasa’,
‘terbanyak’,
‘terdahulu’,
‘terdapat’,
‘terdiri’,
‘terhadap’,
‘terhadapnya’,
‘teringat’,
‘teringat-ingat’,
‘terjadi’,
‘terjadilah’,
‘terjadinya’,
‘terkira’,
‘terlalu’,
‘terlebih’,
‘terlihat’,
‘termasuk’,
‘ternyata’,
‘tersampaikan’,
‘tersebut’,
‘tersebutlah’,
‘tertentu’,
‘tertuju’,
160 Machine Learning dengan Python
‘terus’,
‘terutama’,
‘tetap’,
‘tetapi’,
‘tiap’,
‘tiba’,
‘tiba-tiba’,
‘tidak’,
‘tidakkah’,
‘tidaklah’,
‘tiga’,
‘tinggi’,
‘toh’,
‘tunjuk’,
‘turut’,
‘tutur’,
‘tuturnya’,
‘ucap’,
‘ucapnya’,
‘ujar’,
‘ujarnya’,
‘umum’,
‘umumnya’,
‘ungkap’,
‘ungkapnya’,
‘untuk’,
‘usah’,
‘usai’,
‘waduh’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 161
‘wah’,
‘wahai’,
‘waktu’,
‘waktunya’,
‘walau’,
‘walaupun’,
‘wong’,
‘yaitu’,
‘yakin’,
‘yakni’,
‘yang’}
# Cara lain adalah membuat list baru yang tidak terdapat di stopwords:
kata_baru
Luaran:
[‘eating’, ‘three’, ‘bananas’, ‘?’, ‘dont’, ‘eat’,
‘much’, ‘!’]
contoh.lower().split()
Luaran:
[‘are’, ‘you’, ‘eating’, ‘three’, ‘bananas?’, ‘dont’,
‘eat’, ‘too’, ‘much!’]
‘a’.isalpha()
Luaran:
True
‘?’.isalpha()
Luaran:
False
# Buat list baru yang tidak terdapat di stopwords dan bukan pungtuasi:
Luaran:
[‘eating’, ‘three’, ‘bananas’, ‘dont’, ‘eat’, ‘much’]
Natural Language Process (NLP): Machine Learning untuk Data Teks 163
stemmer = SnowballStemmer(‘english’)
kata=’organization’
kata_dasar=stemmer.stem(kata)
kata_dasar
Luaran:
‘organ’
DATA.at[0,’EMAIL’]
Luaran:
164 Machine Learning dengan Python
# Kita butuh librari untuk membersihkan tag dan membuat e-mail di atas terbaca dengan
lebih baik.
</tbody>
</table>
</body>
</html>
<tr>
<td colspan=”3D3”>
<hr color=”3Dblack” noshade=”” size=”3D1”/>
</td>
</tr>
<!-- End Calypso -->
<!-- Inserted by Calypso=
-->
<font color=”3D#000000”
face=”3DVERDANA,ARIAL,HELVETICA” size=”3D-2”>
<br/>
</font>
<=
/TR>
<!-- End Calypso -->
<font bold”=”” color=”3D#ff0000” face=’3D”Copperplate’
gothic=”” ptsize=’3D”10”’ size=”3D5”>
<center>
Save up to 70% on Life Insurance.
</center>
</font>
<font 0000=”” bold”=”” color=”3D#ff=”
face=’3D”Copperplate’ gothic=”” ptsize=’3D”10”’
size=”3D5”>
<center>
Why Spend More Than You Have To?
166 Machine Learning dengan Python
<center>
<font bold”=”” color=”3D#ff0000”
face=’3D”Copperplate’ gothic=”” pt=’SIZE=3D”10”’
size=”3D5”>
<center>
Life Quote Savings
<center>
<p align=”3Dleft”>
</p>
<p align=”3Dleft”>
</p>
</center>
</center>
</font>
</center>
</center>
</font>
<br/>
<p>
</p>
<center>
<table border=”3D0” bordercolor=”3D#111111”
cellpadding=”3D0” cellspacing=”3D0” wi=”dth=3D650”>
<tbody>
</tbody>
</table>
<table border=”3D0” bordercolor=”3D#111111”
cellpadding=”3D5” cellspacing=”3D0” wi=”dth=3D650”>
<tbody>
<tr>
Natural Language Process (NLP): Machine Learning untuk Data Teks 167
Free Quote!
</a>
</font>
</b>
</p>
</td>
<p>
<font face=”3DVerdana” size=”3D4”>
<strong>
<center>
Protecting your family is the best
Natural Language Process (NLP): Machine Learning untuk Data Teks 169
<br/>
<br/>
<br/>
<p>
</p>
<p align=”3Dleft”>
<br/>
</p>
</center>
<br/>
<br/>
<br/>
<br/>
<p align=”3Dcenter”>
<br/>
</p>
<p align=”3Dleft”>
<br/>
</p>
<br/>
<br/>
If you are in receipt of this=
email
in error and/or wish to be removed from our
list,
<a href=’3D”mailto:[email protected]”’>
PLEASE CLICK HERE
</a>
AND TYPE =
Natural Language Process (NLP): Machine Learning untuk Data Teks 171
REMOVE. If you
reside in any state which prohibits e-mail
solicitations for insuran=
ce,
please disregard this
email.
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br=>
<br/>
<br/>
<br/>
</br=>
<!--=
CENTER-->
In [55]:
172 Machine Learning dengan Python
Ensurin=
g your
family’s financial security is very important.
Life Quote Savings ma=
kes
buying life insurance simple and affordable. We
Provide FREE Access =
to The
Very Best Companies and The Lowest Rates.
Free Quote!
# Nah, coba sekarang lakukan rangkaian: buang tag html, lowering, tokenizing, cleaning,
dan stemming:
‘save’,
‘kes’,
‘buy’,
‘life’,
‘insur’,
‘simpl’,
‘afford’,
‘provid’,
‘free’,
‘access’,
‘best’,
‘compani’,
‘lowest’,
‘rate’,
‘life’,
‘quot’,
‘save’,
‘fast’,
‘save’,
‘money’,
‘let’,
‘us’,
‘help’,
‘get’,
‘start’,
‘best’,
‘ue’,
‘countri’,
‘new’,
176 Machine Learning dengan Python
‘coverag’,
‘save’,
‘hundr’,
‘even’,
‘usand’,
‘dollar’,
‘request’,
‘free’,
‘quot’,
‘lifequot’,
‘save’,
‘servic’,
‘take’,
‘less’,
‘minut’,
‘complet’,
‘shop’,
‘compar’,
‘save’,
‘type’,
‘life’,
‘insur’,
‘click’,
‘free’,
‘quot’,
‘protect’,
‘famili’,
‘best’,
‘invest’,
Natural Language Process (NLP): Machine Learning untuk Data Teks 177
‘r’,
‘make’,
‘receipt’,
‘email’,
‘error’,
‘wish’,
‘remov’,
‘list’,
‘pleas’,
‘click’,
‘type’,
‘remov’,
‘resid’,
‘state’,
‘prohibit’,
‘solicit’,
‘ce’,
‘pleas’,
‘disregard’,
‘email’]
def praproses(pesan,
stemmer=SnowballStemmer(‘english’), kata_stop =
set(stopwords.words(‘english’))):
tanpa_tag=BeautifulSoup(pesan, ‘html.parser’).get_
text() # buang tag
kata=word_tokenize(tanpa_tag.lower()) # lowering,
tokenizing
kata_baru=[]
178 Machine Learning dengan Python
for k in kata:
if k not in kata_stop and k.isalpha(): #
cleaning
kata_dasar=stemmer.stem(k) # stemming
kata_baru.append(kata_dasar)
return kata_baru
# Sekarang kita akan mengaplikasikan fungsi tersebut untuk seluruh data e-mail.
# Tetapi, kita perlu coba dulu dengan beberapa e-mail saja.
# Coba baca data 2 e-mail pertama saja:
DATA.EMAIL.iloc[0:2]
Luaran:
0 <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Tr...
1 1) Fight The Risk of Cancer!\nhttp://www.adcli...
Name: EMAIL, dtype: object
contoh=DATA.EMAIL.iloc[10:12].apply(praproses)
contoh
Luaran:
10 [cellular, phone, accessori, wholesal, price,
...
11 [click, simpli, amateur, like, girl, next,
doo...
Name: EMAIL, dtype: object
Natural Language Process (NLP): Machine Learning untuk Data Teks 179
type(contoh)
Luaran:
pandas.core.series.Series
contoh.index
Luaran:
RangeIndex(start=10, stop=12, step=1)
DATA.iloc[contoh.index]
DATA.iloc[contoh.index].KLASIFIKASI
10 1
11 1
Name: KLASIFIKASI, dtype: int64
len(list_token)
list_token
0 [save, life, insur, spend, life, quot, save,
g...
1 [fight, risk, cancer, http, slim, guarante,
lo...
2 [fight, risk, cancer, http, slim, guarante,
lo...
180 Machine Learning dengan Python
# Kita akan membuat list token gabungan dari seluruh e-mail (list_token yang tadi adalah
token tiap e-mail).
list_token_gabungan=[]
for daftar in list_token:
for kata in daftar:
list_token_gabungan.append(kata)
len(list_token_gabungan)
Luaran:
1269100
index_spam=DATA[DATA.KLASIFIKASI==1].index
index_spam
Natural Language Process (NLP): Machine Learning untuk Data Teks 181
Luaran:
Int64Index([ 0, 1, 2, 3, 4, 5, 6,
7, 8, 9,
...
3283, 3284, 3285, 3286, 3287, 3288, 3289,
3290, 3291, 3292],
dtype=’int64’, length=3293)
index_nonspam=DATA[DATA.KLASIFIKASI==0].index
index_nonspam
Luaran:
Int64Index([3293, 3294, 3295, 3296, 3297, 3298, 3299,
3300, 3301, 3302,
...
9734, 9735, 9736, 9737, 9738, 9739, 9740,
9741, 9742, 9743],
dtype=’int64’, length=6451)
list_spam=list_token[index_spam]
list_spam
Luaran:
0 [save, life, insur, spend, life, quot, save,
g...
1 [fight, risk, cancer, http, slim, guarante,
lo...
2 [fight, risk, cancer, http, slim, guarante,
lo...
3 [adult, club, offer, free, membership,
instant...
182 Machine Learning dengan Python
list_nonspam=list_token[index_nonspam]
list_nonspam
3293 [date, wed, aug, chris, garrigu, ca,
reproduc,...
3294 [martin, post, tasso, papadopoulo, greek,
scul...
3295 [man, threaten, explos, moscow, thursday,
augu...
3296 [klez, virus, wo, die, alreadi, prolif,
virus,...
3297 [wed, aug, ulis, ponc, wrote, hi, command,
ins...
...
9739 [http, bizarr, collect, stuf, anim, could,
fet...
Natural Language Process (NLP): Machine Learning untuk Data Teks 183
list_token_spam=[]
for daftar in list_spam:
for kata in daftar:
list_token_spam.append(kata)
list_token_nonspam=[]
for daftar in list_nonspam:
for kata in daftar:
list_token_nonspam.append(kata)
print(len(list_token_spam))
print(len(list_token_nonspam))
print(len(list_token_gabungan))
Luaran:
557699
711401
1269100
551845+712498
Luaran:
1264343
awan_kata= WordCloud(background_color=’white’,
max_words=500, colormap=’ocean’)
awan_kata.generate(spam_gabung)
Luaran:
<WordCloud.WordCloud.WordCloud at 0x2e722ec1048>
plt.figure(figsize=[10, 10])
plt.imshow(awan_kata, interpolation=’bilinear’)
plt.axis(‘off’)
plt.show()
nonspam_gabung=’ ‘.join(list_token_nonspam)
Natural Language Process (NLP): Machine Learning untuk Data Teks 185
awan_kata.generate(nonspam_gabung)
plt.figure(figsize=[10, 10])
plt.imshow(awan_kata, interpolation=’bilinear’)
plt.axis(‘off’)
plt.show()
gabungan_gabung=’ ‘.join(list_token_gabungan)
awan_kata.generate(gabungan_gabung)
plt.figure(figsize=[10, 10])
plt.imshow(awan_kata, interpolation=’bilinear’)
plt.axis(‘off’)
plt.show()
def vektor_email(pesan):
vektor=[]
for item in pesan:
item_vek={}
for kata in item:
item_vek.update({kata : kata.count(kata)})
vektor+=[item_vek]
186 Machine Learning dengan Python
token_vektor=pd.DataFrame(vektor).fillna(0).
astype(int)
return token_vektor
token_vek=vektor_email(list_token)
token_vek.head()
vokab_indeks=token_vek.columns
vokab_vek=pd.DataFrame(index=range(len(vokab_
indeks)),data=vokab_indeks)
vokab_vek.head()
email_vek=list_token.apply(lambda x: ‘ ‘.join(x))
email_vek[0:10]
Luaran:
0 save life insur spend life quot save g famili ...
1 fight risk cancer http slim guarante lose lbs ...
2 fight risk cancer http slim guarante lose lbs ...
3 adult club offer free membership instant acces...
4 thought might like slim guarante lose lbs day ...
5 powerhous gift program want miss get founder m...
6 help want year old fortun compani grow tremend...
7 reliaquot save life insur life chang instant i...
8 tire bull want stop lose money want real money...
9 dear cost effect direct email advertis promot ...
Name: EMAIL, dtype: object
klasifikasi_vek=DATA.KLASIFIKASI
klasifikasi_vek[0:10]
Luaran:
0 1
1 1
2 1
Natural Language Process (NLP): Machine Learning untuk Data Teks 187
3 1
4 1
5 1
6 1
7 1
8 1
9 1
Name: KLASIFIKASI, dtype: int64
klasifikasi_vek.value_counts()
Luaran:
0 6451
1 3293
Name: KLASIFIKASI, dtype: int64
indeks_spam=klasifikasi_vek[klasifikasi_vek==1].index
indeks_spam
Luaran:
Int64Index([ 0, 1, 2, 3, 4, 5, 6,
7, 8, 9,
...
3283, 3284, 3285, 3286, 3287, 3288, 3289,
3290, 3291, 3292],
dtype=’int64’, length=3293)
indeks_nonspam=klasifikasi_vek[klasifikasi_vek==0].index
indeks_nonspam
Luaran:
188 Machine Learning dengan Python
# Cek ukuran
print(len(indeks_nonspam))
print(len(indeks_spam))
print(len(klasifikasi_vek))
print(len(token_vek))
len(indeks_nonspam)+len(indeks_spam)
Luaran:
6451
3293
9744
9744
Out[153]:
9744
token_vek.tail()
token_vek.iloc[indeks_spam].head()
token_vek.iloc[indeks_spam].sum()
save 518
life 496
insur 284
Natural Language Process (NLP): Machine Learning untuk Data Teks 189
spend 124
quot 238
...
glxgear 0
cack 0
stil 0
kdm 0
xserver 0
Length: 27220, dtype: int64
token_vek.iloc[indeks_nonspam].sum
<bound method DataFrame.sum of save life insur
spend quot g famili financi secur import ... \
3293 0 0 0 0 0 0 0 0
0 0 ...
3294 0 0 0 0 0 0 0 0
0 0 ...
3295 0 0 0 0 0 0 0 0
1 0 ...
3296 0 0 0 0 0 0 0 0
1 0 ...
3297 0 0 0 0 1 0 0 0
0 0 ...
... ... ... ... ... ... .. ... ...
... ... ...
9739 0 0 0 0 0 0 0 0
0 0 ...
9740 0 0 0 0 0 0 0 0
0 0 ...
9741 0 0 0 0 0 0 0 0
190 Machine Learning dengan Python
0 0 ...
9742 0 0 0 0 0 0 1 0
0 0 ...
9743 0 0 0 0 0 0 0 0
0 0 ...
# Sekarang akan kita hitung probabilitas bayes, seperti pada rumus yang di atas.
# Agar probabilitas masing-masing kata tidak nol maka jumlah tiap token harus ditambah alpha.
alpha=1
prob_spam=token_vek.iloc[indeks_spam].sum()+alpha
prob_spam=prob_spam/prob_spam.sum()
prob_spam
Luaran:
save 0.001555
life 0.001489
insur 0.000854
spend 0.000374
quot 0.000716
...
glxgear 0.000003
cack 0.000003
stil 0.000003
kdm 0.000003
xserver 0.000003
Length: 27220, dtype: float64
prob_nonspam=token_vek.iloc[indeks_nonspam].
sum()+alpha
prob_nonspam=prob_nonspam/prob_nonspam.sum()
prob_nonspam
Luaran:
save 0.000418
life 0.000561
insur 0.000068
spend 0.000288
192 Machine Learning dengan Python
quot 0.000380
...
glxgear 0.000004
cack 0.000004
stil 0.000004
kdm 0.000004
xserver 0.000004
Length: 27220, dtype: float64
# Nah, sekarang buatlah fungsi untuk menghitung prob bayes untuk sebuah kalimat def
hitung_bayes(kalimat,prob):
# Bersihkan dulu:
list_token=praproses(kalimat)
p=1
for kata in list_token:
try:
p *=prob[kata]
except:
pass #print(‘Tidak ada dikamus:’,kata )
return p
def hitung_bayes_log(kalimat,prob):
# Bersihkan dulu:
list_token=praproses(kalimat)
p=0
for kata in list_token:
Natural Language Process (NLP): Machine Learning untuk Data Teks 193
try:
p +=log(prob[kata])
except:
pass #print(‘Tidak ada dikamus:’,kata )
return p
=2.953381126101875e-14
Email adalah SPAM
# Sekarang selidiki apakah e-mail itu spam atau non-spam dengan skala log.
p_as_spam=log(klasifikasi_vek.value_counts()[1]/
klasifikasi_vek.value_counts().sum())+hitung_bayes_
log(new_email,prob_spam)
p_as_nonspam=log(klasifikasi_vek.value_counts()[0]/
klasifikasi_vek.value_counts().sum())+hitung_bayes_
log(new_email,prob_nonspam)
print(f’Kesimpulan:\n log (p(spam)) ={p_as_spam}
sementara log(p(nonspam)) ={p_as_nonspam}’)
if (p_as_spam>p_as_nonspam):
print(‘Email adalah SPAM’)
elif (p_as_spam<p_as_nonspam):
print(‘Email adalah NONSPAM’)
else:
print(‘SPAM/NONSPAM sama kebolehkjadiannya’)
Luaran:
Kesimpulan:
log (p(spam)) =-25.461882330673422 sementara
log(p(nonspam)) =-31.15324064344569
Email adalah SPAM
klasifikasi_vek.value_counts().sum()
p_pre_nonspam=klasifikasi_vek.value_counts()[0]/
klasifikasi_vek.value_counts().sum()
HASIL=pd.DataFrame(prob_nonspam,columns=[‘NONSPAM’])
HASIL[‘SPAM’]=prob_spam
d=pd.DataFrame({‘NONSPAM’:p_pre_nonspam,’SPAM’:p_pre_
spam},index=[‘pre_prob’])
HASIL=HASIL.append(d)
HASIL
Luaran:
NONSPAM SPAM
save 0.000418 0.001555
life 0.000561 0.001489
insur 0.000068 0.000854
spend 0.000288 0.000374
quot 0.000380 0.000716
... ... ...
cack 0.000004 0.000003
stil 0.000004 0.000003
kdm 0.000004 0.000003
xserver 0.000004 0.000003
pre_prob 0.662048 0.337952
27221 rows × 2 columns
HASIL.columns[0]
Luaran:
‘NONSPAM’
196 Machine Learning dengan Python
# Kita buat sebuah fungsi prediksi yang mengambil data dari DataFrame HASIL def
prediksi_binari(email, data):
p0=hitung_bayes(email,data[data.columns[0]])*data.
loc[‘pre_prob’][0]
p1=hitung_bayes(email,data[data.columns[1]])*data.
loc[‘pre_prob’][1]
if p1>p0:
return data.columns[1]
else:
return data.columns[0]
prediksi_binari(‘This is only credit’, HASIL)
Luaran:
‘SPAM’
HASIL.to_csv(‘hasil_analisa_spam_nonspam.csv’)
hasil_analisa=pd.read_csv(‘hasil_analisa_spam_nonspam.
csv’)
hasil_analisa
Luaran:
Unnamed: 0 NONSPAM SPAM
0 save 0.000418 0.001555
1 life 0.000561 0.001489
2 insur 0.000068 0.000854
3 spend 0.000288 0.000374
4 quot 0.000380 0.000716
... ... ... ...
27216 cack 0.000004 0.000003
27217 stil 0.000004 0.000003
Natural Language Process (NLP): Machine Learning untuk Data Teks 197
NONSPAM SPAM
VOKAB
save 0.000418 0.001555
life 0.000561 0.001489
insur 0.000068 0.000854
spend 0.000288 0.000374
quot 0.000380 0.000716
... ... ...
cack 0.000004 0.000003
stil 0.000004 0.000003
kdm 0.000004 0.000003
xserver 0.000004 0.000003
pre_prob 0.662048 0.337952
27221 rows × 2 columns
198 Machine Learning dengan Python
# vektorisasi=CountVectorizer(stop_words=kata_stop_en)
vektorisasi=CountVectorizer()
token_vek_sklearn=vektorisasi.fit_transform(email_vek)
email_vek
Luaran:
0 save life insur spend life quot save g famili
...
1 fight risk cancer http slim guarante lose lbs
...
2 fight risk cancer http slim guarante lose lbs
Natural Language Process (NLP): Machine Learning untuk Data Teks 199
...
3 adult club offer free membership instant
acces...
4 thought might like slim guarante lose lbs day
...
...
9739 http bizarr collect stuf anim could fetch
sold...
9740 care use one also realli cute thing japanes
av...
9741 sm skip montanaro write jeremi put anoth way
i...
9742 mark hammond like given zodb sound attract
wou...
9743 hi probabl use whatsoev also problem regard
nv...
Name: EMAIL, Length: 9744, dtype: object
token_vek_sklearn
# Data dipisah menjadi dua, yaitu train dan test, dengan ukuran test_size=0.1, artinya 10
persen dipakai untuk test.
# Ini pakai CountVectorizer:
prediksi_sk=model_sk.predict(X_test_sk)
200 Machine Learning dengan Python
prediksi_sk
Luaran:
array([0, 1, 0, ..., 1, 1, 0], dtype=int64)
prediksi_sk==y_test_sk
Luaran:
5490 True
1516 True
9436 True
7944 True
5817 True
...
5576 True
2360 True
1360 True
2236 True
4910 True
Name: KLASIFIKASI, Length: 3898, dtype: bool
# Kita sudah membuat vektor di atas, yaitu token_vek yang akan dipakai di sini.
token_vek.head()
Luaran:
# Data dipisah menjadi dua, yaitu train dan test, dengan ukuran test_size=0.1, artinya 10
persen dipakai untuk test.
# Ini dengan token_vek membuat sendiri:
Natural Language Process (NLP): Machine Learning untuk Data Teks 201
prediksi=model.predict(X_test)
prediksi
array([0, 1, 0, ..., 1, 1, 0], dtype=int64)
prediksi_sk==y_test_sk
Luaran:
5490 True
1516 True
9436 True
7944 True
5817 True
...
5576 True
2360 True
1360 True
2236 True
4910 True
Name: KLASIFIKASI, Length: 3898, dtype: bool
prediksi==y_test
5490 True
1516 True
202 Machine Learning dengan Python
9436 True
7944 True
5817 True
...
5576 True
2360 True
1360 True
2236 True
4910 True
Name: KLASIFIKASI, Length: 3898, dtype: bool
new_email_vek1=new_vektor(new_email1,vokab_vek)
model.predict(new_email_vek1)==EMAIL_NONSPAM
new_email_vek_sklearn=vektorisasi.transform([new_
email1, new_email2]).toarray()
model_sk.predict(new_email_vek_sklearn)
# Simpan data yang dipakai oleh sklearn, yaitu: email_vek, klasifikasi_vek, dan hasil
analisis di dalam model_sk.
# email_vek dan klasifikasi_vek digabung saja:
DATA_SK=pd.DataFrame(email_vek)
DATA_SK[‘KLASIFIKASI’]=klasifikasi_vek
DATA_SK
Luaran:
206 Machine Learning dengan Python
EMAIL KLASIFIKASI
save life insur spend life quot save g
0 1
famili ...
fight risk cancer http slim guarante lose
1 1
lbs ...
fight risk cancer http slim guarante lose
2 1
lbs ...
adult club offer free membership instant
3 1
acces...
thought might like slim guarante lose
4 1
lbs day ...
... ... ...
http bizarr collect stuf anim could
9739 0
fetch sold...
care use one also realli cute thing
9740 0
japanes av...
sm skip montanaro write jeremi put anoth
9741 0
way i...
mark hammond like given zodb sound
9742 0
attract wou...
hi probabl use whatsoev also problem
9743 0
regard nv...
9744 rows × 2 columns
(DATA_SK.EMAIL.str.len()==0).any()
Luaran:
True
Natural Language Process (NLP): Machine Learning untuk Data Teks 207
hapus=DATA_SK[DATA_SK.EMAIL.str.len()==0].index
DATA_SK.drop(hapus, inplace=True)
DATA_SK.reset_index(inplace=True)
DATA_SK.to_csv(r’DATA_spam_nonspam_
sk.csv’,index=False)
import pickle
with open(r’HASIL_spam_nonspam_sk.pkl’, ‘wb’) as file:
pickle.dump(model_sk, file)
model_sk.coef_
Luaran:
array([[-11.19732391, -11.19732391, -7.05101961, ...,
-12.11361464,-12.11361464, -12.11361464]])
model_sk.intercept_
Luaran:
array([-1.09741561])
208 Machine Learning dengan Python
DAFTAR PUSTAKA
Beysolow II, T. 2018. Applied Natural Language Processing with Python Implementing Machine
Learning and Deep Learning Algorithms for Natural Language Processing. In Applied
Natural Language Processing with Python.
Dönmez, P. 2013. Introduction to Machine Learning. In A. Ethem (Ed.), Natural Language
Engineering (Vol. 19, Issue 2). https://doi.org/10.1017/s1351324912000290.
Fadlilah, U., Mahamad, A. K., & Handaga, B. 2021. The Development of Android for Indonesian
Sign Language Using Tensorflow Lite and CNN: An Initial Study. Journal of Physics:
Conference Series, 1858 (1). https://doi.org/10.1088/1742-6596/1858/1/012085.
Hinton, M. 2020. Corpus Linguistics Methods in the Study of (Meta) Argumentation.
Argumentation, 0123456789. https://doi.org/10.1007/s10503-020-09533-z.
Lane, H., Howard, C., & Hapke, H. M. 2019. Natural Language Processing in Action
(Understanding, Analyzing, and Generating Text with Python). Manning.
Severance, C. 2015. Guido van Rossum: The Early Years of Python. Computing Convertions,
48 (2), 7–9. https://doi.org/10.1109/MC.2015.45.
Thivaharan, S., Srivatsun, G., & Sarathambekai, S. 2020. A Survey on Python Libraries
Used for Social Media Content Scraping. Proceedings - International Conference on
Smart Electronics and Communication, ICOSEC 2020, July 2021, 361–366. https://doi.
org/10.1109/ICOSEC49089.2020.9215357.
BAB 4
PENGANTAR SUPPORT VECTOR
MACHINE (SVM)
4.1. Pendahuluan
Metode Support Vector Machine (SVM) merupakan metode klasifikasi yang lebih umum dari
yang sudah kita kenal di mana metode ini memaksimalkan margin, yaitu ruang yang tidak
memuat data yang berbeda. Hal ini menjadi tidak mudah karena data tidak selalu terpisah
linear, jadi pemisah antara kelompok data yang serupa tidak bisa garis linear saja jika data
pada bidang atau bidang datar data pada ruang 3 dimensi. Jika data pada n-dimensi (yang
berarti memuat banyak faktor) maka bidang datar pemisah disebut hyperplane. Jadi, SVM
akan mengklasifikasi data dengan batas antarkelas yang tidak selalu linear. Pada bagian
berikut ini, ditunjukkan prinsip dasar SVM secara bertahap, dimulai dari data pada bidang
datar agar teori dapat diikuti. Bagian buku ini mengulas SVM yang sebagian besar mengikuti
literatur (Kowalczyk, 2017).
Gambar 4.1 merupakan tinggi dan berat beberapa orang dari laki-laki dan perempuan.
Dengan himpunan data tersebut, selanjutnya, SVM akan membantu menjawab pertanyaan:
jika ada data berat dan tinggi, apakah orang itu laki-laki atau perempuan? Misal, jika seseorang
dengan ukuran tinggi 175 cm dan berat 80 cm apakah dia laki-laki atau perempuan?
Dari Gambar 4.2, terdapat 3 garis (bisa lebih) yang memungkinkan untuk merupakan
pemisah 2 kelompok. Pertanyaan yang muncul: manakah yang terbaik?
Perhatikan titik A(3,4) di R2. Jika kita tarik garis dari O(0,0) pada titik tersebut maka kita
dapat mendefinisikan vektor OA, di mana garis dari O ke-A merupakan vektor tersebut. Jadi
vektor adalah objek yang mempunyai arah dan besaran, sedangkan panjang garis dari O
ke A disebut panjang vektor yang disebut norm vektor atau disebut panjang segment OA.
Ditulis panjang segmen OA dengan ||OA|| di mana kita dapat menghitungnya dengan rumus
Pythagoras, sedangkan arah vektor ditunjukkan dengan vektor satuan.
Coding untuk hal ini secara sederhana sebagai berikut:
import numpy as np x = [3,4]
np.linalg.norm(x) # 5.0
214 Machine Learning dengan Python
T
u u
e 1 , 2 .
u , u ,
Bagaimana arah vektor didefinisikan? Kita ketahui bahwa vektor pada 2 dimensi tersebut
membentuk 2 sudut, yaitu sudut terhadap sumbu horizontal dan sudut terhadap sumbu vertikal.
Oleh karena itu, vektor arah ditentukan oleh arah vektor u = [u1,u2]T terhadap sumbu x dan
sumbu y yang didefinisikan sebagai
u1 u2
cos( ) : cos( )
u u
x1 y1 x2 y 2
cos
x y x y
x1 y1 x2 y 2 x. y
cos
x y x y
cos x y x1 y1 x2 y 2
x y cos x. y
Selanjutnya, pahami tentang penjumlahan dan pengurangan antara 2 vektor secara geometri.
Anggaplah 2 hal terebut telah diketahui, kita tinggal mempelajari proyeksi ortogonal vektor.
216 Machine Learning dengan Python
Gambar 4.7 Sudut yang dibentuk antara 2 vektor dan vektor yang diproyeksikan
Anggaplah vektor x diproyeksikan ortogonal ke vektor y (pada Gambar 4.7) maka diperoleh
vektor proyeksi searah y dan sebutlah z. Dari Gambar 4.6 diperoleh hubungan
z
cos
x
Yang berarti pula
z x cos
x. y
cos dan karena
x y
z x cos
Diperoleh
x. y x. y
z x
x y y
Padahal
y
u sehingga z u. x
y
z
u sehingga z u z
z
Dengan mengetahui hal itu kita dapat menghitung jarak vektor x dan z, yaitu dibentuk dari
panjang vektor x -z. Jadi diperoleh:
Dengan coding Python kita dapat mencari arah vektor sebagai berikut:
u_1 = np.array([3,4])
u_2 = np.array([30,40])
print(arah(u_1)) # [0.6 , 0.8]
print(arah(u_2)) # [0.6 , 0.8]
def dot_product(x,y):
hasil = 0 for i in range(len(x)):
hasil = hasil + x[i]*y[i] return hasil
x = [3,5]
y = [8,2]
print(dot_product(x,y)) # 34
Kita tahu bahwa y=ax +b dapat ditulis y-ax -b = 0. Atau dapat ditulis:
y*1+(−a)*x+(−b)*1=0.
Pengantar Support Vector Machine (SVM) 219
b 1
Persamaan tersebut dapat ditulis dalam notasi vektor. Sebutlah 2 vektor w a dan x x
1 y
wT x bx 1 a x x b x1 0
wT x y ax b
Yang menjadi masalah, mengapa menggunakan notasi tersebut? Karena kita akan tahu
bahwa vektor w adalah vektor yang selalu merupakan vektor normal ke hyperplane di mana
di sini kita selalu mendefinisikan w0 =0. Pada Gambar 4.10, kita mempunyai hyperplane yang
memisahkan 2 grup data di mana persamaannya adalah:
x2=2x1
wT x 0
Contoh 4.2
2 x1
Di mana w= ,x=
1 x2
Catat bahwa vektor w ditunjukkan pada Gambar 4.10 tersebut di mana w bukan data. Kita akan
menghitung jarak titik A(3,4) dan hyperplane. Jarak dari A dan proyeksinya pada hyperplane:
Kita tahu bahwa kita dapat menyusun vektor dari A ke titik O. Kita dapat memproyeksikan A
normal ke vektor w sebagaimana pada Gambar 4.12.
Gambar 4.12 Ilustrasi pemisahan data dengan vektor yang diproyeksikan serta hyperplane yang
diperoleh
Pengantar Support Vector Machine (SVM) 221
Gambar 4.13 Ilustrasi pemisahan data dengan vektor yang diproyeksikan serta hyperplane yang
diperoleh dan vektor hasil proyeksi
Tujuan kita adalah menghitung jarak dari titik A ke hyperplane. Jarak itu adalah panjang vektor
p, yaitu ||p||.
Kita tahu bahwa w= [2,1]T adalah vektor normal ke hyperplane dan a=[3,4] T adalah vektor dari
O ke titik A.
Sebutlah vektor u adalah vektor arah w, dan p adalah proyek a pada w sehingga
T
2 1
w 4 1 5 dan vektor satuannya adalah u , .
5 5
T
2 1 2 1
p u.a u =( 3x 4x ) ,
5 5 5 5
T T
10 2 1 20 10
p u.a u = , ,
5 5 5 5 5
T
p 4,2 dan p 42 22 2 5 .
222 Machine Learning dengan Python
Gambar 4.16 Data terpisah linear (kiri) dan terpisah tidak linear (kanan)
Jadi kita mengasumsikan bahwa data D terpisah secara linear. Kita ingin mengetahui
bagaimana 2 hyperplane tanpa ada titik di antaranya, tetapi kita tidak dapat memvisualisasikan.
Kita tahu bahwa persamaan hyperplane adalah wTx = 0.
Tetapi Wikipedia menuliskan berbeda, yaitu sebarang hyperplane dapat ditulis w.x +b =0.
Kita mengetahui bahwa penulisan dengan dot product digunakan w.x sebagai wTx.
Pertanyaannya bagaimana notasi b muncul?
Dalam tulisan ini, w dan x dalam 3 dimensi, sedangkan dalam Wikipedia menuliskannya dalam
2 dimensi.
Diberikan vektor 3 dimensi, yaitu w=[b,-a,1]T dan x=[1,x,y]T
w. x = b x (1) + (-a) x x +1 x y
w.x = y- ax +b (4.1)
w.x + b = α
dan
w.x + b = -α
Sehingga Ho mempunyai jarak yang sama dengan H1 dan H2. Akan tetapi, variabel α tidak
perlu sehingga kita bisa memilih α =1 untuk menyederhanakan masalah w.x + b = 1 dan w.x
+ b = -1.
Akan ditunjukkan bahwa tidak ada titik di antara hyperplane tersebut. Untuk setiap vektor xi
berlaku
w.x + b ≥ 1 untuk xi berada pada kelas 1 (4.4)
atau
Pada Gambar 4.17, semua titik bertanda bintang berada pada kelas 1 dan yang bertanda
bulat berada pada kelas -1. Yang perlu dibuktikan tidak melanggar kendala w.x + b ≥ 1.
Ketika xi =A, kita dapat melihat titik pada bidang hyperplane w.xi + b =1 dan kendala dipenuhi.
Demikian pula pada B, ketika xi =C, kita dapat melihat bahwa titik di atas pada bidang dengan
kondisi kendala w.x + b > 1 dan kendala dipenuhi. Demikian pula titik D, E, F, dan G. Dengan
analogi yang sama, kita dapat membawa kendala ke-2 terkait dengan kelas -1.
Pada Gambar 4.18 kita melihat sepasang hyperplane yang berbeda lagi.
Kita akan mempelajari bidang hyperplane di mana kondisi tidak dipenuhi menurut Gambar
4.19.
yi (w.x + b) ≥ yi (-1) untuk xi berada pada kelas -1. Pada persamaan (4.5)
Pada persamaan (4), kedua ruas dikalikan dengan yi (yang selalu bernilai 1 pada kasus ini)
sehingga diperoleh persamaan yang sama
Jadi persamaan (4.8) menunjukkan tidak ada efek pada kedua kendala di mana tidak ada titik
di antara hyperplane.
228 Machine Learning dengan Python
Kita mungkin berkeinginan jika kita menambahkan m pada xo, kita akan mendapatkan
titik yang lain, dan titik ini akan berada pada hyperplane yang lain. Tetapi hal ini tidak mungkin
terjadi karena m adalah skalar dan xo adalah vektor di mana menambahkan vektor dan skalar
tidak mungkin bermakna. Tetapi penambahan 2 vektor dimungkinkan sehingga jika kita
mentransformasi m menjadi suatu vektor akan terjadi penambahan. Kita dapat menemukan
himpunan semua titik-titik yang berjarak m dari xo.
Pengantar Support Vector Machine (SVM) 229
Gambar 4.21 Ilustrasi margin sepanjang m pada hyperplane dengan jarak yang dimungkinkan
Jadi semua titik akan berjarak sama dengan m adalah titik-titik pada lingkaran dengan
pusat xo sebagaimana ditunjukkan pada Gambar 4.21. Karena kita tidak dapat menambahkan
skalar dan vektor, tetapi kita dapat mengalikan skalar dengan vektor untuk mendapatkan
vektor lain. Jadi kita menghendaki suatu vektor ini:
1. Mempunyai besar m.
2. Tegak lurus pada hyperplane H1.
3. Untungnya, kita mengetahui bahwa vektor yang tegak lurus H1 adalah w (karena H1: w.x
+ b = 1.
w
Marilah kita definisikan u merupakan vektor satuan sehingga ||u|| =1 dan mempunyai
w
arah yang sama dengan w sehingga juga tegak lurus dengan hyperplane yang ditunjukkan
pada Gambar 4.22.
Gambar 4.23 Ilustrasi margin sepanjang m pada hyperplane vektor u yang tegak lurus pada hyperplane
Gambar 4.24 Ilustrasi vektor k sepanjang m yang searah u pada hyperplane yang tegak lurus
pada hyperplane
Jadi
w
k=mu m (9)
w
Kita berhasil mentransformasi skalar m menjadi vektor k yang dapat digunakan sebagai
vektor yang dapat ditambahkan kepada vektor xo. Jika kita mulai dari titik xo dan menambahkan
k, diperoleh vektor yang lain, yaitu zo = xo. + k pada hyperplane H1 sebagaimana ditunjukkan
pada Gambar 4.25.
232 Machine Learning dengan Python
w. zo +b =1 (4.10)
w. (xo. + k) +b =1 (4.11)
w
Juga diketahui bahwa k = m u m sehingga
w
w
w. (xo. + m ) +b =1
w
Diperoleh
w.w
w. xo + m +b = 1
w
Pengantar Support Vector Machine (SVM) 233
Sehingga
w. xo + m ||w|| +b = 1
m = 2/||w||
dengan kendala
Jadi dengan menyelesaikan masalah optimasi tersebut kita dapat menemukan pasangan (w,b)
di mana ||w|| adalah kemungkinan terkecil yang memenuhi kendala dan berarti kita sudah
memperoleh hyperplane yang optimal.
Dilanjutkan dengan pustaka e-book SVM (Kowalczyk, 2017, hal 54-57).
234 Machine Learning dengan Python
minimalkan 1 2
w
w,b 2
dengan kendala
Faktor ½ ditambahkan pada masalah optimasi karena ketika kita akan menyelesaikan optimasi
kuadratik dengan menguadratkan norm maka kita memperoleh keuntungan tanpa menghitung
akar di mana hampir pada semua buku optimasi menggunakan cara ini, sedangkan masalah
yang semula lebih sulit untuk diselesaikan.
Kembali pada masalah utama bahwa kita mempunyai fungsi tujuan yang diminimalkan, yaitu
1 2
f(w) = w
2
dengan kendala
n
1
2
L(w, x,b,α) = w – i yi w. xi b 1
2 i 1
masalah dual adalah sama dengan minimum dari masalah primal. Selesaikan masalah dual ini
seperti menyelesaikan masalah primal.
Kita panggil fungsi Lagrange:
n
1
2
L(w, x,b,α) = w – i yi w. xi b 1 .
2 i 1
n
1
=
2
w.w –
i 1
i yi w. xi b 1 .
Jadi pada kasus ini, kita akan menyelesaikan masalah optimasi fungsi konveks (dijamin
adanya peminimum) dan kondisi Slater dipenuhi di mana kondisi Slater menyatakan bahwa
ada masalah dualitas pada kasus ini. Masalah dualitas di sini adalah maksimum dari masalah
dual sama dengan minimum dari masalah primal. Jadi menyelesaikan masalah dual sama
artinya menyelesaikan masalah primal di mana masalah dual lebih mudah.
Ingat fungsi Lagrange yang akan diselesaikan adalah:
n
1
2
L(w, x,b,α) = w – i y i w. xi b 1
2 i 1
n
1
=
2
w.w –
i 1
i y i w. xi b 1 ] .
min maks
L w , b,
w, b
Di mana:
α i ≥ 0, i=1,...,n
(4.12)
236 Machine Learning dengan Python
1
n n
W á, b
2 i y i xi
y j j xj
i 1 j 1
n n
i yi
j y j x j . xi b 1
i 1
j 1
n n
1
2 y
i 1 j 1
i j i y j xi . x j
n n n
i yi
j y j x j . xi b
i
i 1 j 1 i 1
n n n n n n
1
2
i 1 j 1
i j y i y j xi . x j i 1 j 1
i j y i y j xi . x j b
i 1
i yi i 1
i
n n n n
1
i 1
i
2
i 1 j 1
i j y i y j xi . x j b y
i 1
i i
Kita berhasil menyingkirkan w, tetapi b masih ada pada suku terakhir sehingga:
n n n n
1
W(α,b) =
i 1
i
2
i 1 j 1
i j y i y j xi . x j b yj 1
i i
n
L
Kita tahu bahwa
b
0 yang berarti bahwa y
j 1
i i 0 . Jadi suku terakhir sama dengan 0
dengan kendala
n
αi ≥ 0, i =1,...,n dan y
j 1
i i 0. (P.2.b)
Pada dasarnya, masalah optimasi dual Wolfe tersebut dibatasi oleh gradien sama dengan 0.
Secara teori, kita menambahkan kendala
f
w L 0 dan 0
b
Akan tetapi, kita hanya akan menambahkannya nanti, sedangkan
n
y
j 1
i i 0
karena kita menghendaki untuk tidak memunculkan b pada fungsi. Akan tetapi, kita dapat
n
menyelesaikan masalah tersebut tanpa kendala w y x . Keuntungan utama masalah
i 1
i i i
dual Wolfe adalah masalah Lagrange yang muncul dengan fungsi tujuan W hanya tergantung
pengali Lagrange. Hal ini sangat berguna dalam pembuatan program Python, serta dalam
penyusunan kernel nantinya. Apa yang dimaksud kernel di sini? Kernel adalah fungsi yang
diasumsikan sebagai bentuk pemisah antarkelas yang dapat berupa linear dan dapat berupa
tak linear.
Pelajari berikut ini.
Data yang sedang kita pelajari selama ini masih secara linear terpisah sehingga kita
menggunakan hyperplane. Bagaimana jika data terpisah secara tidak linear seperti pada
gambar berikut.
238 Machine Learning dengan Python
Untuk itu, program perlu disusun untuk dapat digunakan bagi data terpisah secara linear dan
tak linear. Adapun otomatisasi tersebut dilakukan dengan memberikan kernel di mana kernel
adalah fungsi yang dibangun sebagai pemisah data secara linear atau tak linear. Bagaimana
SVM Kernel kerjakan? Bagaimana klasifikasi dilakukan? Kernel SVM memproyeksikan
pemisah data tak linear dengan dimensi rendah menjadi ke pemisah data linear dimensi yang
lebih tinggi. Kernel SVM melakukan klasifikasi dengan cara data dalam klasifikasi yang berbeda
dialokasikan pada dimensi yang berbeda. Untuk memahami bagaimana Python disusun maka
kita perlu mengetahui terlebih dahulu bagaimana SVM dibuat.
4.4.1. Hitung w
n
Hitung w sederhana saja karena w = w y
i 1
i i xi dari persamaan (4.13). Setelah w diperoleh,
kita dapat menggunakan salah satu kendala dalam masalah primal untuk menghitung b:
yi (w.xi + b) -1≥ 1, i=1,...,n
Titik-titik terdekat pada hyperplane akan mempunyai fungsi margin 1 (di mana 1 dipilih ketika
kita putuskan bagaimana menskala w) sehingga:
yi (w.xi + b) =1.
Untuk mendapatkan b, kita kalikan kedua ruas dengan yi dan karena yi =1 maka diperoleh
w.xi + b = yi
b= yi - w.xi.
Dari teori machine learning yang lain, pemilihan vektor xi tidak dilakukan random, tetapi dengan
mencari rata-ratanya, yaitu
S
1
b
S yi w.xi
i 1
Di mana S adalah banyaknya vektor support. Kemudian berkembang pula formula lain dalam
penyusunan b yang tidak dibahas dalam tulisan ini.
Simbol menyatakan pertidaksamaan per komponen vektor. Hal ini berarti setiap baris dari
matriks G λ menyatakan bahwa pertidaksamaan dipenuhi.
240 Machine Learning dengan Python
Pada kasus optimasi dual Wolfe, yang ingin diminimalkan adalah α. Untuk itu, kita perlu
mengubah masalah dual Wolfe (P.2.a)-(P.2.b) dengan mentransformasi menjadi masalah
pemaksimum, yaitu:
n n n
maksimumkan 1
i 1
i
2
i 1 j 1
i j y i y j xi . x j
dengan kendala
n
αi ≥ 0 , i =1,...,n dan y
j 1
i i 0.
Kita perkenalkan notasi vektor α=[ α1 ,..., αn ]T dan y = [y1,...,yn]T dan matriks Gram K untuk
semua perkalian dot yang mungkin untuk vektor xi :
x1 . x1 x1 . x2 x1 . xn
x2 . x1 x2 . x2 x2 . xn
K(x1, ..., xn) =
xn . x1 xn . x2 xn . xn
Selanjutnya, kita dapat menyelesaikan masalah optimasi SVM dengan solver QP (Quadratic
Programming) dalam paket program Python CVXOPT.
Notasi di atas kemudian dapat digunakan untuk menuliskan masalah dual Wolfe, di mana yyT
yang menyatakan perkalian outer y b, yaitu:
minimalkan 1
2
T yyT K
dengan kendala
0
y. 0
Ringkasan:
Peminimalan norm w adalah masalah optimasi konveks yang dapat diselesaikan dengan
metode pengali Lagrange. Dengan menggunakan teori dualitas, kita dapat mentransformasi
masalah Lagrange menjadi masalah dual Wolfe. Kemudian disusun paket dalam Python yang
menggunakan masalah pemrograman kuadratik.
Pengantar Support Vector Machine (SVM) 241
Untuk itu, SVM yang semula di atas perlu dimodifikasi dengan cara menambahkan variabel
slack (sebut zeta). Jadi kendala yang semula
yi (w.xi + b) -1≥ 1,
menjadi
yi (w.xi + b) -1≥ 1- i
Jadi, dapat terjadi kendala semula tidak terpenuhi, tetapi kita dapat menggunakan kendala
kedua. Ada banyak nilai i sehingga persamaan nfungsi tujuan perlu diubah dan melakukan
metode regularisasi dengan menambahkan total
i sehingga fungsi tujuan, yaitu
i 1
n
minimalkan 1
2
w + i
w, b, 2 i 1
242 Machine Learning dengan Python
dengan kendala
Akan tetapi, dapat terpikir bahwa meminimalkan dapat dikerjakan dengan menggunakan nilai
negatif i . Untuk itu, perlu ditambahkan kendala i ≥ 0 untuk mengatasi hal ini. Akan tetapi,
terkadang kita membutuhkan SVM yang mula-mula sehingga perlu ditambahkan parameter C
yang akan menentukan seberapa penting parameter (lebih besar atau lebih kecil).
Sehingga kita dapat menyusun formulas soft margin
n
minimalkan 1
2
w +C i
w, b, 2 i 1
dengan kendala
yi (w.xi + b) -1 ≥ 1- i , i=1,...,n
i ≥ 0, i=1,...,n
Dengan menggunakan metode yang sudah dijelaskan di atas maka kita perlu memaksimalkan
masalah dual Wolfe yang sama di mana dengan sedikit kendala yang berbeda, yaitu:
n n n
maksimumkan 1
i 1
i
2
i 1 j 1
i j y i y j xi . x j
dengan kendala
n
0 αi C, i =1,...,n dan y
j 1
i i 0.
y
i 1
i i 0
Jadi kendala semula αi ≥ 0 berubah menjadi 0 αi C yang disebut kendala kotak (box
constraint).
Pengantar Support Vector Machine (SVM) 243
dengan kendala
1
0 i
n
n
y
j 1
i i 0.
j 1
i untuk i=1,...,n.
Cara yang mungkin dilakukan adalah mentransformasi data vektor 2 dimensi menjadi vektor
3 dimensi.
Contoh 4.3
Misalkan dilakukan pemetaan polinomial : 2 3 yang didefinisikan oleh
x1, x2 x12 , 2 x1 x2 , x22
Diperoleh bahwa data semula pada bidang menjadi ruang 3 dimensi.
Gambar 4.29 Data masih tidak terpisah secara linear pada ruang 3 dimensi
Untuk itu, perlu diketahui transformasi apa yang dapat digunakan. Beberapa petunjuk sebagai
berikut:
1. Transformasikan setiap vektor 2 dimensi dalam suatu vektor 3 dimensi menggunakan
metode transformasi (pada Code sudah ada).
2. Lakukan uji SVM pada data 3 dimensi.
3. Untuk setiap contoh baru yang akan diduga, transformasikan dengan menggunakan
metode transformasi sebelum melakukan pendugaan.
246 Machine Learning dengan Python
Ini mewakili batas atas pada fraksi kesalahan pelatihan dan batas bawah dari sebagian
kecil dari vektor dukungan. Nilainya harus dalam interval (0,1). Parameter dan atribut lainnya
sama dengan SVC.
Pengantar Support Vector Machine (SVM) 247
4.6. Kernel
Kita perlu resep cepat untuk digunakan pada kumpulan data yang tidak dapat dipisahkan. Salah
satu kekurangannya adalah kita harus mengubah setiap contoh. Jika kita memiliki jutaan atau
miliaran contoh dan metode transformasi, itu merupakan hal rumit yang bisa menghabiskan
banyak waktu. Ini saatnya kernel datang untuk menyelamatkan. Kita ingat pengali Laggrange
KKT dalam fungsi Wolfe Dual Lagrangian, kita tidak perlu nilai dari data training x; yang kita
perlukan adalah perkalian dot product
n n n
1
W
i 1
i
2
i 1 j 1
i j y i y j xi . x j .
Contoh 4.4
Kita akan menggunakan pemetaan polinomial : 2 3 yang didefinisikan oleh:
x1, x2 x12 , 2 x1 x2 , x22
Kita tahu bahwa data semula pada bidang menjadi ruang 3 dimensi.
Berikut kode yang terbalik.
import numpy as np
def transform(x):
return [x[0]**2, np.sqrt(2)*x[0]*x[1], x[1]**2]
x1 = [3,6]
x2 = [10,10]
x1_3d = transform(x1)
x2_3d = transform(x2)
print(np.dot(x1_3d,x2_3d))
“””Apakah ada cara tanpa menghitung hal ini, itulah
kernel dibuat
“””
def polynomial_kernel(a, b):
248 Machine Learning dengan Python
x1 = [3,6]
x2 = [10,10] # disini tanpa transport data
print(polynomial_kernel(x1, x2)) # 8100
Fungsi kernel menghitung dot product mereka seolah-olah mereka telah diubah menjadi
vektor pada ruang lain, itu dilakukan tanpa melakukan transformasi, dan tanpa menghitung
dot product. Singkatnya kernel adalah fungsi yang mengembalikan hasil dot product yang
dilakukan di ruang lain. Lebih formal, kita dapat menulis:
Definisi:
Diberikan suatu fungsi pemetaan, yaitu: : X V , kita panggil fungsi K : X V yang
didefinisikan dengan K(x,y) = x , y V .
Nah, dari sini kita akan mendapatkan ide trik Kernel, misalkan Kernel yang kita gunakan adalah
dot product maka kita dapat menulis soft-margin dual problem sebagai:
n n n
maksimumkan 1
i 1
i
2
i 1 j 1
i j y i y j K xi . x j
dengan kendala
y
i 1
i i 0.
Perubahan ini terlihat sangat sederhana, tetapi perlu diingat bahwa dibutuhkan kerja keras
untuk menurunkan formulasi ganda Wolf dari masalah pengoptimalan awal. Kita sekarang
memiliki kekuatan mengubah fungsi kernel untuk mengklasifikasikan data yang tidak dapat
dipisahkan. Tentu saja, kita juga perlu mengubah fungsi hipotesis untuk menggunakan fungsi
kernel:
Pengantar Support Vector Machine (SVM) 249
Ingatlah bahwa dalam rumus ini adalah himpunan vektor pendukung (support vector).
Melihat rumus ini, kita lebih memahami mengapa SVM juga disebut sparse kernel machine. Itu
karena mereka hanya perlu menghitung fungsi kernel pada vektor pendukung dan tidak pada
semua vektor, seperti metode kernel lainnya.
x1 = [3,6]
x2 = [10,10] # kita tidak transform data.
print(kernelpolinomial(x1, x2, derajat=2)) #
250 Machine Learning dengan Python
Kernel polinomial dengan derajat 1 dan tanpa konstanta hanyalah kernel linier. Saat Anda
meningkatkan derajat kernel polinomial, batas keputusan akan menjadi lebih kompleks dan
cenderung dipengaruhi oleh contoh data individual. Menggunakan polinomial derajat tinggi
berbahaya karena Anda seringkali dapat mencapai hasil kinerja yang lebih baik pada set
pengujian anda, tetapi mengarah ke apa yang disebut overfitting: model terlalu dekat dengan
data dan tidak menggeneralisasi dengan baik.
Pengantar Support Vector Machine (SVM) 251
DAFTAR PUSTAKA
Kowalczyk, A. 2017. Support Vector Machines Succintctly. www.syncfusion.com.
Varoquaux, G., Buitinck, L., Louppe, G., Grisel, O., Pedregosa, F., & Mueller, A. 2015. Scikit-
learn. GetMobile: Mobile Computing and Communications, 19 (1), 29–33. https://doi.
org/10.1145/2786984.2786995.
BAB 5
POHON KEPUTUSAN
(DECISION TREE/DT)
Pada bagian ini, akan dibahas tentang pohon keputusan yang berguna untuk klasifikasi, tetapi
juga regresi. Untuk menyimpulkan hasil klasifikasi digunakan CM (Confusion Matrix). Untuk itu,
perlu dipahami terlebih dahulu CM.
1. Buku tentang pengantar yang komprehensif tentang data science, termasuk penggunaan
confusion matrix dalam evaluasi performa model (Kelleher & Brendan, 2018).
2. Data Science for Business: What You Need to know about Data Mining and Data-Analytic
Thinking. Buku ini memberikan gambaran yang lengkap tentang data science dari
perspektif bisnis dan menjelaskan bagaimana confusion matrix dapat digunakan dalam
evaluasi model (Provost & Fawcett, 2013).
3. Evaluation: From Precision, Recall and F-measure to ROC, Informedness, Markedness
and Correlation merupakan judul artikel tentang berbagai metrik evaluasi model, termasuk
akurasi, presisi, recall, F1-score, dan area under the ROC curve yang dapat dihitung
menggunakan confusion matrix (Beschi Raja et al., 2019).
4. Artikel yang berjudul A Review on Ensembles for the Class Imbalance Problem: Bagging,
boosting, and Hybrid-Based Approaches membahas tentang bagaimana confusion matrix
dapat digunakan dalam penanganan masalah ketidakseimbangan kelas dalam masalah
klasifikasi (Zhang et al., 2021).
5. Precision and Recall. In Encyclopaedia of Machine Learning sebagai bagian dari
ensiklopedia menjelaskan konsep precision dan recall dalam konteks evaluasi model
menggunakan confusion matrix (Carterette, 2011).
Confusion matrix pada pohon keputusan adalah tabel yang digunakan untuk mengevaluasi
performa model pohon keputusan. Confusion matrix terdiri dari empat sel yang mewakili empat
kemungkinan hasil klasifikasi yang mungkin terjadi, yaitu True Positive (TP), False Positive
(FP), True Negative (TN), dan False Negative (FN). True Positive (TP) adalah ketika model
memprediksi suatu kasus sebagai positif dan kasus tersebut memang benar-benar positif.
False Positive (FP) adalah ketika model memprediksi suatu kasus sebagai positif, tetapi kasus
tersebut sebenarnya negatif. True Negative (TN) adalah ketika model memprediksi suatu kasus
sebagai negatif dan kasus tersebut memang benar-benar negatif. False Negative (FN) adalah
ketika model memprediksi suatu kasus sebagai negatif, tetapi kasus tersebut sebenarnya
positif. Dalam pohon keputusan, CM digunakan untuk mengukur performa model dalam
memprediksi kelas target. Misalnya, dalam masalah klasifikasi biner, kita dapat menggunakan
CM untuk menghitung akurasi, presisi, recall, F1-score, dan lain sebagainya. Confusion matrix
juga dapat digunakan untuk memvisualisasikan performa model dalam bentuk heatmap, yang
memudahkan pemahaman dan interpretasi hasil evaluasi model.
Pohon Keputusan (Decision Tree/DT) 255
Laju salah positif: jika aktual TIDAK, seberapa sering diduga YA:
BN/aktual TIDAK=
Sama dengan 1-SLaju salah positif atau spesifisitas.
Presisi: jika diduga YA, seberapa sering dijawab benar:
BP/dugaan YA = …
Prevalensi: seberapa sering kondisi YA secara aktual terjadi pada sampel:
Aktual YA/total = …
Laju nol error: seberapa sering kita salah jika selalu menduga kelas yang besar:
Akan tetapi dalam aplikasi, sering dijumpai data dengan variabel banyak sehingga CM tidak
mungkin hanya 2 x 2. Penjelasan perlu lebih detail dan belum dijelaskan di sini. Secara grafis,
terdapat pula cara mengukur baiknya klasifikasi dengan kurva yang disebut kurva ROC. Kurva
ROC adalah grafik yang biasa digunakan untuk meringkas penampilan suatu klasifikasi pada
semua percabangan yang dibentuk dengan menggambar laju kebenaran positif pada sumbu
y, dan laju kesalahan positif pada sumbu x. Pada model aplikasi dugaan dengan statistika
Bayesian, sensitivitas dan spesifikasi adalah probabilitas bersyarat, prevalensi (fakta-
fakta yang sering terjadi sebelumnya 0), dan nilai-nilai dugaan positif atau negatif sebagai
probabilitas posterior.
Akurasi klasifikasi adalah rasio antara dugaan benar terhadap total dugaan yang dibuat, yaitu
akurasi klasifikasi = dugaan benar/total dugaan, sedangkan persentasenya berarti mengalikan
besar rasio tersebut dengan 100 agar 100 persen. Ada pula yang membahas akurasi dengan
laju ketidaktepatan klasifikasi (misclassification) atau laju error, yaitu laju error = (1-dugaan
benar/total dugaan))x 100.
Contoh 5.1a
Misalkan CM berikut ini.
Dugaan Dugaan
N=165
TIDAK YA
Aktual
50 10
TIDAK
Aktual
5 100
YA
Pohon Keputusan (Decision Tree/DT) 257
Contoh 5.1b
Misalkan CM berikut ini.
N=165 Dugaan TIDAK Dugaan YA
Aktual TIDAK BN = 50 SP=10 60
Aktual YA SN =5 BP=100 105
55 110
BP/dugaan YA = 100/110=0.91
Prevalensi: seberapa sering kondisi YA secara aktual terjadi pada sampel:
Aktual YA/total =105/165
Laju nol error: seberapa sering kita salah jika selalu menduga kelas yang besar: 60/165.
Dari Gambar 5.2, sebuah bola diambil secara acak dari setiap mangkuk. Jadi berapa
banyak informasi yang Anda butuhkan untuk mengetahui warna bola secara akurat?
Mangkuk kiri membutuhkan lebih sedikit informasi karena semua bola berwarna cokelat,
mangkuk tengah membutuhkan lebih banyak informasi daripada mangkuk kiri untuk
mengatakannya secara akurat, dan mangkuk kanan membutuhkan informasi maksimal
karena kedua jumlah bola berwarna sama. Ada beberapa ukuran impurity yang ada, tetapi
dalam cerita ini kita hanya akan berbicara tentang dua ukuran tersebut, yaitu Entropi dan
Indeks Gini/Impurity Gini.
a. Entropi
Entropi adalah jumlah informasi yang diperlukan untuk menggambarkan secara
akurat beberapa sampel. Jadi jika sampelnya homogen, berarti semua elemennya
mirip maka entropinya adalah 0, sebaliknya jika sampelnya terbagi rata maka
entropinya maksimal 1.
n
Entropi D p * log p
i 1
i i
Algoritma pohon keputusan adalah pohon di mana simpul mewakili fitur (atribut), cabang
mewakili keputusan (aturan), dan simpul daun mewakili hasil (diskrit dan kontinu). Jadi
sebenarnya bagaimana algoritma pohon keputusan dibangun? Ada berbagai macam
algoritma yang digunakan untuk membangkitkan pohon keputusan dari data, di antaranya
adalah klasifikasi dan pohon regresi, CART, ID 3, CHAID (Chi-squared Automatic
Interaction Detector), dan ID 4.5. Meskipun metodenya berbeda untuk setiap algoritma
pembangunan pohon keputusan yang berbeda, tetapi semuanya bekerja berdasarkan
Pohon Keputusan (Decision Tree/DT) 261
Kata Entropi dipinjam dari termodinamika yang merupakan ukuran variabilitas atau
kekacauan atau keacakan. Shannon memperluas konsep entropi termodinamika pada tahun
1948. Dengan asumsi Anda memutar koin yang adil dan ingin mengetahui sistem entropi.
Sesuai rumus yang diberikan oleh Shann, entropi akan sama dengan -[0,5 ln(0,5) + 0,5 ln(0,5)]
262 Machine Learning dengan Python
= -0.69 yang merupakan entropi maksimum yang dapat terjadi dalam sistem. Dengan kata
lain, akan ada keacakan maksimum dalam kumpulan data kita, jika hasil yang mungkin memiliki
probabilitas kejadian yang sama. Kita dapat dengan jelas melihat bahwa entropi maksimum
ketika probabilitas salah satu kelas sama. Sekarang, kita dapat memahami bahwa ketika
algoritma keputusan mencoba membagi data, ia memilih variabel yang akan memberi kita
pengurangan maksimum dalam sistem entropi.
Sebagai contoh tingkat keberhasilan film. Entropi awal disebut entropi induk dalam sistem
adalah:
Entropi Induk = -(0,57*ln(0,57) + 0,43*ln(0,43)) = 0.68 (entropi awal sering disebut entropy-
parent).
Contoh 5.3
“””DecisionTree1.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1v-
2TINj345wUJ40r5arNg7G0CcCRy5PV
“””
import pandas as pd
import pydotplus #pip install pydotplus
from sklearn.tree import export_graphviz
from sklearn.tree import DecisionTreeClassifier
import numpy as np
data = pd.DataFrame({‘P_Film’: [17,64,18,20,38,49,55,2
5,29,31,33],
‘Gender’: [1,0,1,0,1,0,0,1,1,0,1]})
data =data.sort_values(‘P_Film’)
data
def tree_graph_to_png(tree, feature_names, png_file_to_
save):
tree_str = export_graphviz(tree, feature_
names=feature_names,
filled=True, out_
file=None)
graph = pydotplus.graph_from_dot_data(tree_str)
graph.write_png(png_file_to_save)
X = data[‘P_Film’].values.reshape(-1, 1)
#Y : vektor variabel target
Y = data[‘Gender’].values
#mulai fitting
dt.fit(X, Y)
tree_graph_to_png(dt, feature_names=[‘P_Film’],
png_file_to_save=’dt.png’)
d = np.array([7, 15, 43, 45])
d=d.reshape(-1, 1)
dt.predict(d)
5.3.2. Implementasi DT dengan Scikit Learn Python untuk Cek Keaslian Uang
Kertas
Pada bagian ini, akan ditunjukkan bagaimana menggunakan algoritma DT dengan library Scikit
Learn di mana kasus yang dipelajari diselesaikan dengan klasifikasi dan regresi.
Contoh 5.4 DT untuk Banknote (BN)
Dalam bahasa Indonesia, Banknote (BN) adalah uang kertas yang bernilai dengan satuan
tertentu. Masalah yang dicermati adalah bagaimana mengidentifikasi BN asli atau tidak.
Pada bagian ini, kita akan menduga apakah BN merupakan asli atau tidak asli dengan 4
atribut gambar yang berbeda pada BN tersebut. Atribut yang digunakan adalah variansi dari
transformasi wavelet pada gambar, kurtosis pada gambar, entropi, dan skewness dari gambar
(digunakan pada program dalam bahasa Inggris: Variance, Skewness, Curtosis, Entropy,
Class), sedangkan label adalah class bernilai 0 dan 1. Dari sumber tidak dijelaskan apakah
yang bertanda 0 untuk yang asli atau yang tidak asli.
1. Sumber Data
Pemilik data: Volker Lohweg (University of Applied Sciences, Ostwestfalen-Lippe, volker.
lohweg ‘@’ hs-owl.de).
Penyumbang data: Helene Dörksen (University of Applied Sciences, Ostwestfalen-
Lippe, helene.doerksen ‘@’ hs-owl.de).
Data diterima pada: August, 2012.
Pohon Keputusan (Decision Tree/DT) 265
“-3.5637,-8.3827,12.393,-1.2823,1”
“-2.5419,-0.65804,2.6842,1.1952,1”
Informasi kumpulan data:
Data diambil dari gambar spesimen mirip uang kertas asli dan palsu. Untuk digitalisasi,
digunakan kamera industri yang biasanya digunakan untuk pemeriksaan cetak. Gambar
akhir memiliki 400x400 piksel. Karena lensa objek dan jarak ke objek yang diselidiki,
diperoleh gambar skala abu-abu dengan resolusi sekitar 660 dpi. Alat transformasi
wavelet digunakan untuk mengekstraksi fitur dari gambar.
2. Informasi Data
Data diambil dari ekstraksi gambar yang diambil dari BN. Untuk keperluan digitalisasi,
kamera industri digunakan untuk mencetak inspeksi yang digunakan. Gambar akhir
yang diperoleh 400x400 pixel. Sesuai dengan lensa objek dan jarak pada objek yang
diinvestigasi dalam gambar berwarna abu-abu dengan resolusi 600 dpi. Transformasi
wavelet digunakan untuk mengekstraksi atribut dari gambar berupa:
a. variance of Wavelet Transformed image (continuous).
b. skewness of Wavelet Transformed image (continuous).
c. curtosis of Wavelet Transformed image (continuous).
d. entropy of image (continuous).
e. class (integer).
Akhirnya, kita akan mengimplementasikan Scikit-Learn di mana data dan fungsi-fungsi
(library) perlu diimpor dan membuat analisis dengan membagi data dalam data latih dan
data uji. Setelah itu, melatih algoritma untuk dapat melakukan prediksi dan akhirnya
menggunakan algoritma untuk data.
3. Persiapan Data
Data dipisahkan dengan beberapa tahap:
a. Data dipisahkan atas data atribut/fitur dan data label (target).
X: semua variabel/fitur/atribut yang memuat semua kolom, kecuali kolom Class yang
merupakan kolom label.
Y: variabel yang memuat kolom Class.
Jadi, variabel X adalah himpunan atribut kita, sedangkan y adalah variabel yang
memuat pelabelan.
Pohon Keputusan (Decision Tree/DT) 267
b. Selanjutnya, data dibedakan menjadi data latih dan data uji di mana kemudian kita
melakukan pemilihan model dengan librari train_test_split. Pada coding tersebut,
parameter yang membedakan himpunan data yang diuji akan dipisahkan menjadi
20% data uji dan 80% data latih. Parameter tersebut adalah test_size=0.20.
4. Membuat Pohon dan Melakukan Prediksi
Pada scikit-learn, terdapat library tree yang memuat kelas/metode yang bervariasi
tentang algoritma Decision Tree. Karena kita akan melakukan klasifikasi maka digunakan
kelas DecisionTreeClassifier. Kemudian gunakan fit untuk melatih algoritma pada data
latih. Setelah klasifikasi dicobakan, kita akan melakukan prediksi pada data uji di mana
kita menggunakan fungsi predict pada DecisionTreeClassifier. Diasumsikan penulis
telah melakukan instalasi librari ini. Jika diinstal pada Anaconda prompt dengan: Conda
install DecisionTreeClassifier maka terjadi error yang menjelaskan bahwa
package not found. Berdasarkan informasi stack overflow maka disarankan penulis untuk
melakukan instalasi pada anaconda dengan perintah:
conda config --append channels conda-forge. Kemudian baru dapat dilakukan
instalasi untuk DecisionTreeClassifier dengan menuliskan pada anaconda prompt, yaitu:
conda install DecisionTreeClassifier.
5. Program Terkait
Kasus di atas dinyatakan dalam program Python.
#https://stackabuse.com/decision-trees-in-python-with-
scikit-learn/
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
get_ipython().run_line_magic(‘matplotlib’, ‘inline’)
dataset = pd.read_csv(‘bill_authentication.csv’)
# In[14]:
dataset.shape # artinya terdapat 1372 baris dengan 5
kolom
# In[15]:
dataset.head() # menampilkan atribut dan klas
268 Machine Learning dengan Python
0 1 0 0 1 0 0 0 1 0
0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 0 0
0 1 1 0 0 1 0 0 0 0
0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 0 0
0 0 1 1 0 1 0 1 0 0
1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0]
precision recall f1-score support
0 0.97 0.96 0.97 152
1 0.95 0.97 0.96 123
avg / total 0.96 0.96 0.96 275
Dari CM diperoleh 275 luaran ada 10 (total diagonal = 265) yang misklasifikasi ada 10,
total misdiagonal yang berarti 265/275 *100 (%) = 96.36%.
Data diperoleh dari https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGL
SHD9f_/view. Silakan download dengan nama file petrol_consumption.csv.
Referensi data:
# Helmut Spaeth, Mathematical Algorithms for Linear
Regression,
# Academic Press, 1991, ISBN 0-12-656460-4.
# S Weisberg,Applied Linear Regression, New York,
1980, pages 32-33.
Masalah:
Dalam 1 tahun, konsumsi bahan bakar dihitung pada 48 negara bagian. Variabel yang
relevan adalah pajak bahan bakar, pendapatan per kapita, banyaknya panjang jalan tol
yang dilalui (dalam mil), dan proporsi populasi pengendara yang berlisensi. Data terdiri
dari 48 baris yang meliputi:
# I, indeks,
# A0, 1;
# A1, the petrol tax (pajak per galon untuk
petroleum)
# A2, the per capita income (pendapatan per
kapita)
270 Machine Learning dengan Python
Program:
# Import library yang dibutuhkan
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score
# Load dataset
dataset = pd.read_csv(‘petrol_consumption.csv’)
Luaran Program :
# Import library yang dibutuhkan
Mean Squared Error: 5352.5
R-Squared: 0.08651680024029607
Root Mean Squared Error: 73.16078184382668
Catatan:
Pada kode X = dataset.drop(‘Petrol_Consumption’, axis=1), axis=1 berarti kita menghapus
kolom dari dataset, bukan baris. Lebih spesifiknya, kolom yang dihapus adalah ‘Petrol_
Consumption’. Jadi, X akan berisi dataset yang sama dengan dataset, namun tanpa
kolom ‘Petrol_Consumption’. Secara umum, axis=1 digunakan untuk mengacu pada
dimensi kolom dari sebuah array atau dataframe di Python. Adapun hasil decision tree
secara grafik seperti pada Gambar 5.3.
Pohon Keputusan (Decision Tree/DT) 273
Gambar 5.3 Sketsa decision tree yang diperoleh (hasil kode penulisan tidak cukup jelas)
274 Machine Learning dengan Python
import os
# Merubah directory
class DecisionTree:
def __init__(self, max_depth=None):
self.max_depth = max_depth
# Pisahkan data
left_idxs = X[:, feature] < threshold
right_idxs = ~left_idxs
left_tree = self._grow_tree(X[left_idxs],
y[left_idxs], depth+1)
right_tree = self._grow_tree(X[right_idxs],
y[right_idxs], depth+1)
returnNode(feature=feature,threshold=threshold,left_
tree=left_tree,right_tree=right_tree)
def _best_split(self, X, y):
# Hitung ketidakmurnian Gini (Gini impurity)
untuk setiap fitur dan buatlah titik pemisahan
276 Machine Learning dengan Python
best_feature = None
best_threshold = None
best_gini = 1
class Node:
def __init__(self, feature=None, threshold=None,
label=None, left_tree=None, right_tree=None):
self.feature = feature
self.threshold = threshold
self.label = label
self.left_tree = left_tree
self.right_tree = right_tree
tree = DecisionTree(max_depth=5)
tree.fit(X, y)
# Evaluasi akurasinya
accuracy = accuracy_score(y_test, predictions)
print(“Accuracy:”, accuracy)
#Menampilkan tree
from sklearn.tree import DecisionTreeClassifier, plot_
tree
import matplotlib.pyplot as plt
# Visualize the decision tree
plt.figure(figsize=(10,10))
plot_tree(clf, filled=True)
plt.show()
Pohon Keputusan (Decision Tree/DT) 279
Fungsi ini menghitung koefisien gini impurity dari array y yang digunakan dalam algoritma
pohon keputusan untuk memilih fitur terbaik pemisahan data. Gini impurity mengukur seberapa
campur aduk label dalam sebuah set data. Semakin homogen (tidak campur aduk) suatu set
data maka semakin rendah nilai gini impurity-nya. Pertama, fungsi ini menggunakan fungsi
np.unique() dari pustaka NumPy untuk menghitung jumlah kemunculan setiap nilai unik
dalam array y. Kemudian, fungsi ini menghitung proporsi kemunculan setiap nilai unik dengan
membagi jumlah kemunculannya dengan panjang array y. Selanjutnya, fungsi ini menghitung
gini impurity dari array y dengan menggunakan formula:
gini = 1 - sum(proportions**2)
Di mana proportions adalah array yang berisi proporsi kemunculan setiap nilai unik yang
telah dihitung sebelumnya. Kode ini mengembalikan nilai koefisien gini impurity dari array y.
Semakin rendah nilai gini impurity, semakin homogen (tidak campur aduk) set data tersebut,
dan semakin baik digunakan dalam pemilihan fitur terbaik pada algoritma pohon keputusan.
1. Pelatihan (training) dan prediksi keduanya sangat cepat karena kesederhanaan decision
tree yang mendasarinya. Selain itu, kedua tugas dapat langsung diparalelkan karena
masing-masing pohon merupakan entitas yang sepenuhnya independen.
2. Beberapa pohon memungkinkan untuk klasifikasi probabilistik: suara mayoritas di antara
penaksir memberikan perkiraan probabilitas (diakses di Scikit-Learn dengan metode
predict_proba()).
3. Model nonparametrik sangat fleksibel, dan dengan demikian dapat bekerja dengan baik
pada tugas-tugas yang kurang sesuai dengan estimator lainnya.
Kerugian utama dari random forest adalah bahwa hasilnya tidak mudah ditafsirkan, yaitu
jika kita ingin menarik kesimpulan tentang arti model klasifikasi, random forest mungkin bukan
pilihan terbaik. Kita akan menggunakan Random Forest untuk kasus yang sama di atas.
Program:
#RANDOM FOREST
# Import library
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
# Buat prediksi
y_pred = rf_model.predict(X_test)
# Evaluasi model
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(“Root Mean Squared Error:”, rmse)
Pilihan nomor 42 Adams telah menjadi perlengkapan budaya geek. Budaya geek adalah
sebuah subkultur yang menekankan pada minat dan kesukaan pada topik-topik yang dianggap
khas atau geeky, seperti teknologi, video game, komik, film fiksi ilmiah, dan acara televisi,
serta ilmu pengetahuan dan matematika. Orang-orang yang terlibat dalam budaya geek sering
memiliki minat yang mendalam dan pengetahuan yang luas dalam topik-topik ini, dan mereka
sering terlibat dalam aktivitas, seperti pengumpulan merchandise, cosplay, atau pertemuan
dan konvensi yang berkaitan dengan topik-topik ini. Budaya geek telah menjadi sangat populer
dalam beberapa dekade terakhir, terutama dengan munculnya teknologi dan media baru yang
menarik minat orang untuk terlibat dalam komunitas ini. Orang menemukan humor di dalamnya,
dan beberapa karena menghormati literatur sci-fi klasik menggunakan 42 di berbagai tempat.
Ada banyak teori dari penggemar untuk menjelaskan mengapa nomor 42 dipilih.
Beberapa mengusulkan bahwa itu dipilih karena 42 adalah 101010 dalam kode biner,
yang lain menunjukkan bahwa cahaya dibiaskan melalui permukaan air sebesar 42 derajat
untuk menciptakan pelangi. Adapula yang berkomentar bahwa cahaya membutuhkan 10 ⁴²
detik untuk melintasi diameter proton. Namun yang lain mengatakan bahwa 42 adalah
penghargaan Adams untuk buku paperback yang tak kenal lelah, dan merupakan jumlah baris
rata-rata pada halaman rata-rata dari paperback rata-rata. Teori umum lainnya adalah bahwa
42 mengacu pada jumlah hukum dalam kriket, tema yang berulang dari buku. Namun, Douglas
Adams sendiri membeberkan alasan mengapa ia memilih 42 dalam pesan tersebut. “Itu adalah
lelucon. Itu harus berupa angka, angka biasa yang kecil, dan saya memilih yang itu. Saya
duduk di meja saya, menatap ke taman dan berpikir 42 sudah cukup!”
284 Machine Learning dengan Python
DAFTAR PUSTAKA
Beschi Raja, J., Anitha, R., Sujatha, R., Roopa, V., & Sam Peter, S. 2019. Diabetics Prediction
using Gradient Boosted Classifier. International Journal of Engineering and Advanced
Technology, 9 (1), 3181–3183. https://doi.org/10.35940/ijeat.A9898.109119.
Carterette, B. 2011. Precision and Recall. In Encyclopedia of Machine Learning (pp. 1–2).
Springer Boston. https://doi.org/10.1007/978-1-4899-7993-3_5050-2.
Kelleher, B. J. D., & Brendan, T. 2018. Data Science. The MIT Press. https://mitpress.mit.
edu/9780262535434/data-science/.
Provost & Fawcett. 2013. Data Science for Business : What You Need to Know about Analytic-
Thinking and Decision-Making (Vol. 53, Issue 9).
Zhang, L., Qi, Z., & Meng, F. 2021. A Review on the Construction of Business Intelligence
System Based on Unstructured Image Data. Procedia Computer Science, 199, 392–
398. https://doi.org/10.1016/j.procs.2022.01.048.
https://www.datacamp.com/tutorial/decision-tree-classification-python.
BAB 6
MACHINE LEARNING UNTUK
KASUS COVID-19
Virus Corona atau Severe Acute Respiratory Syndrome Coronavirus 2 (SARS-CoV-2) adalah
virus yang menyerang sistem pernapasan. Infeksi virus ini disebut Covid-19 dan pertama kali
ditemukan di kota Wuhan, Cina, pada akhir Desember 2019. Secara umum, ada 3 gejala
umum yang bisa menandakan seseorang terinfeksi virus Corona, yaitu demam (suhu tubuh
di atas 38 derajat Celsius), batuk, dan sesak napas. Pada bagian ini, akan digunakan data
Covid-19 yang diambil dari berbagai sumber internet, di mana data tersebut merupakan
data yang berisi informasi harian tentang jumlah kasus Covid-19, baik daerah lokal, provinsi,
Indonesia, dan data dari berbagai kota berpengaruh di dunia. Salah satu pembahasan yang
telah dilakukan pada awal wabah Covid-19 adalah penggunaan SVR dalam melakukan regresi
terhadap jumlah kasus Covid-19 (Parhusip, 2020).
Pada buku ini, kita akan menelusuri data kasus Covid-19 kembali. Dari data tersebut,
akan dibuat plot dalam membaca data dan memberikan ilustrasi grafik untuk beberapa kasus
sehingga terdapat informasi yang mungkin diperlukan para pengambil keputusan saat terjadinya
data berlangsung. Program untuk mengolah data dengan Machine Learning ini dibuat tahun
2020 ketika Covid-19 sedang mulai terjadi sehingga data tentunya ter-update sesuai sumber
data. Pada bagian ini, ditunjukkan bagaimana kita dapat melakukan pembacaan data dan
sedikit melakukan analisis dengan Machine Learning. Program Python yang dikerjakan pada
Colab sehingga dapat mempermudah pembaca tanpa menggunakan instalasi Python pada
komputer lokal.
286 Machine Learning dengan Python
Luaran:
Pembahasan: Jadi, data telah terbaca di mana data dari tanggal 30 Maret 2020 hingga 7
November 2020. Terdapat 4 fitur, yaitu Suspek (Rentan), Terkonfirmasi, Sembuh, dan
Meninggal.
Tahap 3. Menampilkan data secara deskriptif
Kita dapat menggunakan perintah:
dataset.describe()
Penampilan data lebih menarik untuk digambar. Kita dapat menggunakan mathplotlib.
288 Machine Learning dengan Python
Gambar 6.1 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Suspek (rentan)’ pada periode 30
Maret-7 November 2020
Machine Learning untuk Kasus Covid-19 289
Pada Gambar 6.1, sumbu tanggal tidak tampil dengan baik sehingga kita perlu menata tampilan
untuk sumbu horizontal. Untuk itu, data Tanggal akan diganti dengan indeks, sebagaimana
perintah berikut ini.
#menjadikan data tanggal menjadi indeks
index_col = [‘Tanggal’]
Luaran ditunjukkan pada Gambar 6.2.
Tahap 5a
Gambar 6.2 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Terkonfirmasi’ pada periode 30
Maret-7 November 2020
Gambar 6.3 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Terkonfirmasi’ pada periode 30
Maret-7 November 2020
Machine Learning untuk Kasus Covid-19 291
Gambar 6.4 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Terkonfirmasi’, ‘Sembuh’, dan
‘Meninggal’ pada periode 30 Maret-7 November 2020
Tahap 7.
dataset.plot(x=’Tanggal’, y=’Meninggal’,color=’green’,
linestyle=’dashed’, linewidth = 1,marker=’o’,
markerfacecolor=’blue’, markersize=4)
292 Machine Learning dengan Python
Gambar 6.5 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Meninggal’ pada periode 30 Maret-7
November 2020
dataset.plot(‘Tanggal’,[‘Terkonfirmasi’,’Sembuh’,
’Meninggal’],figsize=(10,10), rot=30)
Gambar 6.6 Tampilan data kasus Covid-19 di Salatiga untuk fitur ‘Meninggal’ pada periode 30 Maret-7
November 2020
Machine Learning untuk Kasus Covid-19 293
Sejauh ini, kita hanya menggambar data. Kita akan menggunakan data yang lebih kompleks,
yaitu data Covid-19 Indonesia dengan sedikit melakukan analisis berdasarkan visualisasi yang
diperoleh.
int64
11 Location Level 21759 non-null
object
12 City or Regency 0 non-null
float64
13 Province 21117 non-null
object
14 Country 21759 non-null
object
15 Continent 21759 non-null
object
16 Island 21117 non-null
object
17 Time Zone 21117 non-null
object
18 Special Status 3123 non-null
object
19 Total Regencies 21759 non-null
int64
20 Total Cities 21145 non-null
float64
21 Total Districts 21759 non-null
int64
22 Total Urban Villages 21142 non-null
float64
23 Total Rural Villages 21117 non-null
float64
24 Area (km2) 21759 non-null
int64
25 Population 21759 non-null
int64
26 Population Density 21759 non-null
Machine Learning untuk Kasus Covid-19 297
float64
27 Longitude 21759 non-null
float64
28 Latitude 21759 non-null
float64
29 New Cases per Million 21759 non-null
float64
30 Total Cases per Million 21759 non-null
float64
31 New Deaths per Million 21759 non-null
float64
32 Total Deaths per Million 21759 non-null
float64
33 Total Deaths per 100rb 21759 non-null
float64
34 Case Fatality Rate 21759 non-null
float64
35 Case Recovered Rate 21759 non-null
float64
36 Growth Factor of New Cases 20572 non-null
float64
37 Growth Factor of New Deaths 19292 non-null
float64
dtypes: datetime64[ns](1), float64(16), int64(12),
object(9)
memory usage: 6.3+ MB
CodeText
Pembahasan: Dari hasil luaran ini terlihat banyaknya fitur adalah 37.
298 Machine Learning dengan Python
covid_tanggal = pd.to_datetime(covid[“Date”])
Luaran:
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 21759 entries, 0 to 21758
Data columns (total 28 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 21759 non-null
datetime64[ns]
Machine Learning untuk Kasus Covid-19 299
Tahap 5. Memperhatikan lokasi mana saja yang dianalisis karena ada provinsi Indonesia yang
tidak mewakili provinsi mana pun maka data dari Indonesia perlu dihapus
covid[“Location”].unique()
Tahap 6. Kita melakukan grouping data dengan 4 fitur berdasarkan per daerahnya
gruping = covid.groupby([“Location”,”Date”]).
agg({“Total Cases”:’sum’,”Total Deaths”:’sum’,
”Total Recovered”:’sum’,”Total Active Cases”:’sum’})
gruping
Machine Learning untuk Kasus Covid-19 301
Luaran:
Luaran:
iloc[-1])
print(“Aproksima dari kasus terkonfirma-
si per hari:”, np.round(datewise[“Total Cases”].iloc
[-1]/datewise.shape[0]))
print(“Aproksima dari kasus sembuh per hari:”, np.
round(datewise[“Total Recovered”].iloc[-1]/datewise.
shape[0]))
print(“Aproksima dari kasus meninggal per hari:”, np.
round(datewise[“Total Deaths”].iloc[-1]/datewise.
shape[0]))
print(“Aproksima dari kasus terkonfirma-
si per jam:”, np.round(datewise[“Total Cases”].iloc
[-1]/(datewise.shape[0]*24)))
print(“Aproksima dari kasus sembuh per jam:”, np.
round(datewise[“Total Recovered”].iloc[-1]/(datewise.
shape[0]*24)))
print(“Aproksima dari kasus meninggal per jam:”, np.
round(datewise[“Total Deaths”].iloc[-1]/(datewise.
shape[0]*24)))
print(“Kasus terkonfirmasi 24 jam terakh-
ir:”, datewise[“Total Cases”].iloc[-1]-datewise
[“Total Cases”].iloc[-2]) #terjadi penurunan kasus
print(“Kasus sembuh 24 jam terakhir:”, datewise
[“Total Recovered”].iloc[-1]-datewise
[“Total Recovered”].iloc[-2])
print(“Kasus meninggal 24 jam terakhir:”, datewise
[“Total Deaths”].iloc[-1]-datewise[“Total Deaths”].
iloc[-2])
Luaran:
Total lokasi berdasarkan provinsi: 35
Total data terkonfirmasi: 4257243
Machine Learning untuk Kasus Covid-19 305
Gambar 6.8 Kasus aktif untuk Indonesia pada periode Maret-Desember 2021 pada sumbu horizontal
tanggal (ditulis Date) dan banyaknya kasus (sumbu vertikal)
Terlihat pada Gambar 6.8, bahwa kasus aktif memuncak pada sekitar Juli-Agustus 2021
yang kita ketahui bahwa pada periode ini, mobilitas penduduk lebih tinggi daripada pada
masa sebelumnya karena adanya hari raya Ramadhan yang biasanya penduduk melakukan
kunjungan, baik pada orang tua ataupun kerabat dan teman.
Tahap 10. Visualisasi untuk kasus selesai (meninggal atau sembuh)
fig = px.bar(x=datewise.index, y=datewise
[“Total Recovered”]+datewise[“Total Deaths”])
fig.update_layout(title=”Distribusi kemungkinan dari
kasus yang selesai (meninggal atau sembuh)”,
xaxis_title=”Date”, yaxis_title=”-
Jumlah Kasus”)
fig.show()
Gambar 6.9 Kasus selesai (meninggal atau sembuh) untuk Indonesia pada periode Maret-Desember
2021 pada sumbu horizontal tanggal (ditulis Date) dan banyaknya kasus (sumbu = vertikal)
Machine Learning untuk Kasus Covid-19 307
name=’Pertumbuhan meninggal
setiap minggu’))
fig.update_layout(title=”Pertumbuhan kasus mingguan”,
xaxis_title=”Minggu”,yaxis_title
=”Jumlah Kasus”,legend=dict(x=0,y=1,traceorder
=”normal”))
fig.show()
Gambar 6.10 Kasus pertumbuhan mingguan untuk Indonesia pada periode Maret-Desember 2021
pada sumbu horizontal dan banyaknya kasus (sumbu = vertikal)
Tahap 12. Analisis pertumbuhan kasus pada jumlah kasus dan kasus kematian
fig, (ax1,ax2) = plt.subplots(2, 1, figsize=(18,10))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).
diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).
diff().fillna(0),ax=ax2)
ax1.set_xlabel(“minggu”)
ax2.set_xlabel(“minggu”)
ax1.set_ylabel(“Jumlah kasus”)
ax2.set_ylabel(“Jumlah kasus kematian”)
Machine Learning untuk Kasus Covid-19 309
Gambar 6.11 Kasus pertumbuhan mingguan total kasus untuk Indonesia periode Maret-Desember
2021 pada sumbu horizontal dan banyaknya kasus (sumbu = vertikal)
Gambar 6.12 Kasus pertumbuhan mingguan kasus kematian untuk Indonesia periode Maret-Desember
2021 pada sumbu horizontal dan banyaknya kasus (sumbu vertikal)
310 Machine Learning dengan Python
Gambar 6.13 Kasus pertumbuhan kasus kematian, sembuh, total kasus untuk Indonesia periode
Maret-Desember 2021 pada sumbu horizontal dan banyaknya kasus (sumbu vertikal)
fig=go.Figure()
fig.add_trace(go.Scatter(x=datewise.index,
y=datewise[“Total Cases”].diff().fillna(0),
mode=’lines+markers’,
name=’Jumlah kasus’))
312 Machine Learning dengan Python
fig.add_trace(go.Scatter(x=datewise.index,
y=datewise[“Total Recovered”].diff().fillna(0),
mode=’lines+markers’,
name=’Jumlah kesembuhan’))
fig.add_trace(go.Scatter(x=datewise.index,
y=datewise[“Total Deaths”].diff().fillna(0),
mode=’lines+markers’,
name=’Jumlah kematian’))
fig.update_layout(title=”Jumlah kenaikan
harian dari berbagai kasus”,
xaxis_title=”Date”,yaxis_title
=”Jumlah kasus”,legend=dict(x=0,y=1,traceorder
=”normal”))
fig.show()
Dari perintah di atas diperoleh hasil bahwa:
Rata-rata kenaikan harian dari jumlah kasus: 6621.0
Rata-rata kenaikan harian dari kesembuhan: 6385.0
Rata-rata kenaikan harian dari kematian: 224.0
Gambar 6.14 Kasus pertumbuhan harian kasus kematian, sembuh, total kasus untuk Indonesia periode
Maret-Desember 2021 pada sumbu horizontal dan banyaknya kasus (sumbu vertikal)
Machine Learning untuk Kasus Covid-19 313
Grafik pada Gambar 6.14 menunjukkan rata-rata kasus tertinggi ada di sekitar bulan Juli 2021
dan rata-rata penurunan kasus yang sangat banyak sebelum bulan Januari 2022.
Tahap 14. Kita melakukan analisis berdasarkan provinsi
Analisis berdasarkan provinsi
countrywise=gruping_location.groupby([“Location”]).
agg({“Total Cases”:’sum’,”Total Recovered”:’sum’,
”Total Deaths”:’sum’, “Total Active Cases”:’sum’}).
sort_values([“Total Cases”],ascending=False)
countrywise[“kematian”]=(countrywise[“Total Deaths”]/
countrywise[“Total Cases”])*100
countrywise[“sembuh”]=(countrywise[“Total Recovered”]/
countrywise[“Total Cases”])*100
countrywise
314 Machine Learning dengan Python
Tahap 15. Kita akan gambarkan 10 provinsi terbanyak untuk total kasus, total sembuh,
dan total meninggal
fig, (ax1, ax2, ax3) = plt.subplots
(3, 1,figsize=(10,20))
top_10kasus=countrywise.sort_values
([“Total Cases”],ascending=False).head(10)
top_10sembuh=countrywise.sort_values
([“Total Recovered”], ascending=False).head(10)
top_10kematian=countrywise.sort_values
([“Total Deaths”],ascending=False).head(10)
sns.barplot(x=top_10kasus[“Total Cases”],
y=top_10kasus.index,ax=ax1)
ax1.set_title(“Top 10 provinsi dari jumlah kasus”)
sns.barplot(x=top_10sembuh
[“Total Recovered”],y=top_10sembuh.index,ax=ax2)
ax2.set_title(“Top 10 provinsi dari jumlah
kesembuhan”)
Machine Learning untuk Kasus Covid-19 315
sns.barplot(x=top_10kematian[“To-
tal Deaths”],y=top_10kematian.index,ax=ax3)
ax3.set_title(“Top 10 provinsi dari jumlah kematian”)
Gambar 6.15 Lokasi 10 terbanyak untuk total kasus Covid-19 di Indonesia periode Maret 2021-Oktober
2021
Gambar 6.16 Lokasi 10 terbanyak untuk total kasus sembuh Covid-19 di Indonesia periode Maret
2021-Oktober 2021
316 Machine Learning dengan Python
Gambar 6.17 Lokasi 10 terbanyak untuk total kasus kematian Covid-19 di Indonesia periode Maret
2021-Oktober 2021
Dengan memperhatikan Gambar 6.15-6.17, tampak bahwa kota dengan populasi terpadat di
Indonesia dengan kasus Covid-19 terbanyak, serta dengan pasien sembuh paling banyak,
akan tetapi kematian justru terjadi paling tinggi di Jawa Timur.
Tahap 16. Kita mempelajari pada kasus dalam 24 jam terakhir dari data yang diperoleh
provinsi_terkonfirmasi_24jamterakhir = []
provinsi_sembuh_24jamterakhir=[]
provinsi_kematian_24jamterakhir=[]
for provinsi in countrywise.index:
provinsi_terkonfirmasi_24jamterakhir.append((np.
abs(gruping_location.loc[provinsi].iloc[-1]-gruping_
location.loc[provinsi].iloc[-2]))[“Total Cases”])
provinsi_sembuh_24jamterakhir.append((np.abs(grup-
ing_location.loc[provinsi].iloc[-1]-gruping_location.
loc[provinsi].iloc[-2]))[“Total Recovered”])
provinsi_kematian_24jamterakhir.append((np.abs(-
gruping_location.loc[provinsi].iloc[-1]-gruping_loca-
tion.loc[provinsi].iloc[-2]))[“Total Deaths”])
Machine Learning untuk Kasus Covid-19 317
provinsi_24jamterakhir = pd.DataFrame(list(zip(coun-
trywise.index,provinsi_terkonfirmasi_24jamterakh-
ir,provinsi_sembuh_24jamterakhir,provinsi_kematian_
24jamterakhir)),
columns=[“Provinsi”,
”Kasus 24 jam terakhir”,”Sembuh 24 jam terakhir”,”Ke-
matian 24 jam terakhir”])
Top_10kasus_prov=provinsi_24jamterakhir.sort_val-
ues([“Kasus 24 jam terakhir”],ascending=False).
head(10)
Top_10sembuh_prov=provinsi_24jamterakhir.sort_val-
ues([“Sembuh 24 jam terakhir”],ascending=False).
head(10)
Top_10kematian_prov=provinsi_24jamterakhir.sort_val-
ues([“Kematian 24 jam terakhir”],ascending=False).
head(10)
Gambar 6.18 Lokasi 10 terbanyak untuk total kasus Covid-19 pada 24 jam terakhir di Indonesia periode
Maret 2021-Oktober 2021
Gambar 6.19 Lokasi 10 terbanyak untuk total kasus sembuh Covid-19 pada 24 jam terakhir di
Indonesia periode Maret 2021-Oktober 2021
Machine Learning untuk Kasus Covid-19 319
Gambar 6.20 Lokasi 10 terbanyak untuk total kasus kematian Covid-19 pada 24 jam terakhir di
Indonesia periode Maret 2021-Oktober 2021
Tahap 17. Proporsi kasus dalam 24 jam terakhir pada tiap provinsi
provinsi_24jamterakhir[“Proporsi dari kasus”]=np.
abs((provinsi_24jamterakhir[“Kasus 24 jam terakhir”]/
(datewise[“Total Cases”].iloc[-1]-datewise
[“Total Cases”].iloc[-2]))*100)
provinsi_24jamterakhir[“Proporsi dari sembuh”]=np.
abs((provinsi_24jamterakhir[“Sembuh 24 jam terakhir”]/
(datewise[“Total Recovered”].iloc[-1]-datewise
[“Total Recovered”].iloc[-2]))*100)
provinsi_24jamterakhir[“Proporsi dari kematian”]=np.
abs((provinsi_24jamterakhir[“Kematian 24 jam
terakhir”]/(datewise[“Total Deaths”].
iloc[-1]-datewise[“Total Deaths”].iloc[-2]))*100)
provinsi_24jamterakhir[[“Provinsi”,”Proporsi dari
kasus”,”Proporsi dari sembuh”,”Proporsi dari
kematian”]].sort_values([“Proporsi dari kasus”],
ascending=False).style.background_gradient(c-
map=”Reds”)
320 Machine Learning dengan Python
Machine Learning untuk Kasus Covid-19 321
Gambar 6.21 Lokasi 10 provinsi terbanyak untuk total kasus aktif Covid-19 di Indonesia periode Maret
2021-Oktober 2021
Gambar 6.22 Lokasi 10 provinsi terbanyak untuk total kasus selesai (mati/sembuh) Covid-19
di Indonesia periode Maret 2021-Oktober 2021
Machine Learning untuk Kasus Covid-19 323
Pada bagian selanjutnya, kita akan melakukan klasterisasi dengan Machine Learning
setelah membaca data.
state=128)
clf.fit(X)
labels=clf.labels_
centroids=clf.cluster_centers_
sil.append(silhouette_
score(X, labels, metric=’euclidean’))
wcss.append(clf.inertia_)
x=np.arange(2,11)
plt.figure(figsize=(10,5))
plt.plot(x,wcss,marker=’o’)
plt.xlabel(“Klaster”)
plt.ylabel(“Within Cluster Sum of Squares (WCSS)”)
plt.title(“Model Elbow”)
Gambar 6.23 Hasil model Elbow pada klasterisasi K-means data kematian dan sembuh kasus Covid-19
di Indonesia periode Maret 2021-Oktober 2021
Machine Learning untuk Kasus Covid-19 325
Gambar 6.24 Hasil klasterisasi hierarki data kematian dan sembuh kasus Covid-19 di Indonesia
periode Maret 2021-Oktober 2021
Tahap 5.
clf_final=KMeans(n_clusters=3,init=’k-means++’,random_
state=6)
clf_final.fit(X)
klaster=clf_final.predict(X)
Tahap 6.
plt.figure(figsize=(10,5))
sns.scatterplot(x=countrywise[“sembuh”],
y=countrywise[“kematian”],hue=klaster,s=100)
plt.axvline(((datewise[“Total Recovered”]/datewise
[“Total Cases”])*100).mean(),
color=’red’,linestyle=”--”,label=”Rata-
rata tingkat sembuh”)
plt.axhline(((datewise[“Total Deaths”]/datewise
326 Machine Learning dengan Python
[“Total Cases”])*100).mean(),
color=’black’,linestyle=”--”,label=”Ra-
ta-rata tingkat kematian”)
plt.legend()
Gambar 6.25 Klasifikasi data kasus Covid-19 antara kematian dan sembuh dalam kelompok provinsi
dalam 3 kluster dengan memperhatikan rata-rata tingkat sembuh dan rata-rata tiap kematian
print(“Provinsi klaster 0: “,
list(countrywise[klaster==0].head(10).index))
print(“Provinsi klaster 1: “,
list(countrywise[klaster==1].head(10).index))
print(“Provinsi klaster 2: “,
list(countrywise[klaster==2].head(10).index))
Luaran:
Provinsi klaster 0: [‘DKI Jakarta’, ‘Jawa Barat’,
‘Kalimantan Timur’, ‘Sulawesi Selatan’, ‘Daerah
Istimewa Yogyakarta’, ‘Riau’, ‘Banten’, ‘Bali’,
‘Sumatera Barat’, ‘Sumatera Utara’]
Provinsi klaster 1: [‘Jawa Tengah’, ‘Jawa Timur’,
‘Sumatera Selatan’, ‘Lampung’, ‘Aceh’]
Provinsi klaster 2: [‘Papua’]
Machine Learning untuk Kasus Covid-19 327
Pembahasan: pada klaster 0 ditunjukkan bahwa DKI Jakarta, Jawa Barat, dan lainnya (lihat
luaran) merupakan kelompok provinsi dengan angka kesembuhan tertinggi dan kematian
terendah di mana tingkat kematian dibedakan menjadi 2 kelompok (di bawah 5.5 dan di
atasnya), sedangkan provinsi Papua dengan kematian dan kesembuhan paling rendah yang
mengindikasikan rendahnya kasus Covid-19 di Papua dibandingkan provinsi yang lainnya.
Tahap 2. Kita membaca data dari github dengan alamat yang dituju. Hal ini melatih kita
bagaimana membaca data yang diberikan oleh alamat lain asalkan alamat link jelas
confirmed_df = pd.read_csv(‘https://raw.
githubusercontent.com/CSSEGISandData/COVID-19/master/
csse_covid_19_data/csse_covid_19_time_series/time_
series_covid19_confirmed_global.csv’)
deaths_df = pd.read_csv(‘https://raw.
githubusercontent.com/CSSEGISandData/COVID-19/master/
csse_covid_19_data/csse_covid_19_time_series/time_
series_covid19_deaths_global.csv’)
Tahap 3. Memanggil data dan fitur-fiturnya
confirmed_df.head()
cols = confirmed_df.keys()
(Sumber: https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/
csse_covid_19_time_series/time_series_covid19_confirmed_global.csv, pada tanggal 28 Mei 2022)
Gambar 6.27 Contoh tampilan yang terkonfirmasi dari 5 baris pertama (‘confirmed’) data yang diolah
(Sumber: https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/
csse_covid_19_time_series/time_series_covid19_confirmed_global.csv, pada tanggal 28 Mei 2022)
Catatan: Jika program dijalankan pada waktu yang berbeda maka terjadi perubahan data,
misalkan buku ini ditulis dengan melakukan running program pada 16 Juli 2022. Data terjadi
perubahan di mana data terakhir yang tercatat adalah pada tanggal 15 Juli 2022. Hal ini
ditunjukkan pada Gambar 6.28.
Machine Learning untuk Kasus Covid-19 333
dates = confirmed.keys()
world_cases = []
total_deaths = []
mortality_rate = []
# recovery_rate = []
# total_recovered = []
total_active = []
china_cases = []
italy_cases = []
us_cases = []
for i in dates:
confirmed_sum = confirmed[i].sum()
death_sum = deaths[i].sum()
# Hitung lajunya
mortality_rate.append(death_sum/confirmed_sum)
# recovery_rate.append(recovered_sum/confirmed_sum)
#Kasus yang dipelajari
china_cases.append(confirmed_df[confirmed_
df[‘Country/Region’]==’China’][i].sum())
italy_cases.append(confirmed_df[confirmed_
df[‘Country/Region’]==’Italy’][i].sum())
us_cases.append(confirmed_df[confirmed_df[‘Country/
Region’]==’US’][i].sum())
336 Machine Learning dengan Python
world_daily_increase = daily_increase(world_cases)
china_daily_increase = daily_increase(china_cases)
italy_daily_increase = daily_increase(italy_cases)
us_daily_increase = daily_increase(us_cases)
days_since_1_length = np.
array([i for i in range(len(dates))]).reshape(-1, 1)
world_cases = np.array(world_cases).reshape(-1, 1)
total_deaths = np.array(total_deaths).reshape(-1, 1)
days_in_future = 10
future_forcast = np.
array([i for i in range(len(dates)+days_in_future)]).
reshape(-1, 1)
adjusted_dates = future_forcast[:-10]
Tahap 1. Mulai dengan Machine Learning dengan melakukan pemisahan data
X_train_confirmed, X_test_confirmed, y_train_
confirmed, y_test_confirmed = train_test_
split(days_since_1_length, world_cases, test_
size=0.15, shuffle=False)
Machine Learning untuk Kasus Covid-19 337
# dicek kembali
svm_test_pred = svm_confirmed.predict(X_test_confirmed)
plt.plot(svm_test_pred)
plt.plot(y_test_confirmed)
print(‘MAE:’, mean_absolute_error(svm_test_pred, y_
test_confirmed))
print(‘MSE:’,mean_squared_error(svm_test_pred, y_test_
confirmed))
Tahap 3. Mentransformasi data ke transformasi regresi
# transform our data for polynomial regression
poly = PolynomialFeatures(degree=5)
poly_X_train_confirmed = poly.fit_transform(X_train_
confirmed)
poly_X_test_confirmed = poly.fit_transform(X_test_
confirmed)
poly_future_forcast = poly.fit_transform(future_
forcast)
Tahap 4. Melakukan regresi polinomial
polynomial regression
linear_mo del = LinearRegression(normalize=True, fit_
intercept=False)
linear_model.fit(poly_X_train_confirmed, y_train_
confirmed)
test_linear_pred = linear_model.predict(poly_X_test_
confirmed)
338 Machine Learning dengan Python
linear_pred = linear_model.predict(poly_future_
forcast)
print(‘MAE:’, mean_absolute_error(test_linear_pred, y_
test_confirmed))
print(‘MSE:’,mean_squared_error(test_linear_pred, y_
test_confirmed))
Luaran:
MAE: 12863.692361032718
MSE: 284678459.52575696
Tahap 5a
print(linear_model.coef_)
Luaran:
[[ 2.68814745e+03 -1.78526205e+03 3.66976536e+02
-7.95865916e+00
-3.17544829e-02 1.58894877e-03]]
KodeTeks
Tahap 5b
plt.plot(test_linear_pred)
plt.plot(y_test_confirmed)
Luaran:
Gambar 6.29 Visualisasi prediksi linear dan data uji dengan kasus yang terkonfirmasi data kasus
Covid-19 dunia sejak Januari 2020 hingga Maret 2020
Machine Learning untuk Kasus Covid-19 339
0.0001],
‘alpha_2’: [1e-
07, 1e-06, 1e-05,
0.0001],
‘lambda_1’: [1e-07,
1e-06, 1e-05,
0.0001],
‘lambda_2’: [1e-07,
1e-06, 1e-05,
0.0001],
‘tol’: [0.0001, 0.001,
0.01]},
Machine Learning untuk Kasus Covid-19 341
pre_dispatch=’2*n_jobs’, random_state=None,
refit=True,
return_train_score=True,
scoring=’neg_mean_squared_error’,
verbose=1)
Tahap 7.
bayesian_search.best_params_
Luaran:
{‘tol’: 0.0001, ‘lambda_2’: 0.0001, ‘lambda_1’: 1e-06,
‘alpha_2’: 1e-07, ‘alpha_1’: 0.0001}
Tahap 8. Model Bayesian untuk yang terkonfirmasi
bayesian_confirmed = bayesian_search.best_estimator_
test_bayesian_pred = bayesian_confirmed.predict(poly_X_
test_confirmed)
bayesian_pred = bayesian_confirmed.predict(poly_future_
forcast)
print(‘MAE:’, mean_absolute_error(test_bayesian_
pred, y_test_confirmed))
print(‘MSE:’,mean_squared_error(test_bayesian_pred, y_
test_confirmed))
Luaran:
MAE: 7674.882332597836
MSE: 63836099.3390154
Tahap 9. Menggambar visualisasi data uji yang terkonfirmasi positif Covid-19 dengan yang
data uji hasil prediksi
plt.plot(y_test_confirmed)
plt.plot(test_bayesian_pred)
342 Machine Learning dengan Python
Luaran:
Gambar 6.30 Visualisasi prediksi model Bayesian terhadap data uji dengan kasus yang terkonfirmasi
data kasus Covid-19 dunia
Dari visualisasi tersebut, kita dapat melihat bahwa Bayesian regresi lebih baik daripada regresi
polinomial yang ditunjukkan pada Gambar 6.29. Kita menggunakan Bayesian ini untuk data
kasus terkonfirmasi positif pada data kasus Covid-19 di dunia periode Januari-Maret 2020. Kita
dapat menggunakan program yang sama untuk melakukan penelitian lebih lanjut.
6.5. Penutup
Berbagai pendekatan untuk pembahasan kasus Covid-19 telah dilakukan pula oleh berbagai
peneliti (Kubota et al., 2020)coronavirus disease 2019 (COVID-19, baik untuk dunia maupun
data Indonesia. Demikian pula pemodelan data kasus Covid-19 dengan menggunakan gerak
Brown (Fabiano, 2021) dan citra CT dengan Deep Learning (Swastika & Korespondensi, 2020),
juga untuk perbandingan beberapa metode dalam Machine Learning semua pendekatan.
Machine Learning untuk Kasus Covid-19 343
DAFTAR PUSTAKA
Fabiano, N. 2021. Geometric Brownian Motion and a New Approach to the Spread of Covid-19
in Italy, 2. 10(2), 25–30.
Kubota, Y., Shiono, T., Kusumoto, B., & Fujinuma, J. 2020. Multiple Drivers of the Covid-19
Spread: The Roles of Climate, International Mobility, and Region-Specific Conditions.
PLoS ONE, 15(9 September), 1–15. https://doi.org/10.1371/journal.pone.0239385.
Parhusip, H. A. 2020. Study on Covid-19 in the World and Indonesia Using Regression Model
of SVM, Bayesian Ridge, and Gaussian. Jurnal Ilmiah Sains, 20(2), 49. https://doi.
org/10.35799/jis.20.2.2020.28256.
Swastika, W., & Korespondensi, P. 2020. Studi Awal Deteksi Covid-19 Menggunakan Citra
Ct Berbasis Deep Learning Preliminary, Study of Covid-19 Detection Using Ct Image
Based on Deep Learning. Jurnal Teknologi Informasi Dan Ilmu Komputer (JTIIK), 7(3),
629–634. https://doi.org/10.25126/jtiik.202073399.
344 Machine Learning dengan Python
INDEKS
spesifitas, 3, 4, 20
Supervised Machine Learning, 4
Wavelet, 8
Colab, 1, 2
Corona, 1
Covid-19, 1, 3, 4, 5, 6, 7, 8, 9, 11, 26, 28, 29,
31, 32, 33, 34, 35, 45, 46, 47, 48
klasterisasi, 32, 33, 34
Machine Learning, 1, 9, 32, 35, 43, 47
Python, 1
SARS-CoV-2, 1
SVR, 1, 32, 36, 43
visualisasi, 9, 35, 47
Amazon Review, 19, 25
corpus, 1, 3, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17,
19, 20, 24, 29, 38
Lemmatization, 18
Machine Learning, 3, 19, 107
Naive Bayes, 24, 25, 27, 99
Natural Language Process, 1, 14
NLP, 1, 2, 3, 4, 6, 7, 14, 15
NLTK, 6, 15, 16, 38
pre-processing, 18
TENTANG PENULIS