Artikel ini adalah bagian kedua dari rangkaian empat bagian yang membahas cara memprediksi nilai umur pelanggan (CLV) menggunakan AI Platform (AI Platform) di Google Cloud.
Artikel dalam rangkaian ini meliputi:
- Bagian 1: Pengantar. Memperkenalkan CLV dan dua teknik pemodelan untuk memprediksi CLV.
- Bagian 2: Melatih model (artikel ini). Membahas cara menyiapkan data dan melatih model.
- Bagian 3: Men-deploy ke produksi. Menjelaskan cara men-deploy model yang dibahas di Bagian 2 ke sistem produksi.
- Bagian 4: Menggunakan Tabel AutoML. Menunjukkan cara menggunakan AutoML Tables untuk membangun dan men-deploy model.
Kode untuk menerapkan sistem ini ada di repositori GitHub. Rangkaian ini membahas fungsi kode dan cara penggunaannya.
Pengantar
Artikel ini membahas Bagian 1, yang membahas dua model berbeda untuk memprediksi nilai umur pelanggan (CLV):
- Model probabilistik
- Model deep neural network (DNN), salah satu jenis model machine learning
Seperti disebutkan di Bagian 1, salah satu tujuan rangkaian ini adalah membandingkan model ini untuk memprediksi CLV. Bagian rangkaian ini menjelaskan cara menyiapkan data, membangun, dan melatih kedua jenis model untuk memprediksi CLV, serta memberikan beberapa informasi perbandingan.
Menginstal kode
Jika ingin mengikuti proses yang dijelaskan dalam artikel ini, Anda harus menginstal kode contoh dari GitHub.
Jika Anda sudah menginstal gcloud CLI, buka jendela terminal di komputer untuk menjalankan perintah ini. Jika gcloud CLI belum terinstal, buka instance Cloud Shell.
Clone repositori kode sampel:
git clone https://github.com/GoogleCloudPlatform/tensorflow-lifetime-value
Ikuti petunjuk penginstalan di bagian Instal di file README untuk menyiapkan lingkungan Anda.
Persiapan data
Bagian ini menjelaskan bagaimana Anda bisa mendapatkan data dan membersihkannya.
Mendapatkan dan membersihkan set data sumber
Agar dapat menghitung CLV, Anda harus memastikan bahwa data sumber Anda berisi setidaknya hal berikut:
- ID pelanggan yang digunakan untuk membedakan masing-masing pelanggan.
- Jumlah pembelian per pelanggan yang menunjukkan jumlah yang dibelanjakan pelanggan pada waktu tertentu.
- Tanggal untuk setiap pembelian.
Dalam artikel ini, kita membahas cara melatih model dengan menggunakan data penjualan historis dari Set Data Retail Online yang tersedia untuk publik dari Repositori UCI Machine Learning.[1]
Langkah pertama adalah menyalin set data sebagai file CSV ke Cloud Storage.
Dengan menggunakan salah satu
alat pemuatan untuk BigQuery,
Anda kemudian membuat tabel bernama data_source
. (Nama ini bersifat arbitrer, tetapi kode di repositori GitHub menggunakan nama ini.) Set data
tersedia di bucket publik yang terkait dengan rangkaian ini dan telah
dikonversi ke format CSV.
- Di komputer Anda atau di Cloud Shell, jalankan perintah yang didokumentasikan di bagian Penyiapan file README di repositori GitHub.
Contoh set data berisi kolom yang tercantum dalam tabel berikut. Untuk pendekatan yang kami jelaskan dalam artikel ini, Anda hanya menggunakan
kolom tempat kolom Used ditetapkan ke Yes. Beberapa kolom tidak digunakan secara langsung, tetapi membantu membuat kolom baru, misalnya, UnitPrice
dan Quantity
membuat order_value
.
Digunakan | Kolom | Jenis | Deskripsi |
---|---|---|---|
Tidak | InvoiceNo |
STRING |
Nominal. Bilangan integral 6 digit yang ditetapkan secara unik untuk setiap transaksi.
Jika kode ini diawali dengan huruf c , berarti kode tersebut menunjukkan pembatalan. |
Tidak | StockCode |
STRING |
Kode produk (item). Nominal, bilangan integral 5 digit yang ditetapkan secara unik untuk setiap produk yang berbeda. |
Tidak | Description |
STRING |
Nama produk (item). Nominal. |
Ya | Quantity |
INTEGER |
Jumlah setiap produk (item) per transaksi. Numerik. |
Ya | InvoiceDate |
STRING |
Tanggal dan waktu Invoice dalam format mm/dd/yy hh:mm. Hari dan waktu saat setiap transaksi dibuat. |
Ya | UnitPrice |
FLOAT |
Harga unit. Numerik. Harga produk per unit dalam sterling. |
Ya | CustomerID |
STRING |
Nomor pelanggan. Nominal. Bilangan integral 5 digit yang ditetapkan secara unik untuk setiap pelanggan. |
Tidak | Country |
STRING |
Nama negara. Nominal. Nama negara tempat setiap pelanggan. |
Membersihkan data
Apa pun model yang digunakan, Anda harus melakukan serangkaian langkah persiapan dan pembersihan yang umum untuk semua model. Operasi berikut diperlukan untuk mendapatkan kumpulan kolom dan kumpulan data yang bisa diterapkan:
- Kelompokkan pesanan berdasarkan hari, bukan menggunakan
InvoiceNo
, karena satuan waktu minimum yang digunakan oleh model probabilistik dalam solusi ini adalah satu hari. - Hanya simpan kolom yang berguna untuk model probabilistik.
- Hanya simpan kumpulan data yang memiliki jumlah pesanan dan nilai uang positif, seperti pembelian.
- Hanya simpan catatan dengan jumlah pesanan negatif, seperti pengembalian.
- Hanya simpan catatan dengan ID pelanggan.
- Hanya mempertahankan pelanggan yang telah membeli sesuatu dalam 90 hari terakhir.
- Hanya mempertahankan pelanggan yang telah membeli setidaknya dua kali dalam jangka waktu yang digunakan untuk membuat fitur.
Anda dapat menjalankan semua operasi ini menggunakan kueri BigQuery berikut. (Seperti halnya perintah sebelumnya, Anda akan menjalankan kode ini di mana pun Anda meng-clone repositori GitHub.) Karena data tersebut sudah lama, tanggal 12 Desember 2011, dianggap sebagai tanggal hari ini untuk tujuan artikel ini.
Kueri ini melakukan dua tugas. Pertama, jika set data yang berfungsi berukuran besar, kueri akan memperkecilnya. (Set data yang berfungsi untuk solusi ini cukup kecil, tetapi kueri ini dapat memperkecil set data yang sangat besar sebanyak dua tingkat dalam beberapa detik.)
Kedua, kueri membuat set data dasar yang akan dikerjakan, yang terlihat seperti berikut:
customer_id
|
order_date
|
order_value
|
order_qty_articles
|
---|---|---|---|
16915 | 2011-08-04 | 173,7 | 6 |
15349 | 2011-07-04 | 107,7 | 77 |
14794 | 2011-03-30 | -33,9 | -2 |
Set data yang telah dibersihkan juga berisi kolom order_qty_articles
. Kolom ini
hanya disertakan untuk digunakan oleh deep neural network (DNN) yang dijelaskan di
bagian berikutnya.
Menentukan interval target dan pelatihan
Untuk mempersiapkan pelatihan model, Anda harus memilih tanggal ambang batas. Tanggal tersebut memisahkan pesanan menjadi dua partisi:
- Pesanan sebelum tanggal nilai minimum digunakan untuk melatih model.
- Pesanan setelah tanggal nilai minimum digunakan untuk menghitung nilai target.
Library Lifetimes menyertakan metode untuk memproses data di awal. Namun, set data yang Anda gunakan untuk CLV bisa sangat besar, sehingga tidak praktis untuk melakukan pra-pemrosesan data pada satu mesin. Pendekatan yang dijelaskan dalam artikel ini menggunakan kueri yang dijalankan langsung di BigQuery untuk membagi pesanan menjadi dua kumpulan. Model ML dan probabilistik menggunakan kueri yang sama, sehingga memastikan kedua model beroperasi pada data yang sama.
Tanggal batas optimal mungkin berbeda untuk model ML dan model probabilistik. Anda dapat memperbarui nilai tanggal ini langsung dalam pernyataan SQL. Pertimbangkan tanggal batas yang optimal sebagai hyperparameter. Anda dapat menemukan nilai yang paling sesuai dengan mempelajari data dan menjalankan beberapa pelatihan pengujian.
Tanggal ambang batas digunakan dalam klausa WHERE
kueri SQL yang memilih
data pelatihan dari tabel data yang dibersihkan, seperti yang ditunjukkan dalam contoh berikut:
Menggabungkan data
Setelah membagi data menjadi interval pelatihan dan target, Anda akan menggabungkan data tersebut untuk membuat fitur dan target yang sebenarnya bagi setiap pelanggan. Untuk model probabilistik, agregasi dibatasi pada kolom keterkinian, frekuensi, dan moneter (RFM). Untuk model DNN, model juga menggunakan fitur RFM, tetapi dapat menggunakan fitur tambahan untuk membuat prediksi yang lebih baik.
Kueri berikut menunjukkan cara membuat fitur untuk model DNN dan probabilistik secara bersamaan:
Tabel berikut mencantumkan fitur yang dibuat oleh kueri.
Nama perlengkapan | Deskripsi | Probabilistik | DNN |
---|---|---|---|
monetary_dnn
|
Jumlah nilai uang semua pesanan per pelanggan selama periode fitur. | x | |
monetary_btyd
|
Rata-rata nilai uang semua pesanan untuk setiap pelanggan selama periode fitur. Model probabilistik mengasumsikan bahwa nilai urutan pertama adalah 0. Hal ini diberlakukan oleh kueri. | x | |
recency
|
Waktu antara pesanan pertama dan terakhir yang dilakukan oleh pelanggan selama periode fitur. | x | |
frequency_dnn
|
Jumlah pesanan yang dilakukan oleh pelanggan selama periode fitur. | x | |
frequency_btyd
|
Jumlah pesanan yang dilakukan oleh pelanggan selama periode fitur dikurangi pesanan pertama. | x | |
T
|
Waktu antara pesanan pertama yang dilakukan oleh pelanggan hingga akhir periode fitur. | x | x |
time_between
|
Waktu rata-rata di antara pesanan untuk pelanggan selama periode fitur. | x | |
avg_basket_value
|
Nilai uang rata-rata keranjang pelanggan selama periode fitur. | x | |
avg_basket_size
|
Jumlah item rata-rata yang dimiliki pelanggan di keranjang mereka selama periode fitur. | x | |
cnt_returns
|
Jumlah pesanan yang dikembalikan pelanggan selama periode fitur. | x | |
has_returned
|
Apakah pelanggan telah mengembalikan setidaknya satu pesanan selama periode fitur. | x | |
frequency_btyd_clipped
|
Sama seperti frequency_btyd , tetapi terpotong oleh pencilan batas. |
x | |
monetary_btyd_clipped
|
Sama seperti monetary_btyd , tetapi terpotong oleh pencilan batas. |
x | |
target_monetary_clipped
|
Sama seperti target_monetary , tetapi terpotong oleh pencilan batas. |
x | |
target_monetary
|
Total jumlah pembelanjaan oleh pelanggan, termasuk periode pelatihan dan target. | x |
Pemilihan kolom ini dilakukan di dalam kode. Untuk model probabilistik, pemilihan dilakukan menggunakan DataFrame Pandas:
Untuk model DNN, fitur TensorFlow ditentukan dalam file context.py
. Untuk model ini, hal berikut diabaikan sebagai fitur:
customer_id
. Ini adalah nilai unik yang tidak berguna sebagai fitur.target_monetary
. Ini adalah target yang harus diprediksi oleh model, dan oleh karena itu tidak digunakan sebagai input.
Membuat set pelatihan, evaluasi, dan pengujian untuk DNN
Bagian ini hanya berlaku untuk model DNN. Untuk melatih model ML, Anda harus menggunakan tiga set data yang tidak tumpang-tindih:
Set data pelatihan (70–80%) digunakan untuk mempelajari bobot guna mengurangi fungsi kerugian. Pelatihan berlanjut hingga fungsi kerugian tidak lagi menurun.
Set data evaluasi (10–15%) digunakan selama fase pelatihan untuk mencegah overfitting, yaitu saat model berperforma baik pada data pelatihan, tetapi tidak digeneralisasi dengan baik.
Set data pengujian (10–15%) hanya boleh digunakan satu kali, setelah semua pelatihan dan evaluasi selesai, untuk melakukan ukuran akhir performa model. Set data ini adalah salah satu yang belum pernah dilihat model selama proses pelatihan, sehingga memberikan ukuran akurasi model yang valid secara statistik.
Kueri berikut membuat set pelatihan dengan sekitar 70% data. Kueri memisahkan data menggunakan teknik berikut:
- Hash ID pelanggan dihitung, yang menghasilkan bilangan bulat.
- Operasi modulo digunakan untuk memilih nilai hash yang berada di bawah batas tertentu.
Konsep yang sama digunakan untuk set evaluasi dan set pengujian, di mana data yang berada di atas batas disimpan.
Pelatihan
Seperti yang telah Anda lihat di bagian sebelumnya, Anda dapat menggunakan model yang berbeda untuk mencoba
memprediksi CLV. Kode yang digunakan dalam artikel ini dirancang agar Anda dapat memutuskan model yang akan digunakan. Pilih model menggunakan parameter model_type
yang Anda teruskan ke skrip shell pelatihan berikut. Kode tersebut akan menangani sisanya.
Tujuan pertama pelatihan ini adalah agar kedua model ini dapat mengalahkan tolok ukur yang naif, yang kami tentukan di bawah ini. Jika kedua jenis model dapat mengalahkannya (dan seharusnya), Anda dapat membandingkan performa setiap jenis model dengan yang lain.
Membuat tolok ukur model
Untuk tujuan rangkaian ini, benchmark naif ditentukan menggunakan parameter berikut:
- Nilai keranjang rata-rata. Jumlah ini dihitung pada semua pesanan yang dilakukan sebelum tanggal nilai minimum.
- Jumlah pesanan. Jumlah ini dihitung untuk interval pelatihan pada semua pesanan yang dilakukan sebelum tanggal nilai minimum.
- Pengganda jumlah. Jumlah ini dihitung berdasarkan rasio jumlah hari sebelum tanggal nilai minimum dan jumlah hari antara tanggal ambang batas dan sekarang.
Tolok ukur secara naif mengasumsikan bahwa tingkat pembelian yang dilakukan oleh pelanggan selama interval pelatihan tetap konstan melalui interval target. Jadi, jika pelanggan membeli 6 kali selama 40 hari, asumsinya adalah mereka akan membeli 9 kali selama 60 hari (60/40 * 6 = 9). Mengalikan pengganda jumlah, jumlah pesanan, dan nilai keranjang rata-rata untuk setiap pelanggan memberikan prediksi nilai target yang naif untuk pelanggan tersebut.
Error benchmark adalah root mean Square error (RMSE): rata-rata di semua pelanggan dari perbedaan absolut antara nilai target yang diprediksi dan nilai target sebenarnya. RMSE dihitung menggunakan kueri berikut di BigQuery:
Benchmark menampilkan RMSE 3760, seperti yang ditunjukkan dalam hasil menjalankan benchmark berikut. Model harus melampaui nilai tersebut.
Model probabilistik
Seperti yang disebutkan di Bagian 1 pada seri ini, seri ini menggunakan library Python yang disebut Lifetimes yang mendukung berbagai model termasuk model distribusi binomial Pareto/negatif (NBD) dan BG/NBD geometris beta. Kode contoh berikut menunjukkan cara menggunakan library Lifetimes untuk melakukan prediksi nilai umur dengan model probabilistik.
Untuk membuat hasil CLV dengan menggunakan model probabilistik di lingkungan lokal, Anda dapat menjalankan skrip mltrain.sh
berikut. Anda memberikan parameter untuk tanggal mulai dan akhir dari pemisahan pelatihan dan untuk akhir periode prediksi.
./mltrain.sh local data --model_type paretonbd_model --threshold_date [YOUR_THRESHOLD_DATE] --predict_end [YOUR_END_DATE]
Model DNN
Kode contoh mencakup penerapan di TensorFlow DNN menggunakan class DNNRegressor
Assessment yang sudah dibuat sebelumnya, serta model Assessment kustom. DNNRegressor
dan Estimasi kustom menggunakan jumlah lapisan dan jumlah neuron yang sama di setiap lapisan. Nilai-nilai tersebut adalah hyperparameter
yang perlu di-tuning. Dalam file task.py
berikut, Anda dapat menemukan daftar
beberapa hyperparameter yang ditetapkan ke nilai yang diuji
secara manual dan memberikan hasil yang baik.
Jika menggunakan AI Platform, Anda dapat menggunakan fitur penyesuaian hyperparameter, yang akan melakukan pengujian di seluruh rentang parameter yang Anda tentukan dalam file yaml. AI Platform menggunakan pengoptimalan Bayesian untuk menelusuri ruang hyperparameter.
Hasil perbandingan model
Tabel berikut menunjukkan nilai RMSE untuk setiap model, seperti yang dilatih pada set data sampel. Semua model dilatih dengan data RFM. Nilai RMSE sedikit berbeda di antara operasi, karena inisialisasi parameter acak. Model DNN menggunakan fitur tambahan seperti nilai keranjang rata-rata dan jumlah pengembalian.
Model | RMSE |
---|---|
DNN | 947,9 |
BG/NBD | 1557 |
Pareto/NBD | 1558 |
Hasilnya menunjukkan bahwa pada set data ini, model DNN mengungguli model probabilistik saat memprediksi nilai moneter. Namun, ukuran set data UCI yang relatif kecil membatasi validitas statistik hasil ini. Anda harus mencoba setiap teknik pada set data Anda untuk melihat mana yang memberikan hasil terbaik. Semua model dilatih menggunakan data asli yang sama (termasuk ID pelanggan, tanggal pesanan, dan nilai pesanan) pada nilai RFM yang diekstrak dari data tersebut. Data pelatihan DNN menyertakan beberapa fitur tambahan seperti ukuran keranjang rata-rata dan jumlah pengembalian.
Model DNN hanya menghasilkan output nilai moneter pelanggan secara keseluruhan. Jika tertarik untuk memprediksi frekuensi atau churn, Anda harus melakukan beberapa tugas tambahan:
- Siapkan data secara berbeda untuk mengubah target dan mungkin tanggal batas.
- Latih ulang model regresi untuk memprediksi target yang Anda minati.
- Sesuaikan hyperparameter.
Tujuannya di sini adalah untuk melakukan perbandingan fitur input yang sama antara kedua jenis model. Salah satu keuntungan menggunakan DNN adalah Anda dapat meningkatkan hasil dengan menambahkan lebih banyak fitur daripada yang digunakan dalam contoh ini. Dengan DNN, Anda dapat memanfaatkan data dari sumber seperti peristiwa clickstream, profil pengguna, atau fitur produk.
Ucapan terima kasih
Dua, D. dan Karra Taniskidou, E. (2017). Repositori UCI Machine Learning http://archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and Computer Science.
Langkah selanjutnya
- Baca Bagian 3: Men-deploy ke produksi dari rangkaian ini untuk memahami cara men-deploy model tersebut.
- Pelajari solusi perkiraan prediktif lainnya.
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.