Hackathon SNA 2019

Pada bulan Februari-Maret 2019, diadakan kompetisi untuk menentukan peringkat feed jejaring sosial Hackathon SNA 2019, di mana tim kami menempati posisi pertama. Dalam artikel ini saya akan berbicara tentang organisasi kompetisi, metode yang kami coba, dan pengaturan catboost untuk pelatihan data besar.

Hackathon SNA 2019

Hackathon SNA

Ini adalah ketiga kalinya hackathon dengan nama ini diadakan. Ini diselenggarakan oleh jejaring sosial ok.ru, tugas dan datanya terkait langsung dengan jejaring sosial ini.
SNA (social network analysis) dalam hal ini lebih tepat dipahami bukan sebagai analisis grafik sosial, melainkan sebagai analisis jaringan sosial.

  • Pada tahun 2014, tugasnya adalah memprediksi jumlah suka yang didapat sebuah postingan.
  • Pada tahun 2016 - tugas VVZ (mungkin Anda sudah familiar), lebih dekat dengan analisis grafik sosial.
  • Pada tahun 2019, memberi peringkat pada feed pengguna berdasarkan kemungkinan pengguna akan menyukai postingan tersebut.

Kalau tahun 2014 saya belum bisa bilang, tapi di tahun 2016 dan 2019, selain kemampuan analisis data, juga dibutuhkan keterampilan dalam bekerja dengan big data. Saya pikir kombinasi pembelajaran mesin dan masalah pemrosesan data besarlah yang membuat saya tertarik pada kompetisi ini, dan pengalaman saya di bidang ini membantu saya menang.

mlbootcamp

Pada tahun 2019, kompetisi ini diselenggarakan di platform tersebut https://mlbootcamp.ru.

Kompetisi dimulai secara online pada tanggal 7 Februari dan terdiri dari 3 tugas. Siapa pun dapat mendaftar di situs ini, mengunduh paduk dan memuat mobil Anda selama beberapa jam. Di akhir panggung online pada tanggal 15 Maret, 15 teratas dari setiap acara show jumping diundang ke kantor Mail.ru untuk panggung offline, yang berlangsung dari tanggal 30 Maret hingga 1 April.

Tugas

Data sumber menyediakan ID pengguna (userId) dan ID postingan (objectId). Jika pengguna diperlihatkan sebuah postingan, maka datanya berisi baris yang berisi userId, objectId, reaksi pengguna terhadap postingan ini (umpan balik) dan serangkaian berbagai fitur atau tautan ke gambar dan teks.

identitas pengguna objekId pemilikId umpan balik gambar
3555 22 5677 [menyukai, mengklik] [hash1]
12842 55 32144 [tidak suka] [hash2,hash3]
13145 35 5677 [diklik, dibagikan] [hash2]

Kumpulan data pengujian berisi struktur serupa, tetapi bidang umpan balik tidak ada. Tugasnya adalah memprediksi kehadiran reaksi 'suka' di bidang umpan balik.
File penyerahan memiliki struktur berikut:

identitas pengguna Daftar yang Diurutkan[objekId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

Metriknya adalah rata-rata ROC AUC untuk pengguna.

Penjelasan lebih rinci tentang data dapat ditemukan di situs web dewan. Anda juga dapat mendownload data di sana, termasuk tes dan gambar.

Tahap daring

Pada tahap online, tugas dibagi menjadi 3 bagian

  • Sistem kolaboratif β€” mencakup semua fitur kecuali gambar dan teks;
  • Gambar β€” hanya mencakup informasi tentang gambar;
  • Teks β€” hanya mencakup informasi tentang teks.

Tahap luring

Pada tahap offline, data mencakup semua fitur, sedangkan teks dan gambar hanya sedikit. Ada 1,5 kali lebih banyak baris dalam kumpulan data, dan jumlahnya sudah banyak.

Solusi dari masalah

Sejak saya membuat CV di tempat kerja, saya memulai perjalanan saya dalam kompetisi ini dengan tugas β€œGambar”. Data yang diberikan adalah userId, objectId, ownerId (grup tempat postingan dipublikasikan), stempel waktu untuk membuat dan menampilkan postingan, dan tentu saja gambar untuk postingan tersebut.
Setelah membuat beberapa fitur berdasarkan stempel waktu, ide berikutnya adalah mengambil lapisan kedua dari belakang neuron yang telah dilatih sebelumnya di imagenet dan mengirimkan penyematan ini untuk ditingkatkan.

Hackathon SNA 2019

Hasilnya tidak mengesankan. Penyematan dari neuron imagenet tidak relevan, pikir saya, saya perlu membuat autoencoder sendiri.

Hackathon SNA 2019

Butuh banyak waktu dan hasilnya tidak kunjung membaik.

Pembuatan fitur

Bekerja dengan gambar membutuhkan banyak waktu, jadi saya memutuskan untuk melakukan sesuatu yang lebih sederhana.
Seperti yang bisa langsung Anda lihat, ada beberapa fitur kategoris dalam dataset, dan agar tidak terlalu repot, saya ambil catboost saja. Solusinya luar biasa, tanpa pengaturan apa pun saya langsung mencapai baris pertama papan peringkat.

Datanya cukup banyak dan ditata dalam format parket, jadi tanpa berpikir dua kali, saya mengambil scala dan mulai menulis semuanya dengan percikan.

Fitur paling sederhana yang memberikan pertumbuhan lebih besar daripada penyematan gambar:

  • berapa kali objectId, userId dan ownerId muncul di data (harus berkorelasi dengan popularitas);
  • berapa banyak postingan yang dilihat userId dari ownerId (harus berkorelasi dengan minat pengguna pada grup);
  • berapa banyak userId unik yang melihat postingan dari ownerId (mencerminkan ukuran audiens grup).

Dari stempel waktu, dimungkinkan untuk memperoleh waktu saat pengguna menonton feed (pagi/siang/sore/malam). Dengan menggabungkan kategori-kategori ini, Anda dapat terus menghasilkan fitur:

  • berapa kali userId login pada malam hari;
  • jam berapa postingan ini paling sering ditampilkan (objectId) dan seterusnya.

Semua ini secara bertahap meningkatkan metriknya. Namun ukuran kumpulan data pelatihan adalah sekitar 20 juta catatan, sehingga penambahan fitur akan sangat memperlambat pelatihan.

Saya telah memikirkan kembali pendekatan saya dalam menggunakan data. Meskipun datanya bergantung pada waktu, saya tidak melihat adanya kebocoran informasi yang jelas β€œdi masa depan”, namun, untuk berjaga-jaga, saya menguraikannya seperti ini:

Hackathon SNA 2019

Set pelatihan yang diberikan kepada kami (Februari dan 2 minggu bulan Maret) dibagi menjadi 2 bagian.
Model dilatih berdasarkan data dari N hari terakhir. Agregasi yang dijelaskan di atas dibangun berdasarkan semua data, termasuk pengujian. Pada saat yang sama, data telah muncul yang memungkinkan untuk membangun berbagai pengkodean variabel target. Pendekatan paling sederhana adalah dengan menggunakan kembali kode yang sudah membuat fitur baru, dan cukup memasukkan data yang tidak akan dilatih dan target = 1.

Jadi, kami mendapat fitur serupa:

  • Berapa kali userId melihat postingan di grup ownerId;
  • Berapa kali userId menyukai postingan di grup ownerId;
  • Persentase postingan yang disukai userId dari ownerId.

Ternyata begitu berarti pengkodean target pada bagian kumpulan data untuk berbagai kombinasi fitur kategorikal. Pada prinsipnya, catboost juga membuat pengkodean target dan dari sudut pandang ini tidak ada manfaatnya, namun, misalnya, menjadi mungkin untuk menghitung jumlah pengguna unik yang menyukai postingan di grup ini. Pada saat yang sama, tujuan utama tercapai - kumpulan data saya dikurangi beberapa kali, dan dimungkinkan untuk terus menghasilkan fitur.

Meskipun catboost dapat membuat pengkodean hanya berdasarkan reaksi yang disukai, umpan balik memiliki reaksi lain: dibagikan ulang, tidak disukai, tidak disukai, diklik, diabaikan, pengkodean yang dapat dilakukan secara manual. Saya menghitung ulang semua jenis agregat dan menghilangkan fitur-fitur yang tidak terlalu penting agar tidak menggembungkan kumpulan data.

Saat itu saya berada di posisi pertama dengan selisih yang besar. Satu-satunya hal yang membingungkan adalah penyematan gambar hampir tidak menunjukkan pertumbuhan. Muncul ide untuk memberikan segalanya untuk catboost. Kami mengelompokkan gambar Kmeans dan mendapatkan fitur kategoris baru imageCat.

Berikut beberapa kelas setelah pemfilteran manual dan penggabungan cluster yang diperoleh dari KMeans.

Hackathon SNA 2019

Berdasarkan imageCat yang kami hasilkan:

  • Fitur kategoris baru:
    • imageCat mana yang paling sering dilihat oleh userId;
    • imageCat mana yang paling sering menampilkan ownerId;
    • imageCat mana yang paling sering disukai oleh userId;
  • Berbagai penghitung:
    • Berapa banyak imageCat unik yang dilihat userId;
    • Sekitar 15 fitur serupa ditambah pengkodean target seperti dijelaskan di atas.

Teks

Hasil dalam kompetisi gambar cocok untuk saya dan saya memutuskan untuk mencoba teks. Saya belum banyak bekerja dengan teks sebelumnya dan, bodohnya, saya menghabiskan hari itu dengan tf-idf dan svd. Lalu saya melihat garis dasar dengan doc2vec, yang melakukan apa yang saya butuhkan. Setelah sedikit menyesuaikan parameter doc2vec, saya mendapatkan penyematan teks.

Dan kemudian saya cukup menggunakan kembali kode untuk gambar tersebut, di mana saya mengganti penyematan gambar dengan penyematan teks. Hasilnya, saya mendapat juara 2 dalam kompetisi teks.

Sistem kolaboratif

Ada satu kompetisi tersisa yang belum saya β€œtusuk” dengan tongkat, dan dilihat dari AUC di papan peringkat, hasil dari kompetisi khusus ini seharusnya memiliki dampak terbesar pada tahap offline.
Saya mengambil semua fitur yang ada di data sumber, memilih fitur kategorikal dan menghitung agregat yang sama seperti untuk gambar, kecuali fitur berdasarkan gambar itu sendiri. Menempatkan ini di catboost membawa saya ke posisi ke-2.

Langkah pertama optimasi catboost

Satu tempat pertama dan dua tempat kedua membuat saya senang, tetapi ada pemahaman bahwa saya tidak melakukan sesuatu yang istimewa, yang berarti saya bisa saja kehilangan posisi.

Tugas kompetisi ini adalah menentukan peringkat postingan di dalam pengguna, dan selama ini saya memecahkan masalah klasifikasi, yaitu mengoptimalkan metrik yang salah.

Saya akan memberikan contoh sederhana:

identitas pengguna objekId ramalan kebenaran dasar
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 1
1 14 0.5 0
2 15 0.4 0
2 16 0.3 1

Mari kita lakukan penataan ulang kecil-kecilan

identitas pengguna objekId ramalan kebenaran dasar
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 0
2 16 0.5 1
2 15 0.4 0
1 14 0.3 1

Kami mendapatkan hasil sebagai berikut:

Model AUC Pengguna1 AUC Pengguna2 AUC berarti AUC
Opsi 1 0,8 1,0 0,0 0,5
Opsi 2 0,7 0,75 1,0 0,875

Seperti yang Anda lihat, meningkatkan keseluruhan metrik AUC tidak berarti meningkatkan rata-rata metrik AUC dalam pengguna.

peningkatan kucing tahu cara mengoptimalkan metrik peringkat dari kotak. Saya membaca tentang metrik peringkat, cerita-cerita sukses saat menggunakan catboost dan atur YetiRankPairwise untuk berlatih semalaman. Hasilnya tidak mengesankan. Memutuskan bahwa saya kurang terlatih, saya mengubah fungsi kesalahan menjadi QueryRMSE, yang, dilihat dari dokumentasi catboost, menyatu lebih cepat. Pada akhirnya saya mendapatkan hasil yang sama seperti saat latihan klasifikasi, namun kombinasi kedua model ini memberikan peningkatan yang cukup baik sehingga membawa saya menjadi juara pertama di ketiga kompetisi tersebut.

5 menit sebelum penutupan tahap online kompetisi β€œSistem Kolaboratif”, Sergey Shalnov memindahkan saya ke posisi kedua. Kami berjalan lebih jauh bersama-sama.

Mempersiapkan tahap offline

Kami dijamin menang di panggung online dengan kartu video RTX 2080 TI, tetapi hadiah utama 300 rubel dan, kemungkinan besar, bahkan tempat pertama terakhir memaksa kami bekerja selama 000 minggu ini.

Ternyata Sergey juga menggunakan catboost. Kami bertukar ide dan fitur, dan saya mempelajarinya laporan oleh Anna Veronica Dorogush yang berisi jawaban atas banyak pertanyaan saya, dan bahkan pertanyaan yang belum saya miliki saat itu.

Melihat laporan tersebut membawa saya pada gagasan bahwa kita perlu mengembalikan semua parameter ke nilai default, dan melakukan pengaturan dengan sangat hati-hati dan hanya setelah memperbaiki serangkaian fitur. Sekarang satu pelatihan memakan waktu sekitar 15 jam, tetapi satu model berhasil memperoleh kecepatan yang lebih baik daripada yang diperoleh dalam ansambel dengan peringkat.

Pembuatan fitur

Dalam kompetisi Sistem Kolaboratif, sejumlah besar fitur dinilai penting untuk model. Misalnya, auditweights_spark_svd - tanda yang paling penting, tetapi tidak ada informasi tentang artinya. Saya pikir akan bermanfaat untuk menghitung berbagai agregat berdasarkan fitur-fitur penting. Misalnya, rata-rata auditweights_spark_svd menurut pengguna, berdasarkan grup, berdasarkan objek. Hal yang sama dapat dihitung dengan menggunakan data di mana tidak ada pelatihan yang dilakukan dan target = 1, yaitu rata-rata auditweights_spark_svd oleh pengguna berdasarkan objek yang disukainya. Selain itu tanda-tanda penting auditweights_spark_svd, ada beberapa. Berikut beberapa di antaranya:

  • bobot auditCtrGender
  • bobot auditCtrTinggi
  • penggunaOwnerCounterCreateLikes

Misalnya rata-rata bobot auditCtrGender menurut userId ternyata fitur itu penting, sama seperti nilai rata-ratanya penggunaOwnerCounterCreateLikes oleh userId+ownerId. Hal ini seharusnya sudah membuat Anda berpikir bahwa Anda perlu memahami arti dari field tersebut.

Ada juga fitur penting auditweightsLikesCount ΠΈ auditweightsShowsCount. Membagi satu sama lain, diperoleh fitur yang lebih penting.

Kebocoran data

Persaingan dan pemodelan produksi adalah tugas yang sangat berbeda. Saat menyiapkan data, sangat sulit untuk memperhitungkan semua detail dan tidak menyampaikan beberapa informasi non-sepele tentang variabel target dalam pengujian. Jika kami membuat solusi produksi, kami akan mencoba menghindari kebocoran data saat melatih model. Namun jika kita ingin memenangkan persaingan, maka kebocoran data adalah fitur terbaiknya.

Setelah mempelajari datanya, Anda dapat melihatnya berdasarkan nilai objectId auditweightsLikesCount ΠΈ auditweightsShowsCount berubah, yang berarti rasio nilai maksimum fitur ini akan mencerminkan pasca konversi jauh lebih baik daripada rasio pada saat ditampilkan.

Bocoran pertama yang kami temukan adalah auditweightsLikesCountMax/auditweightsShowsCountMax.
Namun bagaimana jika kita melihat datanya lebih dekat? Mari urutkan berdasarkan tanggal pertunjukan dan dapatkan:

objekId identitas pengguna auditweightsShowsCount auditweightsLikesCount target (disukai)
1 1 12 3 mungkin tidak
1 2 15 3 mungkin ya
1 3 16 4

Sungguh mengejutkan ketika saya menemukan contoh pertama dan ternyata prediksi saya tidak menjadi kenyataan. Namun mengingat nilai maksimum karakteristik tersebut di dalam objek memberikan peningkatan, kami tidak malas dan memutuskan untuk mencari auditweightsShowsCountBerikutnya ΠΈ auditweightsLikesCountBerikutnya, yaitu nilai-nilai pada saat berikutnya. Dengan menambahkan fitur
(auditweightsShowsCountNext-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountNext) kami melakukan lompatan tajam dengan cepat.
Kebocoran serupa dapat digunakan dengan mencari nilai berikut penggunaOwnerCounterCreateLikes dalam userId+ownerId dan, misalnya, bobot auditCtrGender dalam objectId+userGender. Kami menemukan 6 bidang serupa yang bocor dan mengekstrak informasi sebanyak mungkin darinya.

Pada saat itu, kami telah memeras informasi sebanyak mungkin dari fitur kolaboratif, namun tidak kembali ke kompetisi gambar dan teks. Saya punya ide bagus untuk memeriksa: seberapa besar manfaat yang diberikan fitur berdasarkan gambar atau teks dalam kompetisi yang relevan?

Tidak ada kebocoran dalam kompetisi gambar dan teks, tetapi pada saat itu saya telah mengembalikan parameter catboost default, membersihkan kode dan menambahkan beberapa fitur. Jumlahnya adalah:

keputusan segera
Maksimal dengan gambar 0.6411
Maksimum tidak ada gambar 0.6297
Hasil tempat kedua 0.6295

keputusan segera
Maksimal dengan teks 0.666
Maksimal tanpa teks 0.660
Hasil tempat kedua 0.656

keputusan segera
Maksimal dalam kolaboratif 0.745
Hasil tempat kedua 0.723

Menjadi jelas bahwa kami tidak mungkin dapat memanfaatkan banyak teks dan gambar, dan setelah mencoba beberapa ide yang paling menarik, kami berhenti mengerjakannya.

Fitur generasi lebih lanjut dalam sistem kolaboratif tidak memberikan peningkatan, dan kami mulai memberi peringkat. Pada tahap online, ansambel klasifikasi dan pemeringkatan memberi saya sedikit peningkatan, ternyata karena saya kurang melatih klasifikasinya. Tak satu pun dari fungsi kesalahan, termasuk YetiRanlPairwise, menghasilkan hasil yang mendekati hasil yang dilakukan LogLoss (0,745 vs. 0,725). Masih ada harapan untuk QueryCrossEntropy yang tidak dapat diluncurkan.

Tahap luring

Pada tahap offline, struktur datanya tetap sama, namun ada sedikit perubahan:

  • pengidentifikasi userId, objectId, ownerId diacak ulang;
  • beberapa tanda telah dihapus dan beberapa diganti namanya;
  • datanya meningkat sekitar 1,5 kali lipat.

Selain kesulitan-kesulitan di atas, ada satu nilai tambah yang besar: tim diberi server besar dengan RTX 2080TI. Saya sudah lama menikmati htop.
Hackathon SNA 2019

Hanya ada satu ide - untuk sekadar mereproduksi apa yang sudah ada. Setelah menghabiskan beberapa jam menyiapkan lingkungan di server, kami secara bertahap mulai memverifikasi bahwa hasilnya dapat direproduksi. Masalah utama yang kami hadapi adalah peningkatan volume data. Kami memutuskan untuk mengurangi beban sedikit dan mengatur parameter catboost ctr_complexity=1. Ini sedikit menurunkan kecepatan, tetapi model saya mulai berfungsi, hasilnya bagus - 0,733. Sergey berbeda dengan saya yang tidak membagi data menjadi 2 bagian dan melatih semua datanya, walaupun pada tahap online memberikan hasil terbaik, pada tahap offline banyak kesulitan. Jika kami mengambil semua fitur yang kami hasilkan dan mencoba memasukkannya ke dalam catboost, maka tidak ada yang akan berfungsi pada tahap online. Sergey melakukan optimasi tipe, misalnya mengubah tipe float64 menjadi float32. Pada artikel ini, Anda dapat menemukan informasi tentang pengoptimalan memori di pandas. Hasilnya, Sergey melatih CPU menggunakan semua data dan mendapatkan sekitar 0,735.

Hasil ini cukup untuk menang, tapi kami menyembunyikan kecepatan kami yang sebenarnya dan tidak yakin tim lain tidak melakukan hal yang sama.

Berjuang sampai akhir

Penyetelan Catboost

Solusi kami telah direproduksi sepenuhnya, kami menambahkan fitur data teks dan gambar, jadi yang tersisa hanyalah menyetel parameter catboost. Sergey berlatih pada CPU dengan sejumlah kecil iterasi, dan saya melatihnya dengan ctr_complexity=1. Masih ada satu hari lagi, dan jika Anda baru saja menambahkan iterasi atau meningkatkan ctr_complexity, maka di pagi hari Anda bisa mendapatkan kecepatan yang lebih baik dan berjalan sepanjang hari.

Pada tahap offline, kecepatan dapat dengan mudah disembunyikan hanya dengan memilih bukan solusi terbaik di situs. Kami mengharapkan perubahan drastis pada papan peringkat di menit-menit terakhir sebelum pengiriman ditutup dan memutuskan untuk tidak berhenti.

Dari video Anna, saya mengetahui bahwa untuk meningkatkan kualitas model, yang terbaik adalah memilih parameter berikut:

  • tingkat_belajar β€” Nilai default dihitung berdasarkan ukuran kumpulan data. Meningkatkan learning_rate memerlukan peningkatan jumlah iterasi.
  • l2_leaf_reg β€” Koefisien regularisasi, nilai default 3, sebaiknya pilih dari 2 hingga 30. Penurunan nilai akan menyebabkan peningkatan overfit.
  • mengantongi_suhu β€” menambahkan pengacakan pada bobot objek dalam sampel. Nilai defaultnya adalah 1, yang bobotnya diambil dari distribusi eksponensial. Penurunan nilai menyebabkan peningkatan overfit.
  • kekuatan_acak β€” Mempengaruhi pilihan pemisahan pada iterasi tertentu. Semakin tinggi kekuatan_acaknya, semakin tinggi peluang terpilihnya pemisahan dengan tingkat kepentingan rendah. Pada setiap iterasi berikutnya, keacakan berkurang. Penurunan nilai menyebabkan peningkatan overfit.

Parameter lain memiliki pengaruh yang jauh lebih kecil pada hasil akhir, jadi saya tidak mencoba memilihnya. Satu iterasi pelatihan pada kumpulan data GPU saya dengan ctr_complexity=1 memerlukan waktu 20 menit, dan parameter yang dipilih pada kumpulan data yang diperkecil sedikit berbeda dari parameter optimal pada kumpulan data lengkap. Pada akhirnya, saya melakukan sekitar 30 iterasi pada 10% data, dan kemudian sekitar 10 iterasi lagi pada semua data. Ternyata seperti ini:

  • tingkat_belajar Saya meningkatkan sebesar 40% dari default;
  • l2_leaf_reg biarkan tetap sama;
  • mengantongi_suhu ΠΈ kekuatan_acak dikurangi menjadi 0,8.

Kita dapat menyimpulkan bahwa model tersebut dilatih dengan parameter default.

Saya sangat terkejut ketika melihat hasilnya di papan peringkat:

Model model 1 model 2 model 3 ansambel
Tanpa penyetelan 0.7403 0.7404 0.7404 0.7407
Dengan penyetelan 0.7406 0.7405 0.7406 0.7408

Saya menyimpulkan sendiri bahwa jika penerapan model secara cepat tidak diperlukan, maka lebih baik mengganti pemilihan parameter dengan ansambel beberapa model menggunakan parameter yang tidak dioptimalkan.

Sergey sedang mengoptimalkan ukuran kumpulan data untuk dijalankan di GPU. Opsi paling sederhana adalah memotong sebagian data, tetapi ini dapat dilakukan dengan beberapa cara:

  • hapus data terlama secara bertahap (awal Februari) hingga kumpulan data mulai masuk ke dalam memori;
  • menghapus fitur dengan kepentingan paling rendah;
  • hapus userIds yang hanya ada satu entri;
  • sisakan hanya userIds yang di tes.

Dan pada akhirnya, buatlah ansambel dari semua opsi.

Ansambel terakhir

Menjelang sore hari terakhir, kami telah menyusun kumpulan model kami yang menghasilkan 0,742. Semalam saya meluncurkan model saya dengan ctr_complexity=2 dan bukannya 30 menit, model tersebut dilatih selama 5 jam. Baru pada jam 4 pagi dihitung, dan saya membuat ansambel terakhir, yang memberikan 0,7433 di papan peringkat publik.

Karena pendekatan yang berbeda dalam menyelesaikan masalah, prediksi kami tidak berkorelasi kuat, sehingga memberikan peningkatan yang baik dalam ansambel. Untuk mendapatkan ansambel yang baik, lebih baik menggunakan prediksi model mentah (prediction_type='RawFormulaVal') dan menyetel scale_pos_weight=neg_count/pos_count.

Hackathon SNA 2019

Di situs web Anda dapat melihatnya hasil akhir di papan peringkat pribadi.

Solusi lain

Banyak tim mengikuti aturan algoritma sistem pemberi rekomendasi. Saya, bukan ahli di bidang ini, tidak bisa mengevaluasinya, tapi saya ingat 2 solusi menarik.

  • Solusi Nikolay Anokhin. Nikolay, sebagai karyawan Mail.ru, tidak mengajukan hadiah, jadi tujuannya bukan untuk mencapai kecepatan maksimal, tetapi untuk mendapatkan solusi yang mudah diskalakan.
  • Keputusan tim pemenang Hadiah Juri didasarkan pada artikel ini dari facebook, memungkinkan pengelompokan gambar yang sangat baik tanpa pekerjaan manual.

Kesimpulan

Yang paling melekat dalam ingatan saya:

  • Jika ada fitur kategorikal dalam data, dan Anda tahu cara melakukan pengkodean target dengan benar, lebih baik mencoba catboost.
  • Jika Anda berpartisipasi dalam kompetisi, Anda tidak perlu membuang waktu untuk memilih parameter selain learning_rate dan iterasi. Solusi yang lebih cepat adalah dengan membuat kumpulan beberapa model.
  • Peningkatan dapat dipelajari di GPU. Catboost dapat belajar dengan sangat cepat pada GPU, tetapi memakan banyak memori.
  • Selama pengembangan dan pengujian ide, lebih baik menetapkan rsm~=0.2 kecil (hanya CPU) dan ctr_complexity=1.
  • Berbeda dengan tim lain, ansambel model kami memberikan peningkatan yang besar. Kami hanya bertukar pikiran dan menulis dalam bahasa berbeda. Kami memiliki pendekatan berbeda dalam membagi data dan, menurut saya, masing-masing memiliki bugnya sendiri.
  • Tidak jelas mengapa kinerja optimasi peringkat lebih buruk daripada optimasi klasifikasi.
  • Saya memperoleh pengalaman bekerja dengan teks dan pemahaman tentang bagaimana sistem pemberi rekomendasi dibuat.

Hackathon SNA 2019

Terima kasih kepada penyelenggara atas emosi, ilmu dan hadiah yang diterima.

Sumber: www.habr.com

Tambah komentar