SNA Hackathon 2019

2019-yilning fevral-mart oylarida ijtimoiy tarmoq tasmasi reytingini aniqlash bo‘yicha tanlov o‘tkazildi SNA Hackathon 2019, unda terma jamoamiz birinchi o'rinni egalladi. Maqolada men musobaqani tashkil etish, biz sinab ko'rgan usullar va katta ma'lumotlar bo'yicha treninglar uchun catboost sozlamalari haqida gapiraman.

SNA Hackathon 2019

SNA Hackathon

Bu nom ostida xakaton uchinchi marta o‘tkazilmoqda. U ok.ru ijtimoiy tarmog'i tomonidan tashkil etilgan, mos ravishda vazifa va ma'lumotlar bevosita ushbu ijtimoiy tarmoq bilan bog'liq.
SNA (ijtimoiy tarmoq tahlili) bu holda ijtimoiy grafik tahlili sifatida emas, balki ijtimoiy tarmoq tahlili sifatida to'g'riroq tushuniladi.

  • 2014-yilda vazifa postga qanday layk qo‘yishini bashorat qilish edi.
  • 2016 yilda - VVZ vazifasi (ehtimol, siz tanishsiz), ijtimoiy grafik tahliliga yaqinroq.
  • 2019-yilda foydalanuvchi tasmasini foydalanuvchiga postni yoqtirish ehtimoli asosida tartiblash.

Men 2014 yil haqida gapira olmayman, lekin 2016 va 2019 yillarda ma'lumotlarni tahlil qilish qobiliyatidan tashqari, katta ma'lumotlar bilan ishlash ko'nikmalari ham talab qilingan. O'ylaymanki, mashinani o'rganish va katta ma'lumotlarni qayta ishlash muammolari meni ushbu musobaqalarga jalb qildi va bu sohalardagi tajribam g'alaba qozonishimga yordam berdi.

mlbootcamp

2019 yilda musobaqa platformada tashkil etildi https://mlbootcamp.ru.

Tanlov 7-fevral kuni onlayn tarzda boshlandi va 3 ta topshiriqdan iborat edi. Har kim saytda ro'yxatdan o'tishi, yuklab olishi mumkin boshlang'ich nuqtasi va mashinangizni bir necha soatga yuklang. 15-mart kuni onlayn bosqich yakunida har bir shou-sakrash tadbirining eng yaxshi 15 nafari Mail.ru ofisiga 30-martdan 1-aprelgacha boʻlib oʻtgan oflayn bosqichga taklif qilindi.

Maqsad

Manba ma'lumotlari foydalanuvchi identifikatorlarini (userId) va post identifikatorlarini (objectId) beradi. Agar foydalanuvchiga post ko'rsatilgan bo'lsa, u holda ma'lumotlarda userId, objectId, foydalanuvchining ushbu postga munosabati (teskari aloqa) va turli funktsiyalar to'plami yoki rasmlar va matnlarga havolalar mavjud.

foydalanuvchi IDsi ob'ekt identifikatori egasi identifikatori fikringiz tasvirlar
3555 22 5677 [yoqdi, bosdi] [xesh1]
12842 55 32144 [yoqmadi] [hash2, hash3]
13145 35 5677 [bosilgan, baham ko'rilgan] [xesh2]

Sinov ma'lumotlar to'plami shunga o'xshash tuzilmani o'z ichiga oladi, ammo fikr-mulohaza maydoni yo'q. Vazifa - fikr-mulohaza sohasida "yoqdi" reaktsiyasi mavjudligini taxmin qilish.
Taqdim etish fayli quyidagi tuzilishga ega:

foydalanuvchi IDsi SortedList[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

Ko'rsatkich foydalanuvchilar uchun o'rtacha ROC AUC hisoblanadi.

Ma'lumotlarning batafsil tavsifini quyidagi manzilda topishingiz mumkin kengash sayti. Shuningdek, siz u erda ma'lumotlarni, jumladan, testlar va rasmlarni yuklab olishingiz mumkin.

Onlayn bosqich

Onlayn bosqichda topshiriq 3 qismga bo'lingan

  • Hamkorlik tizimi — tasvir va matnlardan tashqari barcha funksiyalarni o‘z ichiga oladi;
  • Rasmlar — faqat tasvirlar haqidagi maʼlumotlarni oʻz ichiga oladi;
  • Matnlar — faqat matnlar haqidagi maʼlumotlarni oʻz ichiga oladi.

Oflayn bosqich

Oflayn bosqichda ma'lumotlar barcha xususiyatlarni o'z ichiga olgan, matnlar va tasvirlar esa siyrak edi. Ma'lumotlar to'plamida 1,5 baravar ko'proq qatorlar mavjud edi, ularning ko'pi allaqachon mavjud edi.

Muammoning yechimi

Men ish joyida CV tayyorlaganim sababli, men ushbu tanlovda sayohatimni "Tasvirlar" topshirig'idan boshladim. Taqdim etilgan ma'lumotlar userId, objectId, ownerId (post chop etilgan guruh), post yaratish va ko'rsatish uchun vaqt belgilari va, albatta, ushbu post uchun rasm edi.
Vaqt belgilariga asoslangan bir nechta xususiyatlarni yaratgandan so'ng, keyingi g'oya imagenet-da oldindan o'qitilgan neyronning oxirgidan oldingi qatlamini olish va bu o'rnatishlarni kuchaytirishga yuborish edi.

SNA Hackathon 2019

Natijalar ta'sirchan emas edi. Imagenet neyronining o'rnatilishi ahamiyatsiz, men o'zimning avtokoderimni yaratishim kerak deb o'yladim.

SNA Hackathon 2019

Bu juda ko'p vaqt talab qildi va natija yaxshilanmadi.

Xususiyatlarni yaratish

Tasvirlar bilan ishlash juda ko'p vaqtni oladi, shuning uchun men oddiyroq narsani qilishga qaror qildim.
Ko'rib turganingizdek, ma'lumotlar to'plamida bir nechta toifali xususiyatlar mavjud va juda ko'p bezovta qilmaslik uchun men shunchaki catboost oldim. Yechim zo'r edi, hech qanday sozlamalarsiz men darhol peshqadamlar jadvalining birinchi qatoriga chiqdim.

Ma'lumotlar juda ko'p va ular parket formatida joylashtirilgan, shuning uchun ikki marta o'ylamasdan, men skala oldim va hamma narsani uchqun bilan yozishni boshladim.

Tasvirni joylashtirishdan ko'ra ko'proq o'sishni ta'minlagan eng oddiy xususiyatlar:

  • ma'lumotlarda objectId, userId va ownerId necha marta paydo bo'lgan (mashhurlik bilan bog'liq bo'lishi kerak);
  • userId ownerId dan nechta postni ko'rgan (foydalanuvchining guruhga bo'lgan qiziqishiga mos kelishi kerak);
  • Qancha noyob userIdlar ownerId-dan postlarni ko'rgan (guruh auditoriyasi hajmini aks ettiradi).

Vaqt belgilaridan foydalanuvchi tasmani tomosha qilgan kun vaqtini (ertalab/kunduzi/kechqurun/tun) olish mumkin edi. Ushbu toifalarni birlashtirib, siz xususiyatlarni yaratishda davom etishingiz mumkin:

  • userId kechqurun necha marta kirgan;
  • qaysi vaqtda bu post ko'pincha ko'rsatiladi (objectId) va hokazo.

Bularning barchasi ko'rsatkichlarni asta-sekin yaxshiladi. Ammo trening ma'lumotlar to'plamining hajmi taxminan 20 million yozuvni tashkil etadi, shuning uchun qo'shilgan xususiyatlar treningni sezilarli darajada sekinlashtirdi.

Men ma'lumotlardan foydalanishga bo'lgan yondashuvimni qayta ko'rib chiqdim. Ma'lumotlar vaqtga bog'liq bo'lsa-da, men "kelajakda" hech qanday aniq ma'lumotlarning sizib chiqishini ko'rmadim, ammo har ehtimolga qarshi, men uni quyidagicha buzdim:

SNA Hackathon 2019

Bizga taqdim etilgan o'quv majmuasi (fevral va mart oyining 2 haftasi) 2 qismga bo'lingan.
Model so'nggi N kunlik ma'lumotlar bo'yicha o'qitildi. Yuqorida tavsiflangan agregatlar barcha ma'lumotlar, jumladan, test asosida tuzilgan. Shu bilan birga, maqsadli o'zgaruvchining turli xil kodlashlarini yaratish mumkin bo'lgan ma'lumotlar paydo bo'ldi. Eng oddiy yondashuv allaqachon yangi xususiyatlarni yaratayotgan kodni qayta ishlatish va unga o'qitilmaydigan ma'lumotlarni berish va maqsad = 1.

Shunday qilib, biz o'xshash xususiyatlarga ega bo'ldik:

  • userId guruhning ownerId qismidagi postni necha marta ko'rgan;
  • userId foydalanuvchi ID guruhidagi postni necha marta yoqtirgan;
  • UserId egasiga yoqqan postlar foizi.

Ya'ni, shunday bo'ldi o'rtacha maqsadli kodlash kategorik xususiyatlarning turli kombinatsiyalari uchun ma'lumotlar to'plamining bir qismida. Aslida, catboost maqsadli kodlashni ham quradi va bu nuqtai nazardan hech qanday foyda yo'q, lekin, masalan, ushbu guruhdagi xabarlarni yoqtirgan noyob foydalanuvchilar sonini hisoblash mumkin bo'ldi. Shu bilan birga, asosiy maqsadga erishildi - mening ma'lumotlar to'plamim bir necha bor qisqartirildi va xususiyatlarni yaratishni davom ettirish mumkin edi.

Catboost faqat yoqqan reaktsiya asosida kodlashni yaratishi mumkin bo'lsa-da, fikr-mulohaza boshqa reaktsiyalarga ega: qayta ulashilgan, yoqtirilmagan, yoqtirilmagan, bosilgan, e'tiborga olinmagan, kodlashlar qo'lda bajarilishi mumkin. Men barcha turdagi agregatlarni qayta hisoblab chiqdim va ma'lumotlar to'plamini ko'paytirmaslik uchun ahamiyatsiz xususiyatlarni o'chirib tashladim.

O'shanda men katta farq bilan birinchi o'rinda edim. Ajablanadigan yagona narsa shundaki, tasvirni joylashtirish deyarli hech qanday o'sishni ko'rsatmadi. G'oya hamma narsani catboostga berish uchun keldi. Biz Kmeans tasvirlarini klasterlashtiramiz va imageCatning yangi toifali xususiyatini olamiz.

KMeans-dan olingan klasterlarni qo'lda filtrlash va birlashtirishdan keyin ba'zi sinflar.

SNA Hackathon 2019

imageCat asosida biz yaratamiz:

  • Yangi kategorik xususiyatlar:
    • userId tomonidan qaysi imageCat ko'proq ko'rilgan;
    • Qaysi imageCat ko'pincha ownerId ko'rsatadi;
    • userId tomonidan qaysi imageCat ko'proq yoqdi;
  • Turli xil hisoblagichlar:
    • Qancha noyob imageCat userId-ga qaradi;
    • 15 ga yaqin shunga o'xshash xususiyatlar va yuqorida tavsiflangan maqsadli kodlash.

Matnlar

Tasvirlar tanlovidagi natijalar menga mos keldi va men matnlarda o'z kuchimni sinab ko'rishga qaror qildim. Men oldin matnlar bilan ko'p ishlamaganman va ahmoqona kunni tf-idf va svd da o'ldirdim. Keyin men doc2vec bilan asosiy chiziqni ko'rdim, bu menga kerakli narsani bajaradi. Doc2vec parametrlarini biroz sozlagandan so'ng, men matn kiritishlarini oldim.

Va keyin men oddiygina tasvirlar uchun kodni qayta ishlatdim, unda tasvirni o'rnatishni matn kiritish bilan almashtirdim. Natijada matn tanlovida 2-o‘rinni egalladim.

Hamkorlik tizimi

Men hali tayoq bilan "pokmagan" bitta musobaqa qoldi va AUC reytingiga ko'ra, ushbu musobaqaning natijalari oflayn bosqichga eng katta ta'sir ko'rsatishi kerak edi.
Men manba ma'lumotlaridagi barcha xususiyatlarni oldim, toifalilarini tanladim va tasvirlarning o'ziga asoslangan xususiyatlar bundan mustasno, tasvirlar bilan bir xil agregatlarni hisobladim. Buni catboost-ga qo'yish meni 2-o'ringa olib chiqdi.

Catboost optimallashtirishning birinchi qadamlari

Bir birinchi va ikkita ikkinchi o'rinlar meni xursand qildi, lekin men hech qanday maxsus ish qilmaganligimni tushunishdi, demak, pozitsiyalarni yo'qotishni kutish mumkin edi.

Tanlovning maqsadi - foydalanuvchi ichidagi postlarni tartiblash va shu vaqt ichida men tasniflash muammosini, ya'ni noto'g'ri ko'rsatkichni optimallashtirishni hal qildim.

Sizga oddiy misol keltiraman:

foydalanuvchi IDsi ob'ekt identifikatori bashorat asosli haqiqat
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

Keling, kichik bir tartibga solish qilaylik

foydalanuvchi IDsi ob'ekt identifikatori bashorat asosli haqiqat
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

Biz quyidagi natijalarni olamiz:

Modeli AUC Foydalanuvchi 1 AUC Foydalanuvchi 2 AUC AUC degani
variant 1 0,8 1,0 0,0 0,5
variant 2 0,7 0,75 1,0 0,875

Ko'rib turganingizdek, umumiy AUC ko'rsatkichini yaxshilash foydalanuvchi ichidagi o'rtacha AUC ko'rsatkichini yaxshilashni anglatmaydi.

Catboost reyting ko'rsatkichlarini optimallashtirishni biladi qutidan. Men reyting ko'rsatkichlari haqida o'qidim, muvaffaqiyat hikoyalari catboost-dan foydalanganda va bir kechada mashq qilish uchun YetiRankPairwise-ni sozlang. Natija ta'sirchan emas edi. Meni kam o'qitilgan deb qaror qilib, xato funksiyasini QueryRMSE ga o'zgartirdim, bu catboost hujjatlariga ko'ra tezroq birlashadi. Oxir-oqibat, men tasniflash uchun mashg'ulotlarda bo'lgani kabi natijalarga erishdim, ammo bu ikki modelning ansambllari yaxshi o'sishni ta'minladi va bu meni uchta musobaqada birinchi o'ringa olib keldi.

"Hamkorlikdagi tizimlar" tanlovining onlayn bosqichi yopilishiga 5 daqiqa qolganida Sergey Shalnov meni ikkinchi o'ringa olib chiqdi. Biz birgalikda keyingi yo'lni bosib o'tdik.

Oflayn bosqichga tayyorgarlik

RTX 2080 TI video kartasi bilan onlayn bosqichda g'alaba qozonishimiz kafolatlangan edi, lekin 300 000 rubl miqdoridagi asosiy mukofot va, ehtimol, yakuniy birinchi o'rin ham bizni ushbu 2 hafta davomida ishlashga majbur qildi.

Ma'lum bo'lishicha, Sergey ham catboost ishlatgan. Biz fikr va xususiyatlarni almashdik va men buni bilib oldim Anna Veronika Dorogushning hisoboti Bu mening ko'plab savollarimga javoblarni o'z ichiga olgan va hatto o'sha paytgacha hali bo'lmagan savollarimga ham.

Hisobotni ko'rish meni barcha parametrlarni standart qiymatga qaytarishimiz va sozlamalarni juda ehtiyotkorlik bilan va faqat funktsiyalar to'plamini tuzatgandan so'ng bajarishimiz kerak degan fikrga olib keldi. Endi bitta mashg'ulot taxminan 15 soat davom etdi, ammo bitta model reyting bilan ansamblda olinganidan yaxshiroq tezlikka erishdi.

Xususiyatlarni yaratish

Birgalikda ishlaydigan tizimlar tanlovida model uchun juda ko'p xususiyatlar muhim deb baholanadi. Masalan, auditweights_spark_svd - eng muhim belgi, lekin uning ma'nosi haqida hech qanday ma'lumot yo'q. Muhim xususiyatlarga ko'ra turli agregatlarni sanash maqsadga muvofiq deb o'yladim. Masalan, foydalanuvchi, guruh, ob'ekt bo'yicha o'rtacha auditweights_spark_svd. Xuddi shu narsani hech qanday mashg'ulot o'tkazilmagan va maqsad = 1, ya'ni o'rtacha ma'lumotlar yordamida hisoblash mumkin auditweights_spark_svd foydalanuvchi tomonidan unga yoqqan ob'ektlar bo'yicha. Bundan tashqari, muhim belgilar auditweights_spark_svd, bir nechta bor edi. Mana ulardan ba'zilari:

  • auditweightsCtrGender
  • auditweightsCtrHigh
  • userOwnerCounterCreateLikes

Masalan, o'rtacha auditweightsCtrGender userId-ga ko'ra, bu o'rtacha qiymat kabi muhim xususiyat bo'lib chiqdi userOwnerCounterCreateLikes userId + ownerId tomonidan. Bu allaqachon sizni maydonlarning ma'nosini tushunishingiz kerak deb o'ylashingiz kerak.

Bundan tashqari, muhim xususiyatlar mavjud edi auditweightsLikesCount и auditweightsShowsCount. Bir-biriga bo'linib, yanada muhim xususiyatga ega bo'ldi.

Ma'lumotlar sizib chiqishi

Raqobat va ishlab chiqarishni modellashtirish juda boshqacha vazifalardir. Ma'lumotlarni tayyorlashda barcha tafsilotlarni hisobga olish va testdagi maqsadli o'zgaruvchi haqida ba'zi bir ahamiyatsiz ma'lumotlarni etkazmaslik juda qiyin. Agar biz ishlab chiqarish yechimini yaratayotgan bo'lsak, modelni o'rgatishda ma'lumotlar sizib chiqishidan foydalanishdan qochishga harakat qilamiz. Ammo agar biz raqobatda g'alaba qozonishni istasak, unda ma'lumotlarning sizib chiqishi eng yaxshi xususiyatdir.

Ma'lumotlarni o'rganib chiqib, siz buni objectId qiymatlariga ko'ra ko'rishingiz mumkin auditweightsLikesCount и auditweightsShowsCount o'zgarish, ya'ni ushbu xususiyatlarning maksimal qiymatlari nisbati postkonvertatsiyani ko'rsatish vaqtidagi nisbatdan ancha yaxshi aks ettiradi.

Biz topgan birinchi qochqin auditweightsLikesCountMax/auditweightsShowsCountMax.
Ammo ma'lumotlarni diqqat bilan ko'rib chiqsak nima bo'ladi? Keling, namoyish sanasi bo'yicha saralaymiz va olamiz:

ob'ekt identifikatori foydalanuvchi IDsi auditweightsShowsCount auditweightsLikesCount maqsad (yoqadi)
1 1 12 3 ehtimol yo'q
1 2 15 3 ehtimol Ha
1 3 16 4

Men birinchi bunday misolni topganimda hayratlanarli edi va mening bashoratim amalga oshmagani ma'lum bo'ldi. Ammo, ob'ekt ichidagi ushbu xususiyatlarning maksimal qiymatlari o'sishini hisobga olib, biz dangasa emasmiz va topishga qaror qildik. auditweightsShowsCountKeyingi и auditweightsLikesCountKeyingi, ya'ni vaqtning keyingi daqiqasidagi qiymatlar. Funktsiyani qo'shish orqali
(auditweightsShowsCountKeyingi audit vaznlariShowsCount)/(auditweightsLikesCount-auditweightsLikesCount Next) biz tezda keskin sakrashni amalga oshirdik.
Shu kabi qochqinlarni quyidagi qiymatlarni topish orqali ishlatish mumkin userOwnerCounterCreateLikes userId+ownerId ichida va, masalan, auditweightsCtrGender objectId+userGender ichida. Biz 6 ta o'xshash maydonni oqish bilan topdik va ulardan iloji boricha ko'proq ma'lumot oldik.

O'sha vaqtga kelib, biz birgalikdagi xususiyatlardan imkon qadar ko'proq ma'lumotni siqib chiqdik, lekin rasm va matn tanlovlariga qaytmadik. Menda tekshirish uchun ajoyib fikr bor edi: to'g'ridan-to'g'ri tasvirlar yoki matnlarga asoslangan xususiyatlar tegishli musobaqalarda qanchalik beradi?

Tasvir va matn tanlovlarida hech qanday oqish yo'q edi, lekin o'sha vaqtga kelib men standart catboost parametrlarini qaytardim, kodni tozaladim va bir nechta xususiyatlarni qo'shdim. Natijada:

qaror tez orada
Tasvirlar bilan maksimal 0.6411
Maksimal tasvir yo'q 0.6297
Ikkinchi o'rin natijasi 0.6295

qaror tez orada
Matnlar bilan maksimal 0.666
Matnsiz maksimal 0.660
Ikkinchi o'rin natijasi 0.656

qaror tez orada
Hamkorlikda maksimal 0.745
Ikkinchi o'rin natijasi 0.723

Ma'lum bo'ldiki, biz matnlar va tasvirlardan ko'p narsani siqib chiqara olmasligimiz dargumon va bir nechta qiziqarli g'oyalarni sinab ko'rganimizdan so'ng, biz ular bilan ishlashni to'xtatdik.

Birgalikda ishlaydigan tizimlardagi xususiyatlarning keyingi avlodi o'sishni ta'minlamadi va biz reytingni boshladik. Onlayn bosqichda tasniflash va reyting ansambli menga ozgina o'sish berdi, chunki men tasniflashni o'rganmaganman. Xato funksiyalarining hech biri, shu jumladan YetiRanlPairwise, LogLoss qilgan natijaga yaqin joyda ishlab chiqarilmadi (0,745 va 0,725). QueryCrossEntropy uchun hali ham umid bor edi, uni ishga tushirish mumkin emas edi.

Oflayn bosqich

Oflayn bosqichda ma'lumotlar strukturasi bir xil bo'lib qoldi, ammo kichik o'zgarishlar bo'ldi:

  • userId, objectId, ownerId identifikatorlari qayta tasodifiylashtirildi;
  • bir nechta belgilar olib tashlandi va bir nechtasi o'zgartirildi;
  • ma'lumotlar taxminan 1,5 barobar oshdi.

Ro'yxatdagi qiyinchiliklarga qo'shimcha ravishda, bitta katta plyus bor edi: jamoaga RTX 2080TI bilan katta server ajratildi. Men uzoq vaqt davomida htopdan zavqlanaman.
SNA Hackathon 2019

Faqat bitta g'oya bor edi - mavjud bo'lgan narsalarni shunchaki takrorlash. Serverda muhitni o'rnatish uchun bir necha soat sarflaganimizdan so'ng, biz asta-sekin natijalarni takrorlash mumkinligini tekshirishni boshladik. Biz duch kelayotgan asosiy muammo - bu ma'lumotlar hajmining oshishi. Biz yukni biroz kamaytirishga qaror qildik va catboost parametrini ctr_complexity=1 o'rnatdik. Bu tezlikni biroz pasaytiradi, lekin mening modelim ishlay boshladi, natija yaxshi - 0,733. Sergey, mendan farqli o'laroq, ma'lumotlarni 2 qismga ajratmadi va barcha ma'lumotlar bo'yicha mashq qildi, garchi bu onlayn bosqichda eng yaxshi natijalarni bergan bo'lsa-da, oflayn bosqichda juda ko'p qiyinchiliklar mavjud edi. Agar biz yaratgan barcha xususiyatlarni olib, ularni catboostga kiritishga harakat qilsak, onlayn bosqichda hech narsa ishlamaydi. Sergey turni optimallashtirishni amalga oshirdi, masalan, float64 turlarini float32 ga o'zgartirdi. Ushbu maqolada, Xotirani optimallashtirish haqida ma'lumotni pandalarda topishingiz mumkin. Natijada, Sergey barcha ma'lumotlardan foydalangan holda protsessorda mashq qildi va taxminan 0,735 ni oldi.

Bu natijalar g'alaba qozonish uchun yetarli edi, lekin biz o'zimizning haqiqiy tezlikimizni yashirdik va boshqa jamoalar ham shunday qilmayotganiga ishonch hosil qila olmadik.

Oxirigacha kurashing

Catboost sozlash

Bizning yechimimiz to'liq takrorlandi, biz matnli ma'lumotlar va tasvirlarning xususiyatlarini qo'shdik, shuning uchun faqat catboost parametrlarini sozlash qoldi. Sergey kam sonli iteratsiyalar bilan protsessorda mashq qildi, men esa ctr_complexity=1 bilan mashq qildim. Bir kun qoldi va agar siz faqat takrorlashlarni qo'shsangiz yoki ctr_complexity darajasini oshirsangiz, ertalabgacha tezroq tezlikka erishib, kun bo'yi yurishingiz mumkin edi.

Oflayn bosqichda saytdagi eng yaxshi yechimni tanlamasdan tezlikni osongina yashirish mumkin. Taqdimotlar yopilishidan oldin oxirgi daqiqalarda peshqadamlar jadvalida keskin o‘zgarishlar bo‘lishini kutdik va to‘xtamaslikka qaror qildik.

Annaning videosidan men model sifatini yaxshilash uchun quyidagi parametrlarni tanlash yaxshi ekanligini bilib oldim:

  • o'rganish_stavkasi — Standart qiymat maʼlumotlar toʻplamining oʻlchamiga qarab hisoblanadi. O'rganish_stavkasini oshirish iteratsiyalar sonini ko'paytirishni talab qiladi.
  • l2_leaf_reg — Regularizatsiya koeffitsienti, standart qiymat 3, afzalroq 2 dan 30 gacha tanlang. Qiymatni pasaytirish ortiqcha sig'imning oshishiga olib keladi.
  • yuklash_harorati — namunadagi ob'ektlarning og'irligiga tasodifiylikni qo'shadi. Standart qiymat 1 dir, bu erda og'irliklar eksponensial taqsimotdan olinadi. Qiymatni pasaytirish ortiqcha moslashishning oshishiga olib keladi.
  • tasodifiy_kuch - Muayyan iteratsiyada bo'linishlarni tanlashga ta'sir qiladi. Tasodifiy_kuch qanchalik baland bo'lsa, past ahamiyatga ega bo'linishning tanlanish ehtimoli shunchalik yuqori bo'ladi. Har bir keyingi iteratsiyada tasodifiylik kamayadi. Qiymatni pasaytirish ortiqcha moslashishning oshishiga olib keladi.

Boshqa parametrlar yakuniy natijaga ancha kichikroq ta'sir ko'rsatadi, shuning uchun men ularni tanlashga harakat qilmadim. ctr_complexity=1 bilan GPU maʼlumotlar toʻplamim boʻyicha treningning bir iteratsiyasi 20 daqiqa davom etdi va qisqartirilgan maʼlumotlar toʻplamidagi tanlangan parametrlar toʻliq maʼlumotlar toʻplamidagi optimal parametrlardan bir oz farq qildi. Oxir-oqibat, men ma'lumotlarning 30% bo'yicha 10 ga yaqin, keyin esa barcha ma'lumotlar bo'yicha yana 10 ga yaqin iteratsiya qildim. Bu shunday bo'ldi:

  • o'rganish_stavkasi Men standartdan 40% ga oshdim;
  • l2_leaf_reg uni xuddi shunday qoldirdi;
  • yuklash_harorati и tasodifiy_kuch 0,8 ga kamayadi.

Xulosa qilishimiz mumkinki, model standart parametrlar bilan o'rganilmagan.

Natijani peshqadamlar jadvalida ko'rganimda juda hayron bo'ldim:

Modeli model 1 model 2 model 3 ansambl
Sozlashsiz 0.7403 0.7404 0.7404 0.7407
Tuning bilan 0.7406 0.7405 0.7406 0.7408

Men o'zim uchun xulosaga keldimki, agar modelni tezda qo'llash kerak bo'lmasa, unda optimallashtirilmagan parametrlardan foydalangan holda parametrlarni tanlashni bir nechta modellar ansambli bilan almashtirish yaxshiroqdir.

Sergey ma'lumotlar to'plami hajmini GPUda ishlatish uchun optimallashtirdi. Eng oddiy variant - ma'lumotlarning bir qismini kesib tashlash, ammo bu bir necha usul bilan amalga oshirilishi mumkin:

  • ma'lumotlar to'plami xotiraga sig'ishni boshlamaguncha, eng eski ma'lumotlarni (fevral oyining boshi) asta-sekin olib tashlang;
  • eng kam ahamiyatga ega xususiyatlarni olib tashlash;
  • faqat bitta yozuv mavjud bo'lgan foydalanuvchi identifikatorlarini olib tashlang;
  • faqat testdagi foydalanuvchi identifikatorlarini qoldiring.

Va nihoyat, barcha variantlardan ansambl hosil qiling.

Oxirgi ansambl

Oxirgi kunning kechki oqshomida biz 0,742 ball olgan modellarimiz ansamblini yaratdik. Bir kechada men o'z modelimni ctr_complexity=2 bilan ishga tushirdim va 30 daqiqa o'rniga 5 soat mashq qildim. Faqat ertalab soat 4 da hisoblab chiqildi va men oxirgi ansamblni yaratdim, u umumiy reytingda 0,7433 ball berdi.

Muammoni hal qilishda turli yondashuvlar tufayli, bizning bashoratlarimiz kuchli o'zaro bog'liq emas edi, bu ansamblda yaxshi o'sishni ta'minladi. Yaxshi ansamblni olish uchun, bashorat qilishning xom modelidan foydalanish (prediction_type='RawFormulaVal') va scale_pos_weight=neg_count/pos_count ni o'rnatish yaxshiroqdir.

SNA Hackathon 2019

Saytda ko'rishingiz mumkin shaxsiy peshqadamlar jadvalidagi yakuniy natijalar.

Boshqa echimlar

Ko'pgina jamoalar tavsiya qiluvchi tizim algoritmlari qonunlariga amal qilishdi. Men, bu sohada mutaxassis bo'lmaganim uchun, ularni baholay olmayman, lekin ikkita qiziqarli echimni eslayman.

  • Nikolay Anoxinning yechimi. Mail.ru xodimi bo'lgan Nikolay sovrinlar uchun ariza bermadi, shuning uchun uning maqsadi maksimal tezlikka erishish emas, balki oson kengaytiriladigan yechimni olish edi.
  • Hakamlar hay'ati sovrindori jamoa qaroriga asoslanadi ushbu maqola facebookdan, qo'lda ishlamasdan tasvirni juda yaxshi klasterlash imkonini berdi.

xulosa

Xotiramda eng ko'p saqlanib qolgan narsa:

  • Agar ma'lumotlarda kategorik xususiyatlar mavjud bo'lsa va siz maqsadli kodlashni qanday qilib to'g'ri bajarishni bilsangiz, catboost-ni sinab ko'rish yaxshiroqdir.
  • Agar siz tanlovda qatnashayotgan bo'lsangiz, o'rganish_stavkasi va takrorlashdan boshqa parametrlarni tanlashga vaqt sarflamasligingiz kerak. Tezroq yechim bir nechta modellardan iborat ansambl qilishdir.
  • Boostinglarni GPUda o'rganish mumkin. Catboost GPU-da juda tez o'rganishi mumkin, lekin u juda ko'p xotirani egallaydi.
  • G'oyalarni ishlab chiqish va sinovdan o'tkazish vaqtida kichik rsm~=0.2 (faqat CPU) va ctr_complexity=1 o'rnatilgan ma'qul.
  • Boshqa jamoalardan farqli o'laroq, bizning modellarimiz ansambli katta o'sish berdi. Biz faqat fikr almashdik va turli tillarda yozdik. Bizda ma'lumotlarni bo'lishda boshqacha yondashuv bor edi va menimcha, har birining o'z xatolari bor edi.
  • Nima uchun reytingni optimallashtirish tasniflashdan ko'ra yomonroq bo'lganligi aniq emas.
  • Men matnlar bilan ishlashda biroz tajribaga ega bo'ldim va tavsiya qiluvchi tizimlar qanday yaratilganligi haqida tushunchaga ega bo'ldim.

SNA Hackathon 2019

Tashkilotchilarga hissiyotlar, bilimlar va olingan sovg'alar uchun rahmat.

Manba: www.habr.com

a Izoh qo'shish