Bagaimana kami menang di SmartMailHack 2

Akhir pekan lalu (14-15 Juli), hackathon SmartMailHack lain diadakan di kantor Mail.Ru Group. Kami diminta untuk "membuat fitur yang memungkinkan Anda mengakses data dari Mail dan berinteraksi lebih efektif dengan mereka."


Deskripsi, Ide, dan Solusi Data


Kami mendapat kotak uji dengan lebih dari 1500 pesan, serta akses penuh ke sana melalui API. Panitia menyediakan manual yang besar dan terperinci tentang penggunaannya (buku 547 halaman). Dengan bantuan token dan permintaan JSON sederhana, kami dapat menerima semua informasi yang diperlukan tentang surat: surat, nama pengirim, berbagai karakteristik.


Setelah membahas bahwa masing-masing dari kami memiliki sekitar beberapa ribu surat yang belum dibaca dari milis dalam surat, kami memutuskan untuk menangani masalah ini. Dalam kasus kami, relevansi surat tidak lagi ditentukan pada saat itu muncul di kotak surat. Dan berdasarkan fakta bahwa tidak semua surat akan dibuka, maka lebih baik untuk menunjukkan kepada pengguna hanya surat-surat yang kemungkinan akan dibuka. Dan segala sesuatu yang lain dapat disingkirkan ke neraka. Jadi kami memutuskan untuk melakukan semacam pengurutan.


Sortir huruf seharusnya dikategorikan, dan kategori ditempatkan di dalam ubin (hai, Trello). Baris atas ubin menggabungkan arti huruf dari pengirim yang berbeda. Mungkin ada "Perjalanan", "Pendaftaran", "Korespondensi dengan Vasya", "Acara", "Keuangan" dan seterusnya, secara total sekitar 10 kategori. Baris kedua adalah ubin dengan penawaran paling keren dari perusahaan. Kami mencari kode promosi yang paling relevan, promosi diskon paling banyak, penawaran paling berharga, dan menunjukkannya di sini, dikelompokkan berdasarkan perusahaan. Kemudian datang semua surat lain yang didistribusikan oleh perusahaan pengirim, dan pengirim ini, pada gilirannya, tersebar ke dalam kategori ("Makanan", "Kosmetik", "Elektronik" dan lainnya). Selain itu, kategori-kategori tersebut juga diberi peringkat berdasarkan relevansi huruf, dan hanya huruf-huruf yang melewati batas relevansi yang diperlihatkan di dalamnya. Setelah memperkuat gagasan dengan kata-kata "Temukan apa yang dibutuhkan dan singkirkan kelebihan", kami naik ke ML.


Pembelajaran mesin


Kami memutuskan untuk membangun tiga model:


  • classifier dari lebih dari 30 kategori yang telah kami tetapkan sebagai dasar untuk semua pengguna;
  • mengelompokkan dan menyorot kategori baru berdasarkan preferensi pengguna;
  • peringkat surat dalam kategori, dari yang paling relevan hingga yang paling sedikit.


Tanda


Tampaknya item ini harus dijelaskan secara terpisah untuk setiap tugas. Namun, kami membuat satu dataset fitur umum dan melatih semua model di dalamnya. Tidak ada waktu untuk pemilihan yang cermat.


Ada banyak tanda biner yang dibongkar menggunakan API. Namun, sebagian besar dihasilkan pada teks:


  • tf-idf pada kumpulan dokumen;
  • Hadiah diterima dengan Word2Vec;
  • gejala perilaku seperti:
    - jumlah pesan yang dibaca di jendela terakhir (1, 2, 5 minggu yang lalu);
    - jumlah pesan dari ini.

Tugas klasifikasi


Kami menandai dengan tangan 1000 surat untuk pelatihan. Ternyata ini bukan pekerjaan yang lambat dan melelahkan seperti yang terlihat pada awalnya. Jika Anda menggunakan alamat dan tajuk, Anda dapat mempercepat pekerjaan secara signifikan. Misalnya, Lamoda hampir selalu mengirim surat ke kategori "Pakaian".


Selanjutnya, kami melatih LightGBM pada seluruh rangkaian tanda dan mendapatkan kualitas akurasi 0,913 dan 0,892 f1, yang kami tentukan sebagai hasil yang sangat baik di tingkat garis dasar. Ini menunjukkan bahwa huruf dapat diklasifikasikan dengan sangat baik.


Tugas peringkat


Sebagai variabel target, kami menggunakan bendera biner 0/1 - apakah pesan dibaca oleh pengguna. Mereka selanjutnya diberi peringkat sesuai dengan probabilitas yang diprediksi oleh model, karena inilah yang mencerminkan seberapa yakin model tersebut apakah orang akan membaca pesan atau tidak.


Di sini kami juga melatih LightGBM pada seluruh rangkaian fitur dan mendapatkan kualitas sekitar 0,816 auc-roc.


Mengelompokkan dan menyorot kategori baru


Selain kategori utama, kami memiliki kategori "Lainnya". Dari situ Anda bisa menyorot topik baru.


Kami melatih DBSCAN standar pada surat-surat dari grup ini, dan kemudian kami memilih kluster-kluster di mana ada banyak pesan (ambang batas dapat dioptimalkan, tetapi diperbaiki secara tidak sengaja). Misalnya, pemodelan tematik dapat ditetapkan pada kumpulan dokumen cluster, dapatkan topik yang paling relevan untuk cluster yang diberikan, dan pilih dalam kelompok yang terpisah. Tidak ada cukup waktu untuk memvalidasi algoritma ini.


Jadi, surat yang masuk dilewatkan melalui pengklasifikasi, jika masuk dalam kategori β€œLainnya” - dikelompokkan, topik-topik baru berusaha menonjol, dan kemudian pemeringkatan terjadi. Permintaan backend dikirim, yang mengumpulkan semuanya, dan frontend diberikan.





Gagasan yang tersisa


  • meningkatkan model pembelajaran mesin;
  • mengumpulkan data dari lebih banyak pengguna untuk memprediksi perilaku masing-masing dari mereka dengan lebih baik;
  • validasi menyeluruh dari kategori baru yang muncul;
  • penggunaan gambar sebagai tanda, misalnya, alokasi embedding dari jaringan saraf pra-terlatih.

Source: https://habr.com/ru/post/id417531/


All Articles