Workflow Prediksi Sonic DTC dan DTS dari data log Triple Combo
Ditulis bersama oleh Epo, Avi, dan Yogi
Halo rekan-rekan sekalian, apa kabar? Untuk yang belum dengar, saya memiliki kabar gembira. Bersama Kapten Epo Kusumah dan rekan Yogi Pamadya, kami meraih peringkat kelima dan berhak mengklaim hadiah dalam kompetisi SPWLA Petrophysical Data-Driven Analytics Contest!
Kami memang cuma meraih peringkat kelima dari kompetisi yang relatif segmented. Tetapi, kami merasa cukup bangga karena rupanya Top 5 kompetisi dihuni oleh peneliti-peneliti dari program studi geosains top dunia seperti UT Austin yang bekerja bersama idola kami Associate Professor Michael Pyrcz (Peringkat 1) dan Colorado School of Mines (Peringkat 3), hingga peneliti PhD dari Schlumberger (Peringkat 2).
Jadi, untuk sebuah grup serabutan paruh waktu yang terdiri dari seorang dosen sebuah Universitas di bilangan Jakarta plus dua pegawai perusahaan tech ojek online yang terkadang dikejar deadline, I’d say it’s pretty neat 😝
Sebetulnya workflow ini telah kami jabarkan sedikit dalam submission kami. Tetapi penjabaran tersebut ditulis dalam Bahasa Inggris, dan rupanya ada beberapa attachment gambar yang tidak dapat ditampilkan.
Post ini adalah tulisan ulang penjabaran tersebut dalam Bahasa Indonesia, dengan detil lebih di beberapa bagian. Selain itu, saya tidak akan terlalu berkutat pada kode, tetapi lebih kepada rationale dari cara kerja yang kami pilih. Saya juga mencoba menjelaskan beberapa istilah dasar buat pembaca yang awam terhadap geosains.
Disclaimer penting: kurva DTC dan DTS yang kami hasilkan dioptimisasi untuk memberi hasil terbaik pada penilaian lomba. Sehingga (seperti selayaknya analisis petrofisika), aplikasi pada kasus yang berbeda pasti membutuhkan penyesuaian. Bisa saja ada feature-feature atau algoritma yang lebih baik untuk kasus yang berbeda. Yuk, langsung saja kita bahas!
Tentang Kompetisi SPWLA PDDA
Karena alasan operasional atau keuangan, terkadang data Sonic log — baik compressional travel time (DTC) maupun shear travel time (DTS) — tidak diambil dalam kegiatan pengambilan data log sumur migas. Padahal, data sonic cukup penting untuk pengambilan keputusan, terutama terkait dengan geomekanika reservoir dan lubang bor. Nah, SPWLA (sebuah organisasi keprofesian global di bidang analisis log sumur) melihat suatu celah dimana pendekatan analisis data dan (wait for it… 😩) machine learning mungkin dapat digunakan untuk mengisi kekosongan ini.
Peserta diberikan data log sumur quad combo dari suatu sumur (Sumur #1), yang kemudian digunakan untuk melakukan prediksi DTC dan DTS pada sumur lain (Sumur #2) yang hanya memiliki data triple combo.
Untuk pembaca yang awam, dalam pemboran sumur migas, operator melakukan pengambilan data sumur (“logging”) yang menggunakan prinsip-prinsip fisika seperti radioaktivitas, resistivitas, serta akustik. Pengambilan data ini umumnya dikerjakan oleh service company seperti Schlumberger, Baker Hughes, atau Halliburton, tempat kerja saya dahulu kala.
Nah, karena data log-log sinar gamma-resistivitas-porositas umumnya ditampilkan dalam tiga kolom, log tersebut diberi nama triple combo log. Jika ditambahkan data sonic (DTC, atau DTC dan DTS), umumnya data ditampilkan dalam empat kolom dan disebut quad combo log.
Data Sumur #1 dan #2 berasal dari dataset Volve yang dirilis oleh Equinor. Tetapi, panitia melakukan penyensoran data sehingga kita tidak tahu sumur mana yang digunakan dalam lomba, bahkan kedalaman pun disensor sehingga kita tidak tahu zona mana yang digunakan. Hal ini digunakan untuk memberikan level playing field baik pada peserta awam (seperti kami) maupun peserta yang sudah familiar dengan dataset Volve. Peserta juga hanya diperbolehkan menggunakan data dari Sumur #1 untuk melakukan training. Seperti kontes data science pada umumnya, dalam hal ini hasil prediksi peserta akan dinilai menggunakan metric Root Mean Square Error (RMSE). Semakin kecil RMSE, semakin baik.
Kerangka Model
Secara garis besar, gambar di bawah menjelaskan kerangka model yang kami gunakan dalam hasil akhir. Kami melakukan prediksi DTC dan DTS secara independen antara satu dan lainnya.
Apakah kami tiba-tiba sampai pada kesimpulan di atas? Oh tidak semudah itu Ferguso, langkah-langkah yang akhirnya kami ambil adalah hasil dari trial-and-error berbagai ide. Contohnya, kami sempat mencoba:
- Menghilangkan outlier dari data train setelah train-validation split,
- Menggunakan lebih banyak feature baru dalam prediksi DTC dan DTS
- Menggunakan DTC untuk memprediksi DTS
- Dan lain sebagainya…
Tetapi rupanya, langkah-langkah dalam gambar di atas menghasilkan nilai RMSE terbaik dalam leaderboard.
Feature Engineering
Berikut adalah opini saya mengenai kompetisi semacam ini. Scikit-learn
adalah sebuah package open source. Tim manapun dapat menggunakan algoritma yang sama, sehingga sangat mudah untuk mendapatkan hasil yang mirip-mirip. Sehingga, kita harus bergantung kepada feature engineering yang baik untuk meraih RMSE semaksimal mungkin!
Menurut saya, pengaruh dari algoritma prediksi yang digunakan tidak akan sesignifikan pengaruh dari feature engineering yang dilakukan oleh setiap tim. Dan di sinilah domain knowledge menjadi sangat penting dalam membangun model machine learning. Lalu, feature engineering apa saja yang kami lakukan?
Transformasi logaritma natural
Berdasarkan eksplorasi data log, kami menemukan bahwa beberapa log memiliki distribusi non-normal. Hal ini merupakan hal yang wajar, namun dapat mengurangi performa beberapa algoritma machine learning. Sehingga, kami memutuskan untuk melakukan transformasi logaritma natural kepada semua log, termasuk log DTC dan DTS.
Yup, sebenarnya model kami melakukan prediksi terhadap log(DTC) dan log(DTS), sehingga kami harus mengembalikannya menggunakan fungsi eksponensial. Praktek ini merupakan hal yang lumrah dalam kompetisi data science di platform seperti Kaggle, di mana kami mendapatkan banyak inspirasi untuk feature engineering.
Gambar di bawah menunjukkan kurva CNC (porositas neutron), sebelum dan sesudah transformasi logaritma natural. Transformasi ini membuat distribusi data terlihat lebih “baik” untuk dimasukkan ke dalam algoritma machine learning.
Feature baru
Kami membuat banyak feature baru berdasarkan hasil analisis log. Namun pada akhirnya, hanya beberapa feature baru yang dipakai dalam hasil akhir, yaitu litologi dan analisis petrofisika.
Fitur litologi yang kami gunakan pada dasarnya adalah sebuah crossplot NPHI-RHOB klasik yang umum digunakan dalam analisis petrofisika konvensional, namun kami terjemahkan dalam bentuk kode. Untuk pembaca non-geosains, crossplot ini menerjemahkan hubungan antara massa jenis dan porositas neutron batuan yang diukur oleh tool, menjadi jenis batuan antara batupasir (sandstone), batugamping (limestone), atau dolomit (dolomite). Hubungan ini adalah hubungan fisika (physics) karena tiap batuan memiliki massa jenis yang berbeda, bukan empiris dari pengambilan data lapangan.
Tiap-tiap service company memiliki crossplot-nya masing-masing terkait kalibrasi tool mereka. Namun perbedaannya tidak akan terlalu jauh, dan kami menggunakan crossplot berikut dari AAPG Wiki sebagai referensi.
Lalu bagaimana cara kami memformulasikannya dalam bentuk kode?
- “Gambar” matrix line sandstone, limestone, dan dolomite menggunakan dua titik koordinat yang disimpan dalam tuple. Kalau dihubungkan, dua titik akan membentuk suatu garis.
- Formulasikan sebuah masalah geometri sederhana berupa jarak antara titik observasi (NPHI, RHOB) terhadap garis yang dibentuk oleh dua titik pada Langkah #1. Matrix line dengan jarak terdekat dari titik observasi (NPHI, RHOB) adalah litologi dari formasi tersebut.
- Untuk keperluan algoritma machine learning, litologi yang didapat dari Langkah #2 kami encode dengan nilai DTC standar matrix.
Sulit dibayangkan? Gambar di bawah adalah representasi grafik dari langkah-langkah di atas, dengan data yang telah kami label litologinya secara otomatis. Terlihat bahwa titik-titik data di sekitar sandstone line berhasil kami labeli sebagai sandstone, dan seterusnya. Selain itu, apabila pembacaan gamma ray terlalu tinggi, kami tidak melabeli litologi dan langsung memberi label “shale”.
Selain feature litologi, kami juga membuat feature baru dari analisis petrofisika konvensional. Fitur yang digunakan dalam hasil akhir diantaranya adalah Porositas Total (PHIT), Porositas Efektif (PHIE), dan Saturasi Air (Sw). Sebetulnya kami juga sempat membuat fitur-fitur baru lainnya seperti mudcake/washout flag yang berhubungan dengan kondisi lubang bor, flag invasi lumpur pemboran yang diukur dari perbedaan medium dan deep resistivity, dan lain sebagainya. Namun rupanya, hanya fitur-fitur di atas yang membantu kami meraih skor lebih tinggi dalam leaderboard.
Train-Validation Split
Kami menggunakan pembagian 80:20 untuk train-validation split. Selebihnya, kami tidak terlalu banyak melakukan intervensi pada tahapan ini, kecuali menghilangkan nilai NaN dalam dataset. Rupanya, metode ini menghasilkan RMSE yang lebih baik daripada strategi kami sebelumnya, yaitu membersihkan data di bawah persentil 1 dan di atas persentil 99 dalam train data. Sebagai catatan, nilai-nilai ini kemungkinan disebabkan oleh error pada pengambilan data, karena banyak nilai yang tidak mungkin secara fisika (physically impossible) dalam dataset.
Aneh ‘ya? Sepertinya memang kurang intuitif, tapi mungkin saja ini adalah sebentuk bias-variance tradeoff. Ketika kami membersihkan data dari outlier, model yang dihasilkan akan memiliki bias rendah (lebih akurat) pada train data, namun memiliki variansi tinggi. Model menjadi terlalu spesifik pada data yang kita miliki, dan kurang dapat digeneralisir ke dataset baru.
Terlepas dari itu, ketika kami berdiskusi dengan suhu Muhammad Abduh seorang computer scientist yang tokcer, ia juga menyarankan kami menambahkan noise pada dataset. Hal ini lumrah dilakukan pada aplikasi yang lebih advanced, supaya model bisa lebih general. Yah, anggaplah dengan tidak menghilangkan outlier, kami membiarkan dataset tetap noisy…
(Sejujurnya saya pribadi kurang paham mengapa hal ini terjadi, jadi kritik, komentar, maupun hipotesis dari anda akan kami tunggu ya!)
Prediksi
Kami melakukan prediksi DTC dan DTS secara independen dalam hasil akhir. Metode ini menghasilkan RMSE lebih baik dibanding memprediksi DTC, kemudian menggunakan DTC hasil prediksi tersebut untuk memprediksi DTS (iya, kami sudah mencoba hal ini). Kemungkinan besar hal ini disebabkan karena compounding error: error prediksi DTC akan semakin diperbesar dalam prediksi DTS yang memiliki error-nya sendiri.
Selanjutnya, mengenai pemilihan algoritma yang kami gunakan, sepertinya akan berbeda dalam kasus-kasus yang berbeda. Kebetulan algoritma dan pilihan feature berikut-lah yang menghasilkan RMSE terbaik untuk tim kami. Satu hal yang patut dicatat adalah algoritma LightGBM keluaran Microsoft adalah algoritma yang relatif akurat dan sangat cepat dibanding algoritma lainnya.
Hal lain yang saya bingungkan secara pribadi (menurut saya ini adalah faktor keberuntungan) adalah preprocessing yang kami gunakan. Selain scaling atau normalisasi (sudah jamak, dan seringkali diperlukan), kami melakukan transformasi polinomial berderajat 2 (2nd degree polynomial) pada data. Menariknya, transformasi ini memberikan efek yang cukup signifikan pada RMSE.
Dalam regresi linear, 2nd degree polynomial transform akan memberikan prediksi non-linear pada model yang kita bangun. Kami tahu bahwa respon DTC dan DTS terhadap fitur yang kami gunakan tidaklah linear. Contohnya, peningkatan nilai DTS bisa terjadi secara non-linear ketika kita berpindah dari fast ke slow formation pada dataset.
Namun, dalam pemodelan akhir, kami menggunakan tree-based model (seperti LightGBM, XGBoost, Random Forest, dkk.), bukan regresi linear. Ada referensi yang menyatakan bahwa polynomial transform tidak berguna dalam tree-based model, karena pada akhirnya klasifikasi dilakukan secara non-linear juga oleh algoritma-algoritma tersebut. Namun kenyataannya, kami mendapat hasil yang lebih baik.
Berhubung saya pribadi kurang mengerti alasannya, lagi-lagi saya sangat menunggu kritik/komentar/hipotesis Anda ya.
Anyway, diagram berikut menunjukkan cara kami memprediksi DTC yang pada akhirnya menggunakan ensemble model. Namun sebenarnya, perbaikan dari model yang hanya menggunakan LightGBM tidak sesignifikan itu.
Dan berikut adalah skema model DTS yang tidak menggunakan ensemble.
Kesimpulan dan Saran (dan Pertanyaan!)
Yak, begitulah kira-kira workflow kami dalam mengerjakan prediksi DTC dan DTS untuk kompetisi SPWLA PDDA. Berikut kesimpulan dan saran yang dapat saya ambil dari proses tersebut:
- Prediksi DTC dan DTS dapat dilakukan dengan menggunakan data triple combo. Pemenang kompetisi berhasil meraih RMSE 12.34. Bisa dibilang, nilai ini cukup baik untuk kepentingan praktikal, apalagi kurva DTC-DTS tersebut dihasilkan tanpa biaya.
- Feature engineering lebih penting daripada pilihan algoritma yang akan digunakan.
- Domain knowledge sangat membantu kami dalam melakukan prediksi. Secara pribadi, kebetulan saya pernah menjadi log analyst dan sudah biasa melakukan analisis log. Saya juga cukup paham masalah-masalah dalam akuisisi, dan interaksi antara tool dan formasi batuan. Selain itu, Epo dan Yogi adalah lulusan-lulusan geosains kelas dunia.
- Dalam kompetisi, kita hanya diperbolehkan melakukan training dengan satu sumur. Hasil yang didapat bisa jauh lebih baik apabila kita memiliki train data sebanyak (misal) satu lapangan atau wilayah kerja.
- Prediksi semacam ini hanyalah awal. Infrastruktur data dan otomasi harus didesain sedemikian rupa sehingga model yang kita bangun dapat digunakan di dunia nyata.
- Terakhir, subsurface open data akan sangat mempercepat riset dalam bidang ini. Negara ini memiliki banyak talent di bidang data yang jauh, jauh lebih hebat daripada sekedar prediksi sederhana yang kami lakukan. Hal ini harus difasilitasi dengan keterbukaan data, karena bakat-bakat ini tidak kalah dengan peneliti-peneliti internasional.
Sedangkan, berikut adalah dua pertanyaan besar yang saya pribadi punya dan belum bisa terjawab:
- Apakah dengan membiarkan outlier, kami mendapatkan model yang memiliki profil bias-variance tradeoff yang lebih ideal dalam kompetisi ini?
- Apakah transformasi polinomial berpengaruh dalam model regresi tree-based?
Seperti biasa, kritik, komentar, saran, hipotesis, pertanyaan, maupun jawaban dari pertanyaan-pertanyaan pribadi saya sangat ditunggu. Terima kasih banyak!