Imbalanced

balance

Pada post kali ini saya ingin menjelaskan sedikit teknik-teknik yang biasa dipakai untuk menghadapi dataset yg imbalanced untuk kasus supervised learning, dimana jumlah data dari suatu kelas jauh lebih sedikit dibanding kelas lainnya. Hal ini sering kali muncul di dunia nyata, seperti fraud detection (malah ngeri kalau misalkan jumlah kasus fraud-nya ada banyak, bisa gulung tikar bisnisnya) atau deteksi penyakit langka (cuma 1 dari 1 juta orang yang menderita). Tidak mungkin kita berdoa agar lebih banyak orang menderita sakit biar data training kita bertambah, kan?

1. Biarin aja

Ya, dibiarin aja. Abaikan dan lakukan training seperti biasa. Karena siapa tahu memang kedua kelas tersebut berbeda jauh dan sudah linearly separable. Asal jangan lupa untuk menggunakan metrics yang tepat (bukan akurasi), seperti precision/recall.

2. Downsampling kelas mayoritas

Biar fair ketika dilakukan perhitungan error, jumlah kelas mayoritasnya dikurangi.

3. Upsampling kelas minoritas

Atau sebaliknya, jumlah kelas minoritasnyalah yang ditambah. Upsampling bisa dilakukan dengan cara mengambil data yang sama berulang-ulang (sampling with replacement) atau dengan generate data baru dengan menggunakan algoritma semacam SMOTE.

4. Pakai weighted loss

Atau kita bisa langsung modifikasi loss function-nya agar kelas minoritas mendapat bobot yang lebih tinggi kalau diprediksi salah oleh modelnya. Seberapa besar bobotnya? Paling gampang diset menjadi inversely proportional dengan jumlah data sekarang yang ada. Jadi kalau misalkan perbandingannya 1:2, maka bisa diset minimal bobot kelas positif 2 kali kelas negatif.

Kalau misalkan menggunakan logistic regression di sklearn, ini bisa di set di parameter class_weight di constructor-nya. Atau kalau menggunakan tensorflow, bisa pakai fungsi loss khusus tf.nn.weighted_cross_entropy_with_logits.

Weighted loss ini sendiri bisa dilihat sebagai cara menggunakan sampling secara implisit.

Penutup

Kira2 itu sedikit cara2 untuk meng-handle imbalanced data pada problem classification yang straightforward. Pendekatan yang lebih ekstrem adalah dengan menformulasikan ulang permasalahannya menjadi ranking problem atau novelty/outlier detection. Tapi ini mungkin bahasan di lain hari.

Semoga post singkat ini berguna. Salam.

Iklan

bandit

crossroads
awas salah ngasih tahu abang gojeknya belok kiri atau kanan

Pembukaan

Pernahkah Anda berada dalam keadaan harus memilih di antara 2 pilihan, di mana pilihan yang Anda ambil itu dapat mengubah kehidupan Anda secara drastis?

Saya pernah dan hampir mengalaminya setiap hari. Setiap pulang dari kantor saya selalu dihadapkan pilihan untuk naik bis atau naik busway. Skenario pertama adalah saya langsung dapat bus dan sampai rumah dengan cepat. Skenario kedua saya langsung dapat busway, sampai rumah lumayan cepat tapi lebih capek karena harus berdiri. Skenario terburuk adalah menunggu bus, bus tidak lewat dalam waktu satu jam, Kemudian jadinya menunggu busway, tapi kemudian bisnya malah lewat di depan mata, akhirnya baru dapat busway 30 menit kemudian, itu pun berdiri hingga 1.5 jam karena jalan macet…

Efeknya tentunya sangat berpengaruh. Kalau saya dapat opsi yang pertama, maka saya bisa sampai rumah dengan waktu yang relatif lebih cepat, badan tidak terlalu capek, dan mungkin malamnya bisa produktif sedikit seperti untuk menulis blog atau belajar hal baru dengan menonton video online course.

Bandingkan dengan opsi terakhir yang mana saya sampai rumah larut malam dan kehabisan tenaga sehingga saya hanya bisa menghabiskan waktu dengan menonton video pewdiepie di youtube atau main hearthstone tanpa mikir.

Bandit algorithm

Joking aside, contoh kisah nyata di atas hanyalah ilustrasi belaka untuk menggambarkan suatu kelas masalah yang di matematika dikenal dengan nama bandit algorithm. Bandit algorithm ini namanya terinspirasi dari mesin slot yang ada di kasino2.

Las_Vegas_slot_machines
hati-hati judi dapat meracuni kehidupan, kata bang roma

Penjelasan resminya dari algoritma bandit kira-kira seperti berikut. Pada setiap turn kita memiliki beberapa opsi yang bisa dipilih. Masing-masing opsi akan memberikan reward/hadiah dengan jumlah yang kita belum ketahui sebelumnya. Tugas kita adalah memaksimalkan total reward yang kita dapatkan dari awal pilihan pertama hingga pilihan terakhir. Terdengarnya susah-susah gampang bukan?

Ada juga yang mengklasifikasikan algoritma bandit ini ke dalam special case dari reinforcement learning (RL yang tidak memiliki states). Kalau penasaran, lebih lanjutnya bisa cek chapter 1 dari buku Reinforcement Learning-nya Sutton & Barto.

Implementasi

Untuk mengetes performa dari algoritma2 yang akan kita coba, pertama kita generate terlebih dahulu 2000 simulasi yang masing-masing memiliki distribusi reward yang berbeda-beda. Simulasi ini akan kita jalankan selama 1000 putaran. Contoh salah satu distribusinya adalah sebagai berikut:

distribution
option 3 dan 4 punya reward yg relatif lebih besar dari pilihan lainnya, tapi kita tidak tahu informasi itu di awal

Apa strategi pertama yang bisa kita coba? Pure random. Di tiap turn kita pilih saja opsi terserah yang mana saja. Kalau misalkan random saja sudah bagus, ngapain mikirin algoritma lain yang lebih rumit?

random bandit

Ternyata kalau random, rata2 reward yg kita dapat untuk masing-masing putaran berkisar di angka 0. Weks, jelek sekali performanya.

Bagaimana kalau kita bersifat serakah (greedy), jadi kita hanya memilih opsi yang selama ini memberikan rata2 reward paling tinggi?

greedy bandit

Lumayan, hasilnya secara rata-rata lebih bagus dari random (1, bukan 0). Kekurangannya adalah, karena sifatnya yang greedy, begitu kita memilih opsi yang memberikan nilai positif, maka kita bakal terus-terusan memilih opsi tersebut. Padahal di luar sana mungkin ada pilihan yg bisa menghasilkan reward yang lebih tinggi.

Untuk mengatasi hal tersebut, kita harus bisa menyeimbangkan antara exploitation (mengumpulkan reward sebanyak-banyaknya dengan memilih opsi yang pasti memberikan hasil bagus) dengan exploration (mencari opsi yang mungkin memberikan hasil yang lebih bagus lagi). Salah satu strategi yang bisa dipakai adalah e(epsilon)-greedy. Jadi pada setiap turn, kita punya peluang sebesar e untuk memilih opsi lain secara random. Nilai e ini sendiri jelas harus dipilih secara bijak, karena kalau terlalu kecil maka kita bisa terjebak di pilihan yang tidak optimal, tapi kalau terlalu besar maka kita akan melewatkan terlalu banyak kesempatan untuk mendapat reward yang pasti besar, sehingga secara kumulatif total reward yang kita kumpulkan bisa lebih kecil.

Implementasi-nya kira-kira seperti berikut:

greedy bandit code

egreedy bandit

Wow, sekarang kita bisa mendapatkan nilai dari 1.2 hingga 1.4, tergantung nilai e yg kita pilih.

Now can we do even better than that? Tentu saja. Perhatikan, pada strategy e-greedy, pada saat kita melakukan eksplorasi, kita memilih opsi secara random, tidak peduli terhadap performanya yang sebelumnya. Bagaimana kalau misalkan kita pilih suatu opsi berdasarkan rata-rata performanya sekarang dan yang paling sedikit dipilih sejak saat ini. Motivasinya adalah opsi yang jarang dipilih bisa jadi memiliki potensi memberikan reward besar yang belum terealisasikan.

Strategi ini bernama Upper Confidence Bound (UCB). Untuk derivasi lengkapnya, bisa diintip di blog-nya bang Jeremy Kun. Implementasinya kira-kira seperti ini:

ucb bandit code

Dan hasilnya ternyata memang paling bagus di antara algoritma-algoritma sebelumnya, hingga 1.5!.

ucb bandit

Dan ini adalah perbandingan semua algoritma yang sudah disebut di atas. UCB memiliki nilai paling tinggi dan paling cepat juga mencapai nilai tersebut.

bandit full

Penutup

Apa aplikasi langsung yang bisa dicoba dengan menggunakan teknik ini? Misalkan kamu mau mengoptimisasi conversion rate dari sebuah website dengan mencoba beberapa versi dari landing page-nya. Conventional wisdom-nya adalah kita lakukan A/B test untuk mengetahui varian mana yang performanya paling bagus. Nah, tapi seringkali A/B test ini harus dilakukan dalam jangka waktu yang lumayan lama dengan agar jumlah sampelnya cukup secara statistik. Dengan menjalankan A/B test ini, kita kehilangan potensi untuk menghasilkan reward karena sebagian user akan mendapat varian yang mungkin secara performa lebih buruk daripada yang lainnya.

Nah, kalau misalkan kita formulasikan ini sebagai problem bandit dengan menggunakan algoritma UCB misalnya, maka sistem akan secara otomatis meng-assign user ke varian yang mempunyai performa yang paling bagus. Tanpa harus menunggu A/B test-nya selesai sehingga total cumulative reward yang dikumpulkan di akhir jauh lebih tinggi.

Lalu apakah dengan adanya bandit algorithm maka A/B testing jadi obsolete? Tentu saja tidak, karena keduanya memiliki tujuan yang berbeda. Berikut wejangan dari om Chris Stucchio.

conclusions

File eksperimen di atas bisa ditemukan di link berikut: https://github.com/mitbal/sidu/blob/master/bandit.ipynb

Selamat mencoba. Semoga berguna. Salam.

learning machine learning

book background

*Tetot* mengulang kata learning…

Di era informasi seperti sekarang ini, ada banyak sekali resource untuk belajar machine learning yang tersedia di internet. Mulai dari video lecture di youtube, kuliah online, artikel web, buku, dll. Hal ini tentunya sangat membantu bagi orang yang hendak belajar machine learning dari awal tanpa perlu mengeluarkan biaya sepeserpun (kecuali mungkin pulsa dan kuota data, yang bisa dibeli di traveloka dulu https://www.traveloka.com/connectivity/paket-internet)

Bingung memilih materi yang cocok untuk dipakai belajar? Post kali ini akan memberikan sedikit rekomendasi untuk memilih materi terbaik dari semua materi yang tersedia di internet.

Berdasarkan hasil diskusi dengan teman dan kolega kerja saya, 4 dari 5 data scientist  merekomendasikan 3 online course berikut:

  1. Udacity Intro to Machine Learning. Course yg diajar oleh Sebastian Thrun ini, berdasarkan pengakuan teman, saya lebih condong dalam aplikasi machine learning di berbagai bidang yang di-solve menggunakan open source library semacam sklearn. Cocok untuk pemula yang mungkin belum pernah mendapatkan kuliah tentang machine learning.
  2. Coursera Machine Learning. Course legendaris dari Andrew Ng ini akan menjelaskan intuisi dari berbagai algoritma ditambah implementasinya, seperti logistic regression, sehingga kita bisa dapat gambaran kenapa suatu algoritma bisa bekerja tanpa terlalu dikaburkan oleh turunan matematikanya.
  3. edX Learning from Data. kalau yang ini, berdasarkan testimoni yang sudah mengambil, sangat sarat dengan derivasi matematika dengan tingkat kesulitan tugas yang lumayan tinggi karena memang diambil dari course sungguhan di CalTech. Sangat disarankan kalau memang ingin mendalami lebih jauh secara teoritis algoritma machine learning.

Kalau setelah mengambil ketiga course di atas kita ingin mendalami lebih lanjut bagaimana machine learning digunakan ke spesifik bidang aplikasi, misal untuk bidang computer vision maka bisa dilanjutkan ke cs231n, yang diajar langsung oleh Andrej Karpathy. Sedangkan untuk natural language processing, bisa dilanjutkan ke cs224n.

Kalau misalkan ingin melanjutkan mendalami spesifik ke deep learning, kelas algoritma yang lagi hangat-hangatnya, maka resource yang bisa digunakan adalah buku deep learning yang ditulis oleh Ian Goodfellow dan Yoshua Bengio (http://www.deeplearningbook.org/).

Nah, kalau misalkan sudah mendapat basic fundamental pemahaman machine learning yang cukup lewat course di atas, langkah selanjutnya yang bisa dilakukan adalah keep up dengan hasil perkembangan riset terbaru, apalagi untuk bidang deep learning yang sekarang sedang pesat-pesatnya.

Cara pertama menurut saya adalah dengan me-follow akun twitter dari researcher-researcher machine learning itu sendiri. Mereka sering berdiskusi dengan semangat apabila ada hasil terbaru dari paper yang mungkin kontroversial. Kekurangannya mungkin ada bakal ada sesekali bahasan yang tidak masuk ranah machine learning sama sekali, seperti kondisi politik Amerika Serikat. Untuk rekomendasi akun twitter apa saja yang menarik untuk di-follow, bisa refer ke thread ini.

Selain itu, komunitas yang paling aktif untuk berdiskusi menurut saya adalah di reddit.com/r/machinelearning. Banyak thread-thread menarik yg membahas mengenai artikel terpopuler, paper terbaru, bahkan drama dan gosip terhangat di ranah machine learning itu sendiri. Orang-orang besar dan berpengaruh di machine learning juga suka nimbrung di diskusinya. Bahkan Google Brain sudah dua kali mengadakan AMA di sini. Secara user, r/ml ini lebih spesifik dari hacker news dan format diskusinya lebih cocok menurut saya kalau dibanding quora. Tentu saja, yang namanya forum internet pasti ada saja sekumpulan troll yang suka ngomong seenak udel, mengganggu ketentraman dan jalannya diskusi. Tapi, dengan method upvoting/downvoting dan active moderation, gejalanya bisa ditekan, dan diskusi bisa berjalan dengan lancar.

Kalau mau benar-benar update, teman-teman bisa subscribe di arxiv (https://arxiv.org/help/subscribe), tempat di mana researcher mengunggah paper mereka sebelum nantinya muncul di conference top machine learning macam NIPS dan CVPR (perhatikan karena rate progress yang sangat kencang, publikasi di jurnal tidak menjadi pilihan utama, karena pada waktu artikel ter-publish 6 bulan kemudian bisa jadi ide-nya sudah kadaluwarsa).

Demikian, semoga bermanfaat. Happy learning machine learning…

tips jalan-jalan

compass.PNG

Post kali ini saya ingin membagi tips (based on true story) kepada teman pembaca yang budiman yang mungkin hendak melakukan perjalanan ke luar negeri.

Tips navigasi

Apakah Anda tipe orang yang suka nyasar kalau jalan sendiri dan sangat mengandalkan Google Maps untuk bernavigasi dalam menemukan tempat tujuan Anda? Sayangnya di luar negeri Anda tidak bisa sepenuhnya memakai Google Maps karena dibatasi roaming yang mahal untuk menggunakan paket data internet.

Salah satu solusi yang bisa digunakan agar Anda tetap bisa menggunakan Google Maps adalah dengan men-download offline maps. Karena GPS tidak membutuhkan koneksi internet (hanya butuh satelit), maka kita tetap bisa bernavigasi dengan bebas dengan melihat posisi kita sekarang di peta, dan bisa kira2 dalam mencari arah untuk mencapai tempat tujuan. Kekurangannya kita tidak bisa menggunakan fitur search untuk mencari lokasinya.

offline maps
Buka apps Google Map di hape Anda dan pilih menu offline maps

Solusi lainnya mungkin bisa beli prepaid sim card atau sewa wifi router di traveloka dulu https://www.traveloka.com/en/connectivity/internet-luar-negeri karena selain masalah navigasi, ini juga menyelesaikan masalah komunikasi.

Tips keuangan

Pernahkah anda berada dalam skenario berikut ketika berjalan2 bersama teman2 Anda: Ada sesuatu hal yang butuh dibayar uang bersama, entah itu makan, beli oleh2, atau sekedar bayar parkir. Untuk mempermudah saat membayarnya, biasanya ada 1 orang yang menomboki bayar terlebih dahulu yang kemudian akan diganti nantinya.

Setelah jalan2 berakhir, barulah dilakukan hari perhitungan, di mana semua pengeluaran tersebut dihitung berdasarkan siapa yang mengeluarkan berapa. Perhitungan ini bisa sangat rumit dan membutuhkan waktu hingga seharian penuh dan juga PhD di bidang matematika. Apalagi kalau jumlah partisipan jalan2nya banyak dan melibatkan lebih dari 1 jenis mata uang.

Ucapkan selamat tinggal pada problem di atas karena sekarang sudah ada splitwise, aplikasi gratis (tersedia versi web, android, dan ios) yang berguna untuk mencatat semua pengeluaran.

splitwise.png

Selain itu dengan splitwise, kita melakukan democratization pada masalah keuangan jalan2, karena tidak perlu lagi ada peran bendahara yang tugasnya pusing menghitung semua pengeluaran bersama. Setiap orang (dalam satu grup yang sama) apabila merasa mengeluarkan uang untuk kebutuhan bersama dapat langsung mendaftarkan pengeluarannya di splitwise.

Lebih hebatnya lagi adalah fitur simplify debt. Dengan ini, kalau A hutang ke B, dan B hutang ke C, setelah di-simplify maka A cukup membayar sekali ke C. Praktis dan simpel bukan?

Penutup

Sekian tips yang bisa saya bagi. Teman pembaca ada saran yang lainnya?

Selamat jalan-jalan, semoga menyenangkan.

ml hands-on

handson

Pada post kali ini, saya ingin membagi sebuah contoh hands-on machine learning, yang kebetulan saya juga pakai untuk mengisi materi workshop Machine Learning dan Data Science di IT Del, Sumatera Utara beberapa bulan yang lalu bersama teman kantor saya.

Hands-on ini ditulis menggunakan bahasa python dengan library tambahan antara lain numpy, matplotlib, scikit-learn, dan jupyter notebook. Library bisa diinstal manual lewat pip atau anaconda.

Data yang akan dipakai adalah data gambar digit hasil scan-an pemilu yang sebelumnya pernah dijelaskan di post ini: https://mitbal.wordpress.com/2014/10/10/pemilu-presiden-indonesia-2014-pendekatan-pembelajaran-mesin/

Untuk data bisa diambil di sini: https://www.dropbox.com/s/0nwm318mggmi3ww/11c_2000i.zip?dl=0. Silakan unduh dan ekstrak di lokal komputer masing-masing.

Untuk link ke notebook nya sendiri bisa dilihat di sini: https://github.com/mitbal/itdel/blob/master/handson.ipynb

Hands-on ini diharapkan dapat memberikan gambaran mengenai tipikal workflow machine learning. Tentu saja akan ada perbedaan untuk problem yang berbeda, misalkan data preparation yang tergantung format datanya, fase feature engineering yang problem-dependent, begitu juga dengan skema evaluasinya.

Kalau viewer-nya tidak bisa dibuka, bisa coba unduh langsung source code-nya di, nanti di komputer lokal Anda cukup panggil jupyter notebook handson.ipynb maka notebook akan terbuka di browser Anda masing-masing (asal library nya sudah terinstal semua).

Selamat bereksperimen.

 

tmux

fallout

Zaman dahulu kala, saya pernah menuliskan artikel mengenai kegunaan GNU Screen sebagai cara untuk menjalankan perintah di remote machine, yang jalan dengan waktu lama, tanpa harus selalu tersambung koneksi ssh-nya. Silakan ke link berikut untuk menyegarkan ingatannya kembali: https://mitbal.wordpress.com/2015/04/02/screen/

Ternyata, saya baru tahu ada alternatif lain yang lebih kekinian, yaitu tmux.

tmux ini lebih hip, karena usianya yang lebih muda dibandingkan dengan dengan GNU screen. Selain itu dia juga masih aktif dikembangkan, berbeda dengan screen yang development nya sudah tutup usia.

Untuk instalasi di sistem ubuntu cukup menjalankan sudo apt-get install tmux.

List lain mengenai perintah yang paralel antar dua program tersebut bisa dilihat di sini: http://www.dayid.org/comp/tm.html

Semoga bermanfaat.

kalor laten

frozen

Bayangkan eksperimen seperti berikut. Anda memiliki sebongkah es dengan suhu -20 derajat Celsius. Es tersebut Anda panaskan terus menerus sehingga suhunya pun naik, -19, -18, dan seterusnya hingga akhirnya mencapai suhu 0 derajat Celsius.

Akan tetapi setelah itu, apabila kita tetap memberikan panas terus menerus, maka kita akan menemukan bahwa suhu es tersebut tidak naik lagi, tidak berubah dan tetap di 0 derajat. Secara makroskopik pun kalau dilihat dengan mata telanjang mungkin tidak terlihat perubahan apa-apa. Dia tetap terdiam angkuh seakan kalor atau energi yang kita berikan hilang, tidak terpakai, terbuang sia-sia…

Akan tetapi kalau kita perhatikan lebih dalam ke level mikroskopik maka kita akan mendapati  bahwa molekul-molekul es tersebut sedang berusaha untuk melepaskan dirinya dari ikatan antar molekul satu sama lain agar dapat berubah wujud. Kalor yang digunakan untuk sebuah zat dapat berubah wujud dari satu fase ke fase berikutnya ini disebut kalor laten. Laten sendiri berarti tersembunyi, seperti yang biasa di pakai di frase bahaya laten komunis atau latent variable models.

Maka jika kita tidak berhenti memberikan kalor kepada es tersebut, terus diberikan usaha, niscaya suatu saat es tersebut pasti akan berubah wujudnya ke fase berikutnya, menjadi cair. Dan kita setelah itu kita terus memberikannya kalor, maka suhunya pun akan terus naik, dan naik, dan naik hingga saat perubahan bentuk berikutnya…

==========================================================================

Cerita di atas aslinya saya karang di tempat pada waktu hari perpisahan teman lab saya dulu (Halo Big). Sebenarnya ini terinspirasi setelah mendengarkan presentasi creative machine di kampus beberapa hari sebelumnya yang menggunakan istilah yang sama untuk menggambarkan progres dari computational arts. (Mungkin cocok juga untuk menggambarkan progres dari neural network ya, yang adem ayem beberapa dekade lalu langsung melesat tajam bagai meteor).

dancing_salesman_problem
Dancing Salesman Problem: salah satu karya dari komputer tersebut.

Sifat kalor laten tersebut saya analogikan seperti manusia. Terkadang kita merasa bahwa kita tidak mengalami perbaikan, tidak bertambah jago di bidang yang kita tekuni meskipun telah menghabiskan banyak waktu dan tenaga untuk menguasainya. Tidak ada hasil yang dicapai, tak ada prestasi yang diraih. Akhirnya kita merasa semua yang kita lakukan itu sia-sia belaka dan tidak ada artinya. Menyerah karena putus asa dan kehilangan harapan.

Tapi percayalah, seperti partikel es di 0 derajat, semua tenaga yang diberikan itu digunakan agar kita naik ke tahap selanjutnya. Jangan berhenti memberi usaha, jangan berhenti memberi tenaga untuk lebih baik lagi. Karena setelah lewat dari jatah kalor laten yang harus diberi, maka progres kita pun akan kembali melesak terus hingga kita menemui fase perubahan wujud selanjutnya.

Walau mungkin fase laten dari manusia jauh lebih banyak dari benda mati (yang dulu mungkin cuma didefinisikan 3 (padat, cair, gas) walau sekarang sudah bertambah plasma dan Bose-Einstein condensate).

Salam super.

tantangan

annapurna

Alkisah, di suatu negeri yang tidak jauh letaknya dan di masa yang tidak terlalu berbeda, hiduplah seorang karyawan berusia paruh baya. Karyawan ini tinggal bersama keluarganya yang terdiri dari 1 istri, 2 anak, laki-laki dan perempuan, serta kedua orang tuanya. Ia selalu merasa bahwa rumah yang ditinggalinya itu sempit sekali dan sangat penuh sesak dengan keluarganya. Hal ini membuatnya merasa bahwa hidupnya sangat tidak enak dan tidak nyaman. Ia pun suka mengeluhkan keadaannya  ini kepada teman-temannya.

Salah satu temannya kemudian menyarankannya untuk menemui seorang pertapa bijak yang tinggal di lereng gunung, untuk meminta petunjuk dan nasihat. Karena merasa sudah muak dan hampir putus asa, maka ia pun menuruti nasihat temannya dan berangkat untuk menemui guru bijak tersebut.

Sesampainya di rumah guru tersebut, ia pun segera menceritakan keadaannya kepada pertapa bijak itu. Setelah mendengarkan cerita karyawan tersebut dengan seksama, orang bijak itu pun berkata, “Peliharalah ayam di dalam rumahmu, kemudian kembalilah setelah satu minggu.” Karyawan itu terbelalak, mukanya tercengang, tidak mempercayai suara yang didengarnya. Namun karena nyaris putus asa, dan membaca review bagus orang-orang yang pernah ditolong guru bijak tersebut di sebuah forum internet, ia pun beranjak pulang meski pikirannya masih penuh tanda tanya. Meskipun enggan, ia tetap menuruti perintah dari sang guru.

Setelah satu minggu karyawan tersebut kembali menemui sang guru bijak. Mukanya pucat seakan baru disiksa sebagai tawanan perang. Alih-alih prihatin kepada kondisi baru karyawan ini, sang guru malah berkata “Sekarang peliharalah kambing di dalam rumahmu. Datang kembali ke sini setelah satu minggu.” Sang karyawan hanya bisa terkejut, lalu melangkah gontai untuk pulang.

Satu minggu kemudian sang karyawan datang kembali dengan muka hampa, tatapannya kosong. “Sekarang pelihara jugalah seekor sapi di dalam rumahmu.” Ujar sang guru. “Pulanglah, kemudian datang kembali 1 minggu lagi.” Tanpa perlawanan, sang karyawan pun pulang.

Satu minggu kemudian karyawan itu datang kembali ke guru pertapa. Merasa tidak kuat lagi, ia pun akhirnya curhat kepada sang guru. “Guru, saya tidak sanggup lagi. Rasanya seperti mau mati. Hewan-hewan tersebut membuat kegaduhan yang bukan main. Kotorannya tersebar di mana-mana. Ampun guru, jangan siksa saya lagi. Bebaskan saya dari penderitaan ini…”

“Baiklah, sekarang keluarkan ayam dari rumahmu lalu kembali lagi satu minggu kemudian.” Terbersit sesimpul kecil senyuman di wajah karyawan itu. Dia pun mengucapkan terima kasih kepada guru, dan bergegas pulang.

Satu minggu kemudian karyawan itu datang kembali dengan raut muka yang lebih ceria. “Baiklah, sekarang keluarkan kambing dari rumahmu lalu kembalilah satu minggu kemudian”. Tak dapat wajahnya menyembunyikan pendar kegembiraan mendengarkan perintah tersebut.

“Baiklah, sekarang kamu bisa keluarkan sapi dari rumahmu. Kembali lagi ke sini satu minggu lagi”. Tampak senyumannya mengembang lebar.

Tepat satu minggu kemudian, karyawan itu kembali menemui guru bijak. “Terima kasih banyak, sekarang hidup saya jauh lebih tenang dan lebih baik. Terima kasih sekali lagi atas saran dan bantuannya, Guru.” Ujar karyawan tersebut dengan mata berbinar-binar…

==========================================================================

Kurang lebih begitulah cerita dari buku yang dulu pernah saya baca tapi lupa judulnya karena sudah kelewat lama. Walau kata-katanya tidak persis sama, kira-kira ide yang ingin disampaikan tetap sama.

Moral cerita yang bisa diambil tentunya adalah bahwa kesusahan itu sebenarnya cuma keadaan pikiran kita saja. Secara fisik, tidak ada yang berubah dari kondisi karyawan tersebut sebelum dan sesudah dia menjalani “pelatihan” dari sang guru. Rumah yang ditinggalinya masih mempunyai ukuran yang sama, dan ditinggali oleh orang-orang yang sama juga. Yang berbeda adalah kondisi mental atau pikiran dari karyawan itu.

Saya pribadi punya interpretasi yang sedikit berbeda dari cerita di atas. Kalau menurut saya, intinya adalah tantangan. Kalau kita merasa kondisi kita susah, berarti kita bisa menantang diri kita untuk mengerjakan hal yang lebih sulit lagi. Sebagai contoh, kalau kuliah 18 SKS terasa susah, maka coba ambil 21 SKS. Yang 18 SKS tidak akan terasa susah lagi. 21 SKS kewalahan? Coba ambil 24.

Puasa 14 jam bikin lapar dan haus? Coba puasa 20 jam sambil olahraga berat sorenya. Bawa 1 galon aqua terasa berat? Coba bawa 2 galon. Pasti yang 1 galon akan terasa ringan. Dan terkadang kita akan terkejut melihat apa yang sebenarnya bisa kita raih.

Salam super

data driven

datadriven2

Beberapa saat yang lalu di salah satu saluran komunikasi kantor saya, terjadi perdebatan seru mengenai data driven company. Diskusi berkisar di definisi data-driven itu sendiri, apa manfaatnya, kenapa kita harus menjadi data-driven, dan bagaimana agar bisa menjadi data-driven company.

Sebelum kita membahas lebih lanjut mengenai data-driven, tentunya lebih baik untuk menyamakan persepsi terlebih dahulu mengenai definisi data-driven itu sendiri, karena tentunya masing-masing mempunyai definisinya sendiri. Berdasarkan Google (yang mengambil dari wikipedia), definisinya adalah sebagai berikut.

datadrivenyang kalau diterjemahkan secara bebas kurang lebih berarti mengambil keputusan berdasarkan data, bukan berdasarkan perasaan atau hanya mengikuti keputusan dari atasan atau orang yang kedudukannya lebih tinggi. Kalau ada sesuatu yang hendak diputuskan, terlebih dahulu cari data atau lakukan eksperimen.

Dalam konteks technology company, biasanya data-driven diwujudkan dalam bentuk A/B testing. Misalkan kita ingin tahu apakah tombol berwarna merah atau hijau yang lebih meningkatkan sales. Kita bagi dua saja dua saja traffic yang masuk ke 2 versi website dengan warna tombol yang berbeda. Setelah terkumpul jumlah sampel yang cukup, kita lakukan statistical test dan lihat versi mana yang lebih bagus. Bukan langsung memilih warna merah karena itu warna kesukaan boss kita.

Namun menurut saya sendiri, definisi data-driven yang paling pas itu yang diinspirasi dari bayesian method.

posterior belief is proportional to prior belief times likelihood.

Jadi keputusan yang kita ambil jadinya adalah kombinasi dari prior belief kita, hal yang kita sendiri percayai tanpa melihat data terlebih dahulu (walaupun sebenarnya ini adalah bentuk internalisasi semua kumpulan data yang pernah kita alami sebelumnya), kemudian di-update dengan hasil atau data terbaru yang sesungguhnya terjadi.

Bagaimana prakteknya? Mari kita ambil contoh Zlatan Ibrahimovic yang kini membela Manchester United.

ibrahimovic-ke-mu-730x480_c
Zlatan dengan kaus MU

Prior belief itu berguna agar kita tidak terlalu cepat mengambil kesimpulan dengan hasil/data yang masih sedikit. Kalau tanpa prior dan kita mengamati Zlatan tidak mencetak gol dalam 3 pertandingan terakhir, maka keputusan yang diambil adalah kita tidak memainkannya kembali untuk pertandingan berikutnya. Padahal kalau kita lihat rekam jejaknya, Ibra bisa mencetak di lebih dari 30 pertandingan sepanjang musim. Dengan prior belief ini seharusnya kita tetap memainkan Zlatan untuk pertandingan berikutnya.

Nah, tapi kalau misalkan hingga 35 pertandingan ternyata Zlatan tidak bisa mencetak gol sama sekali, maka kita sudah mempunyai observasi atau data yang cukup (the likelihood term). Maka keputusan yang tepat mungkin adalah tidak memainkan Ibra kembali.

(Untuk yang familiar dengan teknisnya, kita bisa modelkan peluang Zlatan mencetak gol diambil dari binomial distribution, dan memiliki conjugate prior beta distribution dengan alpha dan beta bisa diambil dengan jumlah pertandingan yang di mana Zlatan mencetak gol di musim sebelumnya) .

(Ini hanyalah contoh belaka, bukan jinx. Penulis sangat berharap Zlatan bisa mencetak banyak gol sehingga MU bisa meraih gelar juara Liga Premier musim ini dan Liga Champion musim depan. GGMU)

Bagaimana contohnya di kehidupan nyata? Misalkan kita mau pasang iklan di berbagai website untuk mempromosikan produk kita. Berdasarkan data dari similarweb kita tahu website mana saja yang mempunyai traffic tinggi. Kita kemudian bisa memasang di beberapa website yang memiliki traffic tinggi. Akan tetapi, setelah beberapa saat kita bisa evaluasi iklan dari website mana yang sebenarnya berhasil meningkatkan metrik penjualan kita. Kira-kira begitu.

Happy data-driving.

git

Theory…

Duluu (sekali) saya pernah menulis sedikiit (sekali) tentang cara pakai mercurial. Karena sekarang saya lebih sering pakai git di tempat kerja saya, maka saya menulis post ini dengan harapan agar tidak cepat lupa dengan perintah-perintah yang biasa dipakai di git dan kalaupun lupa cukup baca satu halaman ini saja biar cepat ingatnya. Tapi sebelum itu mungkin saya kasih sedikit cerita mengenai apa sih sebenarnya git itu?

Sebenarnya tujuan version control system (VCS) software seperti git dan kawan-kawannya itu intinya ada 2. Pertama untuk mengatasi masalah versioning. Dulu pasti pernah kan bikin laporan, terus diberi nama final di nama file-nya. Eh tapi tahunya dari dosennya disuruh ada revisi, yang ternyata tidak ada habis-habisnya, sehingga kita terpaksa membuat banyak file yang dinamai dengan “final rev1”, “final rev2”, “final final” dan seterusnya. Nah dengan VCS ini seharusnya kita cukup punya satu file saja, tapi seluruh sejarah revisi yang dilakukan tetap tersimpan sehingga kita bisa balik ke revisi yang sebelumnya kapan saja (Fitur ini juga ada sih di Microsoft Word, tapi kayaknya enggak banyak yang pakai).

meme
Kalau file dokumen atau kode tidak pakai version control system jadinya bisa seperti ini.

Problem kedua yang berusahan dipecahkan adalah tentang collaborative work. Misalkan kita dan teman kita mau menulis di file yang sama (tapi beda posisinya di dalam file, satu di bagian awal, dan satunya lagi di bagian akhir). Dengan VCS, hasil kerja kita akan digabung secara otomatis dengan kerjaan teman kita. Daripada saling kirim-kiriman email terus lupa file yang mana yang versi terbaru yang akibatnya kerjaan kita bisa hilang atau tertimpa dengan kerjaan teman kita. Salah satu kelemahan dari VCS mungkin adalah dia hanya men-support file dengan format text saja, tidak bisa binary seperti gambar atau video.

Zaman dahulu kala, VCS yang berkuasa adalah subversion. Ini saya pernah pakai waktu kerja praktik. Bedanya dengan git dan mercurial adalah sifatnya yang centralized. Artinya repository-nya sebenarnya hanya ada di satu server, dan setiap kita mau kerja, kita ambil semua file versi terbaru dari server. Ketika kita melakukan edit pada file dan ingin komit, maka kita juga harus mengirim commit-annya ke server tersebut. Akibatnya apabila server-nya mati, atau kita tidak ada akses ke sana (no internet), maka kita tidak bisa kerja sama sekali. Selain itu, menariknya adalah kalau kita mau commit, maka harus cepet-cepetan sama teman kita, karena kalau keduluan maka kita harus fetch, merge, terus commit lagi.

(Sedikit nostalgia. Dulu repository subversion tempat saya menaruh tugas kuliah itu di-host di Google Code yang sekarang sayangnya sudah tutup. Google memang suka resek, punya kebiasaan menutup service secara mendadak (halo Reader, Wave), . Jadi Jangan heran kalau 5 tahun lagi Google+ juga bisa saja ditutup.)

Git dan Mercurial sendiri tergolong ke distributed VCS. Ini artinya setiap kopi repository git merupakan exact copy dari yang ada di server. Kita bisa commit, checkout ke versi sebelumnya, dll, cukup dari repository lokal kita. Kelemahannya adalah di awal proses checkout (atau clone dalam istilah git) itu bisa lama sekali karena semua sejarah commit dari awal sampai akhir bakal dikopi. Untuk repository yang sudah punya sejarah panjang, ukurannya bisa mencapai Gigabyte!

Kalau git sama mercurial (hg) sendiri apa bedanya? Hmm, in general, keduanya memiliki kapabilitas yang sama.  Tinggal tergantung selera kita masing-masing, sama seperti banyak hal lain di komputer (vim vs emacs, tabs vs spasi, dll). Kalau dulu waktu kuliah saya sebenarnya sih lebih suka mercurial, karena repo-nya bisa diakses menggunakan http dari jaringan internet kampus (host di bitbucket) sedangkan git hanya bisa lewat ssh (host di github). Tapi sekarang git sudah bisa http, dan bitbucket sudah bisa host git. Jadi rasanya tidak ada perbedaan yang terlalu berarti.

…and Practice

Oke, kita langsung masuk saja ke cara menggunakan git, untuk basic workflow yang sederhana. Akan ada sedikit penjelasan untuk tiap command-nya biar enggak kayak komik di bawah ini. Sebenarnya untuk bisa berfungsi normal dalam kehidupan sehari-hari cuma sedikit kok command git yang harus dihafal dan dimengerti. Untuk kasus-kasus unik dan menantang bisa diselesaikan dengan bertanya di stackoverflow atau senior programmer di kantor masing-masing.

git
Classic xkcd. Tapi sarannya valid lho, ultimate solution-nya ya memang clone ulang dari awal.

> Pertama, ya instalasi. Kalau di ubuntu gampang tinggal jalanin ini di terminal:

sudo apt-get install git

Kalau Windows dan lainnya bisa lewat installer dari situs resminya https://git-scm.com/downloads.

> Kemudian, setup nama dan email. Cukup sekali di awal.

git config --global user.name "Muhammad Iqbal Tawakal"

git config --global user.email mit.iqi@gmail.com

Tentunya sesuaikan dengan nama dan email masing-masing ya.

> Setelah itu tinggal buat repository baru dari dalam sebuah folder

git init

Atau ambil dari repo yang sudah ada

git clone <repo_address> <target_directory>

> Commit time

Bisa dibilang ada beberapa tingkatan level file di dalam git. Pertama untracked files. Ini adalah file yang tidak di-track oleh git, namun ada di dalam direktori repository. Sebaiknya, semua file yang penting itu di-commit dan sisanya yang tidak penting (temporary files, output log) itu di-list di dalam file .gitignore. Gunakan git add <filename> untuk memasukkan untracked file ke staging area. Apabila file-nya sudah di-track, tapi isinya sudah diubah dari yang terakhir di-commit, itu termasuk ke uncommitted changes. Ini juga bisa dimasukkan ke staging area dengan perintah yang sama.

Semua file yang ada di staging area ini akan di commit ke dalam repository kalau kita menggunakan perintah git commit. Tambahkan parameter -m kalau kita ingin memberikan pesan komit dalam satu baris. Kalau tanpa -m maka git akan membuka text editor di terminal (seperti vim), terus kita harus memasukkan pesan kita di dalamnya. Save file untuk melanjutkan commit. Ilustrasinya bisa dilihat di bawah.

git stages 1
The many (faces) stages of git.

Nah gimana kalau kita berubah pikiran dan mau pindah dari stage atas ke bawah? Sebenarnya git akan memberikan petunjuk kalau kita ketik git status, tapi untuk gampangnya bisa dilihat di gambar berikut. Intinya reset dari staging ke uncommited, dan checkout dari uncommitted changes ke versi commit-annya yang terakhir.

git stages 2
Kebalikannya.

Kenapa modelnya seperti ini? Harus di-add setiap mau commit? Jadi sebuah commit itu sebaiknya adalah 1 self-contained logical changes. Jadi kalau misalkan banyak file yang berubah sejak commit terakhir, kita supervisi sendiri mana file yang akan di-commit dan mana yang tidak, atau nanti dimasukkan di commit yang berbeda. Ini menjaga agar kita tidak (secara tidak sengaja) memasukkan file yang tidak ada hubungannya dengan apa yang sebenarnya mau kita commit. (Di mercurial, setiap commit akan memasukkan semua file yang berubah dari sejak terakhir commit).

Selain itu sebaiknya tiap commit itu tidak mengandung error. Kalau hal terakhir ini sebenarnya bisa di-enforce dengan menggunakan static code analysis tools seperti linter atau dengan code-review dan automatic testing. Mungkin bisa dibahas di post-post berikutnya.

Sedikit tambahan lagi. Untuk melihat apa yang berubah antara files di uncommitted changes dengan versi originalnya di committed revision bisa dengan perintah git diff. Untuk melihat status dari setiap file (sedang berada di stage mana) bisa menggunakan git status. Untuk melihat daftar commit apa saja yang sudah diperbuat, gunakan perintah git log.

And that’s it! That’s all you ever need to know if you want to use git all by yourself on a single machine for versioning. Of course, git offers more features than just for this kind of usage. Keep reading if you’d like to indulge yourself more in the world of git.

> Branching

Branching, atau percabangan, adalah salah satu fitur andalan git agar proses development kita bisa lebih bersih lagi dari error. Gambar di bawah menunjukkan skema branching yang lazim dipakai untuk suatu proses development software. Ada satu branch utama, bernama master, yang berisi kode yang siap release ke production. Active development dilakukan di branch develop yang secara berkala akan di merge ke branch master ketika sudah siap.

branch
Typical development branch. Gambar dikopi dari slide tech talk Salestock.

Setiap kita hendak mengimplemen fitur baru, maka kita buat branch baru dengan nama fitur tersebut yang baru akan kita merge ketika implementasinya sudah selesai. Hal ini akan membuat proses development menjadi lebih rapi, karena semua logical changes dan commit yang memang khusus untuk fitur itu saja terisolasi di dalam satu branch, dan tidak mengganggu developer lain yang hendak mengimplementasi fitur lain.

Perintah git branch akan memunculkan semua nama branch yang ada di repo kita. Kalau kita mau buat branch baru, gunakan perintah git checkout <hash_commit/another_branch_name> -b <new_branch_name> atau hilangkan commit hash kalau kita mau bikin branch baru dari HEAD (HEAD ini menunjuk ke commit atau branch yang sedang aktif di workspace). Kalau mau berpindah-pindah branch, cukup ketik git checkout <branch_name>. Branch yang lama dapat dihapus dengan cara git branch -d <branch_name>.

> Collaborative Work

Sekrang kita akan membahas satu fitur terpenting lainnya dari VCS, yaitu untuk bekerja secara kolaborasi. Pejamkan mata Anda dan bayangkan skenario seperti berikut. Ada satu repository yang terletak di server origin, yang dulu dikerjakan oleh Misty, dan 2 orang developer baru, Ash dan Brock, yang akan melanjutkan pekerjaan yang dahulu sempat terhenti.

git awal
Phase 1: Fresh from the server.

Pertama, Ash dan Brock meng-clone repo tersebut ke laptop mereka masing-masing sehingga sekarang mereka mempunyai complete copy dari repository tersebut. Ash kemudian menambahkan fitur baru dan meng-commit-nya. Agar kerjaannya itu bisa dipakai orang lain, maka Ash melakukan push perubahannya kembali ke origin server dengan melakukan git push origin master.

git tengah
Phase 2: After push

Brock juga tak mau kalah dengan Ash dan juga menambah fitur baru yang berbeda. Namun ketika dia hendak mem-push commit-nya, server origin menolak karena Ash sudah lebih dulu melakukannya. Yang Brock harus lakukan adalah mengambil commit-nya si Ash dan menggabungkannya dengan commit-nya.

git tengah 2
Phase 3: Merging

Perintah yang digunakan untuk mengambil commit baru dari server adalah git fetch. Setelah fetch ada 2 opsi yang bisa dipilih, merge atau rebase. git merge akan menggabungkan 2 commit yang berbeda menjadi dengan membuat commit baru. Sedangkan git rebase akan meng-apply commit kita ke atas commit yang satunya. Sebenarnya ada shortcut yang bisa dipakai, untuk fetch+merge, bisa menggunakan git pull. Sedangkan untuk fetch+rebase bisa menggunakan git pull --rebase.

git akhir
Final phase: Teamwork is beautiful, isn’t it?

Setelah itu Brock bisa mencoba melakukan push lagi dan kali berhasil sehingga  Akhirnya server origin menjadi berisi commit dari 2 orang tersebut, dan siap untuk di-clone orang berikutnya yang akan melanjutkan pekerjaan mereka berdua.

> Tips and Trick

Untuk mempersingkat penulisan beberapa command yang sering dipakai, biar lebih menghemat keystroke dan juga umur, gunakanlah perintah alias. Hasilnya juga jadi lebih mirip command di hg. Misalkan untuk 2 perintah yang paling sering digunakan.

git config --global alias.ci commit

git config --global alias.st status

Kalau yang ini rekomendasi saya untuk dipakai melihat commit tree dalam bentuk grafik di dalam terminalnya langsung. Akan sangat memudahkan untuk mendapatkan mental image dari kondisi repositori sekarang. Apalagi kalau branch-nya sudah banyak dan rumit.

git config --global alias.tree "log --graph --decorate --oneline --all"

Untuk melihat semua shortcut (plus informasi lainnya) bisa dengan:

git config --list

Untuk dokumentasi yang lebih lengkap, dan berisi semua hal yang bisa diketahui dari git, bisa lewat buku progit yang kebetulan full version-nya dibuka di sini: https://git-scm.com/book/en/v2

Kalau butuh visualisasi lebih mendetail untuk operasi-operasi git lainnya, bisa ditilik di tautan berikut: http://marklodato.github.io/visual-git-guide/index-en.html

Wah, jadinya panjang juga. Demikianlah, semoga berguna.

Salam.