Ini adalah pendekatan berbasis pembelajaran mesin pada data Starbucks sebagai bagian dari program gelar Udacity Nano

Ulasan Proyek

Rantai makanan cepat saji adalah bagian dari industri restoran yang sangat kompetitif. Makan dan minum adalah kebutuhan sehari-hari dalam hidup setiap orang sehingga saya yakin permintaan akan layanan restoran selalu tinggi. Jadi mendapatkan keuntungan dalam industri ini sangat bergantung pada kepuasan pelanggan dan retensi pelanggan.

Keterlibatan pelanggan merupakan faktor yang tercermin dari Retensi Pelanggan. Menawarkan rekomendasi yang dipersonalisasi berdasarkan pembelian sebelumnya adalah tren yang coba diikuti oleh banyak organisasi. Ini adalah strategi yang efektif untuk retensi pelanggan. Demikian pula, menawarkan hadiah, penawaran, atau kupon yang dipersonalisasi sesuai dengan minat pelanggan juga merupakan faktor penting dalam retensi pelanggan

Pernyataan masalah

Ketika saya melihat kumpulan data dengan ciri-ciri yang dapat diamati mengenai pelanggan, fitur penawaran yang diberikan kepada pelanggan, dan riwayat interaksi pelanggan dengan penawaran tersebut disediakan, inilah ide pertama yang muncul di benak saya.

Memprediksi bagaimana pelanggan akan merespons tawaran yang dikirimkan kepada mereka untuk mengetahui penawaran terbaik untuk dikirimkan kepada pengguna mana pun dan media mana yang terbaik untuk menyampaikannya.

Eksplorasi dan Visualisasi Data

Data disediakan dalam tiga file

  1. profile.json — Berisi ciri-ciri pelanggan seperti jenis kelamin, usia, pendapatan, dll. yang dapat digunakan untuk mengidentifikasi pola berdasarkan ciri-ciri serupa.
  2. portfolio.json — Berisi fitur tentang penawaran seperti jenis penawaran, hadiah, jumlah untuk menyelesaikan penawaran yang diberikan kepada pengguna
  3. transkrip.json — Berisi informasi tentang interaksi pelanggan dengan penawaran seperti transaksi yang dilakukan oleh pengguna atau apakah pengguna menyelesaikan penawaran atau tidak.

Ada empat peristiwa yang ada di transaksi.json yaitu penawaran_diterima, penawaran_dilihat, transaksi, penawaran_selesai. Saya menyimpulkan bahwa untuk mengidentifikasi apakah suatu penawaran telah diselesaikan oleh pengguna, kita hanya perlu menargetkan dua peristiwa yaitu offer_viewed dan offer_completed. Jika kedua peristiwa ini hadir untuk suatu penawaran, itu berarti pengguna melihat dan menggunakan penawaran tersebut.

Untuk pelanggan saya mengamati tiga variabel jenis kelamin, usia dan pendapatan yang dapat digunakan sebagai ciri-ciri setiap pengguna. Id unik untuk pelanggan dapat digunakan untuk bergabung dengan mereka dalam suatu acara di transaksi.json

Seluruh kolom portofolio penawaran yang tersedia di bawah ini dapat digunakan sebagai fitur suatu penawaran.

Pemrosesan Awal Data

Data yang disediakan dalam kumpulan data tidak memuat semua fitur dalam format yang dapat digunakan langsung dalam model prediksi.

Kolom kategorikal berikut langsung dikonversi ke variabel dummy menggunakan fungsi get_dummies di perpustakaan pandas:

  1. offer_type(portfolio.json)
  2. jenis kelamin(profil.json)
  3. acara (transkrip.json)

Kolom saluran di portofolio berisi saluran dalam bentuk daftar python. Oleh karena itu variabel dummy untuk saluran tidak dibuat menggunakan fungsi get_dummies. Sebaliknya kolom telah dibuat untuk semua saluran secara terpisah dan menerapkan fungsi panda telah diterapkan ke setiap kolom untuk mengisi sel dengan 1 jika kolom tersebut ada dalam daftar saluran asli.

Kolom nilai di transkrip.json hadir dalam bentuk kamus. Peristiwa transaksi memiliki nilai dengan jumlah transaksi tetapi saya tidak menggunakan peristiwa transaksi dalam analisis saya, jadi hilangkan catatan tersebut dengan peristiwa transaksi. Kunci untuk nilai peristiwa lain telah digunakan menyimpan nilai id penawaran yang digunakan untuk menggabungkan peristiwa dengan penawaran.

Kumpulan data profil memiliki beberapa nilai nol untuk kolom gender dan pendapatan. Saya membuat plot sebar untuk mengidentifikasi pola yang dapat digunakan untuk menghubungkan data yang hilang.

Ada tingkat korelasi tertentu antara usia, jenis kelamin, dan pendapatan dalam pengamatan saya terhadap plot di atas, tetapi saya tidak yakin untuk mengisi data yang hilang untuk dua kolom berdasarkan hal tersebut. Jadi saya membuang data yang hilang.

Id unik pengguna dan identitas unik penawaran telah digunakan untuk menggabungkan ketiga kumpulan data menggunakan fungsi gabungpanda.

Peristiwa setiap interaksi penawaran pengguna dikelompokkan menggunakan fungsi groupbypanda menggunakan person_id dan offer_id. Setiap kombinasi person_id dan offer_id hanya memiliki satu record dan targetnya adalah offer_viewed dan offer_completed.

Penerapan

Karena ada dua variabel target offer_viewed dan offer_completed saya memutuskan untuk menggunakan MultiOutputClassifier dari scikit-learn.

Saya membagi data menjadi data pelatihan dan pengujian dengan 20% sebagai ukuran data pengujian menggunakan fungsi train_test_split dari scikit-learn

Saya telah menggunakan model RandomForestClassifier sebagai model estimator untuk MultiOutputClassifier dan melatihnya pada data kereta.

Setelah pelatihan saya menggunakan fungsi classification_report dari scikit-learn untuk menguji hasil pada data pengujian

Metrik

Fungsi laporan klasifikasi mengembalikan metrik presisi, perolehan, dan skor f1 antara hasil prediksi dan hasil asli.

Saya menggunakan metrik recall sebagai metrik utama untuk evaluasi model. Ide di balik model ini adalah untuk meningkatkan retensi pelanggan dan oleh karena itu kami tidak menginginkan prediksi yang salah untuk pelanggan yang benar-benar ingin menyelesaikan penawaran.

Oleh karena itu saya ingin meminimalkan False Negatives (model yang memprediksi False untuk target yang sebenarnya Benar).

Evaluasi dan Validasi Model

Saya pertama kali memeriksa hasil RandomClassifierModel yang saya gunakan untuk prediksi menggunakan classification_report pada hasilnya.

Hasil pertama adalah penawaran_selesai dan hasil kedua adalah penawaran_dilihat.

Semua metrik memiliki akurasi yang lebih rendah dari perkiraan saya. Saya selanjutnya akan melakukan penyetelan beberapa parameter hiper model untuk hasil yang lebih baik.

Saya akan menggunakan perpustakaan GridSearchCV dari scikit-learn yang membandingkan nilai parameter hiper yang diberikan dan memilih nilai terbaik untuk prediksi.

Parameter n_estimators dan parameter kriteria dari RandomClassifierModel Saya akan melewati GridSearchCV untuk memilih nilai yang lebih sesuai dan kemudian menghasilkan classification_report dari prediksi dari model yang disetel.

Saya mengamati perubahan yang dapat diabaikan setelah melakukan GridSearchCV pada model, jadi saya memutuskan untuk mengubah model.

Perbaikan

Model pengklasifikasi populer lainnya adalah XGBClassifier berdasarkan teknik Gradient Boosting yang merupakan kumpulan model prediksi lemah dan biasanya mengungguli model RandomForest.

Saya telah mengevaluasi kembali hasil XGBClassifier menggunakan classification_report.

Terdapat peningkatan hasil yang signifikan dengan menggunakan model XGBClassifier. Sekarang saya akan menerapkan GridSearchCV pada model dan mengevaluasi hasilnya.

Rata-rata Penarikan dan Penarikan Kembali untuk memprediksi penyelesaian penawaran bagus dalam model ini dan oleh karena itu saya akan menyimpan model ini menggunakan pustaka acar

Pembenaran

XGBoost adalah algoritma yang jauh lebih kompleks untuk diterapkan daripada RandomForest tetapi secara umum jauh lebih cepat dan akurat karena melakukan peningkatan gradien pada setiap pohon satu demi satu sedangkan RandomForestClassifier membangun beberapa pohon secara bersamaan dan mengambil hasil rata-rata dari semua pohon.

Cerminan

Setiap pengguna yang tawarannya diprediksi dalam penawaran_selesai dan penawaran_dilihat keduanya sebagai 1 harus menerima tawaran tersebut. Jika pengguna tidak menyelesaikan penawaran, mengirimkan penawaran kepada mereka bukanlah penggunaan sumber daya yang baik dan jika pengguna menyelesaikan penawaran bahkan tanpa melihat maka saya yakin organisasi dapat menghemat sumber daya dan tidak mengirimi mereka penawaran tertentu karena mereka membelanjakannya. jumlah yang banyak sehingga mereka dapat tetap terlibat dengan tawaran yang berbeda.

Pemrosesan awal dan pembersihan data menghabiskan sebagian besar waktu saya saat menyelesaikan proyek ini. Bagi saya, bagian tersulitnya adalah mengidentifikasi struktur fitur yang akan saya gunakan dalam prediksi.

Peningkatan

Salah satu kekurangan yang saya sadari dalam proyek ini adalah standarisasi nilai fitur. Data yang terstandarisasi, meskipun diperlukan untuk lebih sedikit kolom karena sebagian besar kolom bersifat kategorikal, akan membantu dalam mengembangkan model yang lebih akurat.

Juga ada peristiwa transaksi di transkrip.json yang belum saya gunakan dalam model saya. Saya tidak terlalu yakin tentang struktur bagaimana fitur tersebut dapat digunakan, namun saya yakin ini memberikan arti penting terhadap pembelanjaan pengguna sebelum dan sesudah menerima penawaran dan dapat digunakan untuk mendapatkan wawasan mengenai dampak penawaran terhadap pengguna. jika belum selesai.

Kode untuk proyek di atas dapat ditemukan di sini di Github