Proyek Machine Learning dari Hulu ke Hilir (End-to-End) – Part 2: Mempersiapkan Environment dan Mengakses Data

end to end machine learning part 2

“A breakthrough in machine learning would be worth ten Microsofts.”

~ Bill Gates

1. Mengakses Data

hakim-azizul.com Pada post sebelumnya, kita telah menyiapkan checklist untuk proyek machine learning kita, merumuskan masalah, menyiapkan performance measure, dan menguji asumsi kita.

Selanjutnya, kita mulai bagian hands on. It’s time to get your hands dirty, guys! Dalam belajar, berani kotor itu baik. 🙂

1.1. Menyiapkan Workspace atau Working Directory

Dalam proyek ini, tools yang akan kita gunakan adalah python. Maka, jika belum, install-lah python di komputer anda. Seperti biasa, saya merekomendasikan anda untuk menginstall Scintific Python distribution, seperti Anaconda.

Seperti yang pernah saya singgung juga di artikel sebelumnya, dengan menggunakan Anaconda, modul-modul Python yang selalu terpakai untuk proyek ilmiah, seperti Jupyter, NumPy, Pandas, Matplotlib, dan Scikit-Learn, akan terinstall secara otomatis pada komputer anda, dan semuanya gratis-tis-tiss, dan mudah! 🙂

1.1.1. Membuat Workspace

Setelah memastikan Python terinstall di sistem anda, berikutnya, buatlah workspace directory untuk kodingan machine learning anda dan datasetnya.  Jika anda pengguna Windows seperti saya, bukalah Command Prompt, dan ketikkan perintah berikut ini:

mkdir di windows python

Sumber Gambar: Dokumentasi Pribadi.

Lalu akan terbuat working directory, atau folder baru untuk proyek anda.

machine learning working directory

Sumber Gambar: Dokumentasi Pribadi.

Yap, betul! Kita bisa melakukan ini hanya dengan “klik kanan”, lalu “New” -> “Folder”, tapi membuat direktori melalui cmd dengan mkdir, membangun kebiasaan bagus, apalagi jika kedepannya kita harus membuat banyak folder untuk banyak proyek berbeda, dan melakukannya berulang-ulang.

Untuk pengguna linux, hasil yang sama dapat diperoleh dengan mengetikkan perintah berikut ini di terminal anda (perintah setelah tanda $):

$export ML_PATH="$HOME/ml_projects"   #Path boleh diganti sesuai keinginan anda
$mkdir -p $ML_PATH

1.1.2. Menyiapkan pip (Python’s Packaging System)

Berikutnya, untuk berjaga-jaga jika kita ingin menginstall library atau packages tambahan, kita perlu menyiapkan packaging system.

Seperti yang sering saya singgung sebelum-sebelumnya, jika anda menginstall Anaconda di sistem anda, maka anda dapat dengan mudah menambahkan libraries tersebut dengan mudah; tinggal klik-klik saja, dengan menggunakan Anaconda Navigator.

Dengan menggunakan Anaconda pula, anda bisa menginstall libraries dengan menggunakan perintah conda di command prompt anda, atau juga di Anaconda Prompt anda. Caranya mudah, jika belum tahu, silakan tinggal googling saja yaa, karena akan kepanjangan kalau dibahas juga di sini, hehe.

Selain kedua cara di atas, anda dapat menggunakan pip.  Yang mana, pip sudah secara default akan terinstall, apabila anda menginstall Python versi >= 2.7.9. Sekali lagi, jika anda menggunakan Anaconda, pip juga akan terinstall otomatis di sistem anda.

Untuk melihat versi pip yang terinstall di sistem anda, silakan ketik perintah ini di command prompt anda:

pip --version

pip yang terinstall di sistem saya (versi 18.1 dong cuy):

cek versi pip di laptop anda

Sumber Gambar: Dokumentasi Pribadi.

Pastikan versi pip yang terinstall di sistem anda adalah versi > 1.4, untuk mensupport instalasi binary module atau wheels. Untuk mengupgrade module pip, jalankan perintah berikut di command prompt:

pip install --upgrade pip

1.1.3. Membuat Isolated Environment

Berikutnya, langkah yang sangat direkomendasikan, yaitu membuat isolated environment untuk tempat kita bekerja (untuk menghindari konflik antar versi library).

Pertama, install virtualenv terlebih dahulu:

pip install virtualenv

Tampilan di console:

install virtualenv

Sumber Gambar: Dokumentasi Pribadi.

Selanjutnya, buat isolated Python environment dengan mengetikkan perintah berikut:

cd ml_projects
virtualenv env

Tampilan di console:

virtualenv

Sumber Gambar: Dokumentasi Pribadi.

Selanjutnya, setiap kita ingin mengaktifkan environment, ketikkan ini di console:

activate

Setelah mengaktifkan environment, untuk memastikan apakah modul yang kita butuhkan untuk proyek machine learning telah terinstall semua, ketikkan perintah berikut ini di command prompt:

python -c "import jupyter, matplotlib, numpy, pandas, scipy, sklearn"

Tampilan di console:

activate virtualenv

Sumber Gambar: Dokumentasi Pribadi.

Jika sudah berhasil dan tidak ada kesalahan sama sekali, perintah di atas tidak akan menghasilkan output apapun, dan environmen kerja kita sudah siap! 🙂

 

1.2. Jupyter Notebook

Selanjutnya, aktifkan Jupyter Notebook dengan mengetikkan perintah berikut pada console:

jupyter notebook

Tampilan pada command prompt:

memulai jupyter notebook

Sumber Gambar: Dokumentasi Pribadi.

Sekarang, server Jupyter telah berjalan di terminal anda, dan terhubung dengan port 8888. Untuk mengakses server ini, buka web browser anda, lalu akses http://localhost:8888/ (biasanya akan terbuka secara otomatis di web browser default yang anda pakai).

Di browser akan terlihat workspace directory yang masih kosong (hanya berisi directory env, jika kita telah mengikuti instruksi pembuatan virtualenv sebelumnya dengan benar).

Selanjutnya, buatlah file notebook Python baru, dengan mengklik tombol “New”, lalu pilih versi python yang anda inginkan. Contohnya sebagai berikut:

memulai jupyter notebook

Sumber Gambar: Dokumentasi Pribadi.

Dengan membuat notebook baru, terjadilah tiga step berikut ini:

  1. Membuat file notebook baru yang bernama Untitled.ipynb.
  2. Memulai kernel Python pada Jupyter, untuk menjalankan notebook ini.
  3. File notebook yang baru terbuat ini, terbuka di tab baru pada browser anda.

Selanjutnya, kita dapat mengganti judul notebook, yang mana akan secara otomatis merename file notebook, dengan cara sebagai berikut:

memulai jupyter notebook

Sumber Gambar: Dokumentasi Pribadi.

Setelah double klik “Untitled”, akan muncul window seperti di bawah, lalu gantilah judul notebooknya, misalnya sebagai berikut:

rename jupyter notebook

Sumber Gambar: Dokumentasi Pribadi.

Sebuah notebook tersusun atas list atau kumpulan cell (seperti tabel). Setiap cell dapat berisi kode-kode yang dapat dieksekusi, atau dapat pula berisi teks yang dapat diatur formatnya.

Ketika pertama dibuat, sebuah notebook hanya berisikan sebuah cell kode, dengan label “In [1]:”. Cobalah ketik:

print("Hello World!")

untuk sekalian mengetes apakah penginstallan kernel Python pada Jupyter sudah benar-benar tanpa error. Lalu untuk mengeksekusi kodenya, tekan tombol play seperti gambar di bawah, atau bisa juga dengan menekan “Ctrl+Enter”. Setelah running kode, hasilnya akan tercetak di bawah cell code, seperti pada gambar di bawah:

hello world jupyter notebook

Sumber Gambar: Dokumentasi Pribadi.

1.2.1. Mendownload Data

Pada lingkungan kerja yang sebenarnya, data yang akan kita olah seringkali tersedia dalam bentuk relational database (atau tipe penyimpanan data yang lain, yang sudah umum) dan datanya berada di beragam atau multiple tabel, dokumen, atau file. Untuk dapat mengaksesnya, bisa jadi diperlukan credentials atau authorisasi akses, dan kita pun perlu mengenali schema datanya terlebih dahulu.

Namun, pada proyek kita kali ini, kasusnya jauh lebih sederhana: Data yang akan kita olah telah tersedia dalam satu file saja, yaitu housing.csv, yang terkompresi menjadi housing.tgz, dan tersimpan di Github.

Kita bisa mengunduh datanya menggunakan web browser, lalu kita decompress atau extract, lalu kita pindahkan ke working directory tempat kita bekerja. Namun, ada baiknya kita membiasakan untuk membuat automatisasi untuk tugas-tugas seperti demikian, dengan membuat function.

Function tersebut akan sangat terasa gunanya jika datanya seringkali berubah, sehingga kita dapat selalu fetch dataset terbaru dengan function tersebut (dan dimungkinkan juga untuk membuat schedule tertentu untuk memperoleh data terbarunya). Automatisasi ini juga berguna jika kita ingin menginstall dan menjalankan model yang kita buat di mesin-mesin atau environment yang berbeda.

Berikut ini adalah function untuk fetching dataset:

#Import library
import os
import tarfile
from six.moves import urllib

#Path data
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml/master/"
HOUSING_PATH = "datasets/housing"
HOUSING_URL = DOWNLOAD_ROOT + HOUSING_PATH + "/housing.tgz"

#Fungsi untuk fetching data
def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH):
    if not os.path.isdir(housing_path):
        os.makedirs(housing_path)
    tgz_path = os.path.join(housing_path, "housing.tgz")
    urllib.request.urlretrieve(housing_url, tgz_path)
    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path=housing_path)
    housing_tgz.close()

Selanjutnya, kita panggil fungsi fetch_housing_data(). Dengan memanggil fungsi tersebut, secara otomatis akan dibuat direktori datasets/housing pada working directory kita, lalu mendownload housing.tgz dari github, dan mengekstrak housing.csv.

fetch_housing_data()

Selanjutnya, load data menggunakan Pandas. Kita buat terlebih dahulu functionnya:

import pandas as pd

def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)

Function di atas akan menyajikan dataset dalam bentuk objek Pandas DataFrame.

1.2.2. Meninjau Sekilas Struktur Data (Data Structure)

Ketikkan dan run perintah berikut, untuk melihat lima baris awal dari dataset kita:

housing = load_housing_data()
housing.head()

Tampilan hasilnya di Jupyter Notebook:

pandas data frame

Sumber Gambar: Dokumentasi Pribadi.

Setiap baris data merepresentasikan satu distrik. Dataset ini memiliki 10 atribut atau features; yaitu longitude, latitude, housing_median_age, total_rooms, total_bedrooms, population, households, median_income, median_house_value, dan ocean_proximity.

Selanjutnya, untuk memperoleh deskripsi singkat mengenai data kita, gunakan method info(). Deskripsi singkat tersebut, diantaranya: jumlah baris atau jumlah observasi, tipe data dari setiap atribut atau features, dan jumlah dari nilai tidak nol (non-null values)

housing.info()

Tampilan hasil running script di atas:

pandas data frame df info

Sumber Gambar: Dokumentasi Pribadi.

Dari info dataset di atas, terlihat bahwa terdapat 20.640 baris data atau jumlah observasi. Jumlah tersebut tergolong kecil untuk ukuran Machine Learning, namun merupakan contoh yang baik untuk tahap belajar.

Perhatikan bahwa variabel total_bedrooms hanya memiliki 20.433 nilai tak-nol, atau dengan kata lain, terdapat 207 distrik yang tidak ada datanya. Untuk menangani missing values tersebut, akan kita bahas di lain kesempatan.

Semua variabel di atas adalah variabel numerik, kecuali untuk ocean_proximity, yang tipe datanya adalah objek, sehingga bisa jadi merupakan objek Python apapun, namun dikarenakan dataset kita adalah data teks dalam file CSV, maka atribut ocean_proximity pastilah teks juga.

Jika kita perhatikan lima baris pertama dari dataset kita di atas, kita akan melihat nilai dari kolom ocean_proximity merupakan teks yang berulang atau repetitif, yaitu “NEAR BAY”, sehingga bisa kita simpulkan bahwa variabel tersebut adalah variabel kategoris.

Untuk mencari tahu ada kategori apa saja, dan ada berapa banyak distrik pada setiap kategorinya, gunakan method value_counts() sebagai berikut:

housing["ocean_proximity"].value_counts()

Hasilnya:

pandas data frame value counts

Sumber Gambar: Dokumentasi Pribadi.

Selanjutnya, dengan menggunakan method describe(), kita akan mendapatkan summary statistik (count, mean, std, min, max, 25% percentile, 50% percentile, dan 75% percentile), dari atribut-atribut numerik.

housing.describe()

Hasilnya:

pandas data frame describe aggregate statistics

Sumber Gambar: Dokumentasi Pribadi.

Hasil dari count, mean, min, dan max sudah cukup jelas. Perhatikan bahwa null values tidak dimasukkan dalam perhitungan (sebagai contoh, jumlah atau count total_bedrooms adalah 24,433, bukan 20,640, seperti sudah disinggung sebelumnya). Std menunjukkan deviasi standar (standard deviation) atau simpangan baku (yang mengukur tingkat dispersi atau persebaran suatu nilai).

25%, 50%, dan 75% baris menunjukkan persentil atau percentile (persentil mengindikasikan nilai suatu observasi berada di bawah atau dalam rentang persentase yang diberikan. Sebagai contoh, 25% dari distrik memiliki housing_median_age di bawah 18, 50% distrik memiliki housing_median_age di bawah 29, dan 75% memiliki housing_median_age di bawah 37 tahun. Persentil seringkali disebut juga sebagai kuartil atau quartile. 25% adalah kuartil pertama (1st quartile), 50% adalah kuartil kedua, atau median, dan 75% adalah kuartil ketiga (3rd quartile).

Cara cepat lain untuk memperoleh insight dari data adalah dengan memvisualisasikannya dalam bentuk histogram untuk setiap atribut numerik. Pada histogram, sumbu tegak menandakan jumlah (instances) atau frekuensi dari suatu rentang nilai tertentu (nilai yang dituliskan pada sumbu mendatar). Kita dapat mebuat plot histogram satu-persatu untuk setiap data atribut numerik yang kita punya, atau dapat kita gunakan method hist() yang akan secara otomatis memplotkan semua data numerik kita menjadi histogram.

Gunakan script di bawah, untuk membuat histogram tersebut. plt.savefig(“attribute_histogram_plots.png”) akan membuat plot kita tersimpan secara otomatis, di working directory kita, dalam format file .png.

%matplotlib inline
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20,15))
#Jika ingin menunjukkan plot, sekaligus menyimpannya, gunakan plt.savefig
#bukan plt.show()
plt.savefig("attribute_histogram_plots.png")

Hasilnya:

plot histogram housing dataset machine learning jupyter notebook

Sumber Gambar: Dokumentasi Pribadi.

Nice looking graphics, right? 🙂

Catatan: Method hist() adalah method dari package Matplotlib pada Python, yang bergantung pada user-specified graphical backend untuk menggambar grafik pada layar kita. Sehingga, sebelum kita bisa memplotkan sesuatu, kita harus menentukan backend yang akan digunakan oleh Matplotlib.

Opsi paling mudah adalah dengan menggunakan command ajaib pada Jupyter Notebook, yaitu %matplotlib inline (karena sederhana, maka sekali lagi saya rekomendasikan untuk bekerja menggunakan Jupyter Notebook. Dengan perintah tersebut, plot yang akan kita buat akan dirender di Notebook itu sendiri.

 

2. Beberapa Insight Penting

Dari hasil visualisasi data dalam bentuk histogram di atas, dapat kita lihat beberapa hal:

  1. Tampak bahwa variabel median_income yang menyatakan nilai tengah pendapatan, tidak diekspresikan dalam besaran USD. Latar belakangnya adalah, tim yang mengumpulkan data tersebut melakukan scaling data dan membuat cap (rentang nilai) dari 0.5 atau 0.4999 sebagai batas bawah, hingga 15 atau 15.0001 sebagai batas atas. Bekerja dengan data yang telah di-preprocess terlebih dahulu adalah hal yang lumrah pada Machine Learning, dan seharusnya tidak menjadi masalah apabila kita mencari tahu latar belakang dari data tersebut.

  2. Variabel housing_median_age dan median_house_value juga di-cap, seperti dijelaskan di poin 1 di atas. Scaling dan capping pada median_house_value akan menyebabkan masalah serius karena ia adalah variabel target. hal tersebut akan menyebabkan algoritma Machine Learning mempelajari bahwa harga yang akan diprediksi tidak mungkin melebihi limit yang telah ditentukan. Untuk menyelesaikannya, kita harus bertanya pada user atau klien kita apakah hal ini akan menjadi masalah untuk mereka, atau tidak. Jika user membutuhkan prediksi yang akurat, bahkan dapat melebihi limit $500,000, maka kita memiliki dua opsi untuk menyelesaikannya:

    a. Kumpulkan data sebenarnya untuk setiap distrik yang datanya di-cap.
    b. Atau, hapus distrik tersebut dari training set (juga pada test set, karena sistem yang kita buat akan mengevaluasi bahwa model Machine Learning kita buruk, apabila ia memprediksi nilai lebih dari $500,000).
  1. Setiap variabel memiliki skala yang amat berbeda. Kita akan membahasnya kembali nanti, di posting mengenai feature scaling.

  2. Dari histogram di atas, kita lihat bahwa banyak plot yang tail heavy: atau plot tersebut bergeser jauh ke arah kanan dari median. Hal ini akan menyebabkan pendeteksian pola menggunakan algoritma-algoritma Machine Learning menjadi lebih sulit. Kita juga akan mentransformasikan atribut-atribut tersebut agar bentuk distribusinya menjadi lebih bell-shaped.

 

3. Bonus (Penampakan Penuh dari Hasil Analisis dengan Jupyter Notebook)

Berikut ini adalah kode lengkapnya:

Bagaimana cara mengintegrasikan Jupyter Notebook dengan WordPress seperti tampak di atas?

Stay tuned yaa, akan dibahas di tulisan berikutnya, insyaAlloh. 😀

 

References & Further Reading

Geron A. (2017), Hands-On Machine Learning with Scikit-Learn and Tensorflow, O’Reilly Media.

Hauck T. (2014): scikit-learn Cookbook, Packt Publishing.

https://chartio.com/resources/tutorials/how-to-save-a-plot-to-a-file-using-matplotlib/

 

Sumber Gambar

https://pixabay.com/en/money-home-coin-investment-2724235/ oleh nattanan23.

Follow and like us:

4 tanggapan pada “Proyek Machine Learning dari Hulu ke Hilir (End-to-End) – Part 2: Mempersiapkan Environment dan Mengakses Data”

    1. Waalaikumsalam Kang Maul, salam kenal dan terima kasih sudah berkunjung 🙂

      Sebetulnya tidak harus membuat function Kang, seperti yang saya tulis pada bagian 1.2.1. Namun, untuk mengotomatisasikan proses: buka browser, ketik link repository data, download, extract, lalu load data csv ke data frame, kita bisa membuat function terlebih dahulu. Hal ini akan berasa sekali kalau kita melakukan load datanya berulang2, untuk proyek2 berbeda.

      Tapi kalau ingin dilakukan manual, bisa Kang. Setelah download data dan extract, nanti file .CSV-nya bisa diload menggunakan method .read_csv(csv_path) dari library Pandas.

  1. Hey I know this is off topic buut I was wondering
    if you knew of any widgets I could add to my blkg thaqt
    automatically tweet mmy newest twitger updates.

    I’ve been looking for a plug-in like this for quite some
    time and was hoping maybe youu would have some experience wih something lie this.

    Please let me know if you run ingo anything.
    I truly enjoy reading your blog and I look forward to your new updates.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *