SNA Hackathon 2019

2019-cu ilin fevral-mart aylarında sosial şəbəkə lentinin reytinqi üzrə müsabiqə keçirilib SNA Hackathon 2019, komandamız birinci yeri tutdu. Məqalədə müsabiqənin təşkili, sınaqdan keçirdiyimiz üsullar və big data üzrə təlim üçün catboost parametrləri haqqında danışacağam.

SNA Hackathon 2019

SNA Hackathon

Bu ad altında üçüncü dəfədir ki, hakaton keçirilir. Bu, ok.ru sosial şəbəkəsi tərəfindən təşkil edilir, müvafiq olaraq, tapşırıq və məlumatlar birbaşa bu sosial şəbəkə ilə bağlıdır.
SNA (sosial şəbəkə təhlili) bu halda sosial qrafikin təhlili kimi deyil, sosial şəbəkənin təhlili kimi daha düzgün başa düşülür.

  • 2014-cü ildə vəzifə bir postun əldə edəcəyi bəyənmələrin sayını proqnozlaşdırmaq idi.
  • 2016-cı ildə - VVZ tapşırığı (bəlkə də tanışsınız), sosial qrafikin təhlilinə daha yaxındır.
  • 2019-cu ildə istifadəçinin yazısını bəyənmə ehtimalına əsasən istifadəçi lentini sıralayır.

2014-cü il haqqında deyə bilmərəm, lakin 2016 və 2019-cu illərdə məlumatların təhlili bacarıqları ilə yanaşı, böyük verilənlərlə işləmək bacarığı da tələb olunurdu. Düşünürəm ki, məni bu yarışlara cəlb edən maşın öyrənməsi və böyük verilənlərin emalı problemlərinin birləşməsi oldu və bu sahələrdəki təcrübəm qalib gəlməyə kömək etdi.

mlbootcamp

2019-cu ildə müsabiqə platformada təşkil olunub https://mlbootcamp.ru.

Müsabiqə onlayn rejimdə fevralın 7-də başlayıb və 3 tapşırıqdan ibarət olub. İstənilən şəxs saytda qeydiyyatdan keçə bilər, yükləyə bilər ilkin və avtomobilinizi bir neçə saat yükləyin. Martın 15-də onlayn mərhələnin sonunda hər bir şou-tullantı tədbirinin ən yaxşı 15-i martın 30-dan aprelin 1-dək baş tutan oflayn mərhələ üçün Mail.ru ofisinə dəvət edildi.

Tapşırıq

Mənbə məlumatları istifadəçi identifikatorlarını (userId) və post ID'lərini (objectId) təmin edir. Əgər istifadəçiyə yazı göstərilibsə, o zaman məlumatda userId, objectId, istifadəçinin bu yazıya reaksiyaları (əks əlaqə) və müxtəlif funksiyalar dəsti və ya şəkillərə və mətnlərə keçidlərdən ibarət sətir var.

İstifadəçi adı obyekt ID sahib ID Geribildirim şəkillər
3555 22 5677 [bəyəndim, tıkladım] [hash1]
12842 55 32144 [bəyənmədi] [hash2, hash3]
13145 35 5677 [tıklandı, paylaşıldı] [hash2]

Test məlumat dəstində oxşar struktur var, lakin əks əlaqə sahəsi yoxdur. Tapşırıq geribildirim sahəsində "bəyəndim" reaksiyasının mövcudluğunu proqnozlaşdırmaqdır.
Təqdimat faylı aşağıdakı quruluşa malikdir:

İstifadəçi adı SortedList[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

Metrik istifadəçilər üçün orta ROC AUC-dir.

Məlumatların daha ətraflı təsviri ilə tanış ola bilərsiniz şuranın saytı. Siz həmçinin orada testlər və şəkillər daxil olmaqla məlumatları yükləyə bilərsiniz.

Onlayn mərhələ

Onlayn mərhələdə tapşırıq 3 hissəyə bölündü

  • Kollektiv sistem — şəkillər və mətnlər istisna olmaqla, bütün funksiyalar daxildir;
  • Şəkillər — yalnız şəkillər haqqında məlumat daxildir;
  • Mətnlər — yalnız mətnlər haqqında məlumat daxildir.

Offline mərhələ

Oflayn mərhələdə məlumatlara bütün funksiyalar daxil idi, mətnlər və şəkillər isə seyrək idi. Verilənlər toplusunda 1,5 dəfə çox cərgə var idi, onlardan çoxu var idi.

Problemin həlli

İş yerində CV hazırladığım üçün bu müsabiqədə səyahətimə “Şəkillər” tapşırığı ilə başladım. Təqdim olunan məlumatlar userId, objectId, ownerId (yazının dərc olunduğu qrup), postun yaradılması və nümayişi üçün vaxt ştampları və təbii ki, bu yazının şəkli idi.
Vaxt ştamplarına əsaslanan bir neçə xüsusiyyət yaradandan sonra növbəti fikir imagenet-də əvvəlcədən öyrədilmiş neyronun sondan əvvəlki təbəqəsini götürmək və bu əlavələri gücləndirməyə göndərmək idi.

SNA Hackathon 2019

Nəticələr təsir edici deyildi. Imagenet neyronunun yerləşdirilməsi əhəmiyyətsizdir, düşündüm ki, öz avtokoderimi düzəltməliyəm.

SNA Hackathon 2019

Çox vaxt apardı və nəticə yaxşılaşmadı.

Xüsusiyyət generasiyası

Şəkillərlə işləmək çox vaxt aparır, ona görə də daha sadə bir şey etmək qərarına gəldim.
Dərhal gördüyünüz kimi, verilənlər bazasında bir neçə kateqoriyalı xüsusiyyət var və çox narahat olmamaq üçün sadəcə catboost aldım. Həll əla idi, heç bir parametr olmadan dərhal liderlər cədvəlinin birinci sətirinə keçdim.

Kifayət qədər çox məlumat var və onlar parket formatında yerləşdirilib, ona görə də iki dəfə düşünmədən skala götürüb hər şeyi qığılcımla yazmağa başladım.

Şəkil yerləşdirmədən daha çox artım verən ən sadə xüsusiyyətlər:

  • məlumatda objectId, userId və ownerId neçə dəfə göründü (populyarlıqla əlaqələndirilməlidir);
  • userId sahibinin kimliyindən neçə yazı görüb (istifadəçinin qrupa marağı ilə əlaqələndirilməlidir);
  • neçə unikal userId sahibinin ismarıclarına baxıb (qrupun auditoriyasının ölçüsünü əks etdirir).

Vaxt ştamplarından istifadəçinin lentə baxdığı günün vaxtını (səhər/günorta/axşam/gecə) əldə etmək mümkün idi. Bu kateqoriyaları birləşdirməklə siz funksiyalar yaratmağa davam edə bilərsiniz:

  • userId axşam neçə dəfə daxil olub;
  • bu yazı ən çox hansı vaxtda göstərilir (objectId) və s.

Bütün bunlar metrikləri tədricən təkmilləşdirdi. Lakin təlim məlumat dəstinin ölçüsü təxminən 20 milyon qeyddir, ona görə də funksiyaların əlavə edilməsi təlimi xeyli yavaşlatdı.

Mən məlumatlardan istifadəyə yanaşmamı yenidən düşünmüşəm. Məlumatların zamandan asılı olmasına baxmayaraq, mən “gələcəkdə” heç bir açıq-aşkar məlumat sızması görmədim, buna baxmayaraq, hər halda, mən onu bu şəkildə parçaladım:

SNA Hackathon 2019

Bizə verilən məşq dəsti (fevral və martın 2 həftəsi) 2 hissəyə bölündü.
Model son N günün məlumatları üzərində təlim keçib. Yuxarıda təsvir edilən birləşmələr test daxil olmaqla bütün məlumatlar üzərində qurulmuşdur. Eyni zamanda, hədəf dəyişənin müxtəlif kodlaşdırmalarını qurmaq mümkün olan məlumatlar ortaya çıxdı. Ən sadə yanaşma, artıq yeni funksiyalar yaradan kodu təkrar istifadə etmək və sadəcə ona öyrədilməyəcəyi məlumatları qidalandırmaq və hədəf = 1 etməkdir.

Beləliklə, oxşar xüsusiyyətləri əldə etdik:

  • userId qrup sahibinin identifikatorunda postu neçə dəfə görüb;
  • userId qrup sahibində postu neçə dəfə bəyəndi;
  • UserId-in sahibinin kimliyindən bəyəndiyi yazıların faizi.

Yəni məlum oldu orta hədəf kodlaşdırması kateqoriyalı xüsusiyyətlərin müxtəlif kombinasiyaları üçün verilənlər bazasının bir hissəsində. Prinsipcə, catboost da hədəf kodlamasını qurur və bu baxımdan heç bir faydası yoxdur, lakin, məsələn, bu qrupdakı yazıları bəyənən unikal istifadəçilərin sayını saymaq mümkün oldu. Eyni zamanda, əsas məqsədə nail olundu - verilənlər bazam bir neçə dəfə azaldıldı və funksiyalar yaratmağa davam etmək mümkün oldu.

Catboost yalnız bəyənilən reaksiya əsasında kodlaşdırma qura bilsə də, rəyin başqa reaksiyaları da var: yenidən paylaşılmış, bəyənilməmiş, bəyənilməmiş, kliklənmiş, göz ardı edilmiş, kodlaşdırmalar əl ilə edilə bilər. Mən hər cür aqreqatları yenidən hesabladım və verilənlər bazasını şişirtməmək üçün əhəmiyyəti az olan xüsusiyyətləri aradan qaldırdım.

O vaxt böyük fərqlə birinci yerdə idim. Çaşqınlıq yaradan yeganə şey, təsvirin yerləşdirilməsinin demək olar ki, heç bir artım göstərməməsi idi. Fikir catboost üçün hər şeyi vermək üçün gəldi. Biz Kmeans şəkillərini yığırıq və imageCat-ın yeni kateqoriyalı xüsusiyyətini əldə edirik.

KMeans-dan əldə edilən klasterlərin əl ilə süzülməsi və birləşməsindən sonra bəzi siniflər buradadır.

SNA Hackathon 2019

imageCat əsasında biz yaradırıq:

  • Yeni kateqoriyalı xüsusiyyətlər:
    • Hansı imageCat ən çox userId tərəfindən baxılıb;
    • Hansı imageCat ən çox sahib identifikatorunu göstərir;
    • userId tərəfindən ən çox hansı imageCat bəyənilib;
  • Müxtəlif sayğaclar:
    • Neçə unikal imageCat userId-ə baxdı;
    • Təxminən 15 oxşar xüsusiyyət və yuxarıda təsvir olunduğu kimi hədəf kodlaşdırma.

Mətnlər

Təsvir müsabiqəsindəki nəticələr mənə uyğun gəldi və mən mətnlərdə özümü sınamaq qərarına gəldim. Mən əvvəllər mətnlərlə çox işləməmişəm və axmaqcasına tf-idf və svd-də günü öldürmüşəm. Sonra doc2vec ilə əsas xətti gördüm, bu da mənə lazım olanı edir. doc2vec parametrlərini bir az tənzimlədikdən sonra mətn daxiletmələri əldə etdim.

Və sonra mən sadəcə olaraq şəkillərin kodunu təkrar istifadə etdim, burada şəkil əlavələrini mətn daxiletmələri ilə əvəz etdim. Nəticədə mətn müsabiqəsində 2-ci yeri tutdum.

Kollektiv sistem

Hələ bir çubuqla "sürmədiyim" bir yarış qaldı və liderlər lövhəsindəki AUC-a görə, bu xüsusi müsabiqənin nəticələri oflayn mərhələdə ən çox təsir etməli idi.
Mənbə məlumatlarında olan bütün xüsusiyyətləri götürdüm, kateqoriyalı olanları seçdim və şəkillərin özlərinə əsaslanan xüsusiyyətlər istisna olmaqla, şəkillərlə eyni aqreqatları hesabladım. Sadəcə bunu catboost-a qoymaq məni 2-ci yerə apardı.

Catboost optimallaşdırmasının ilk addımları

Bir birinci və iki ikinci yer məni sevindirdi, amma belə bir anlayış var idi ki, mən xüsusi bir iş görməmişəm, yəni mövqelərin itirilməsini gözləyə bilərdim.

Müsabiqənin vəzifəsi istifadəçi daxilində yazıları sıralamaqdır və bütün bu müddət ərzində mən təsnifat problemini həll edirdim, yəni səhv metrikanı optimallaşdırırdım.

Sizə sadə bir misal verim:

İstifadəçi adı obyekt ID qabaqcadan xəbər vermə əsas həqiqət
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

Kiçik bir tənzimləmə edək

İstifadəçi adı obyekt ID qabaqcadan xəbər vermə əsas həqiqət
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

Aşağıdakı nəticələri alırıq:

Model AUC İstifadəçi1 AUC İstifadəçi2 AUC AUC deməkdir
Seçim 1 0,8 1,0 0,0 0,5
Seçim 2 0,7 0,75 1,0 0,875

Gördüyünüz kimi, ümumi AUC metrikasını yaxşılaşdırmaq istifadəçi daxilində orta AUC metrikasını yaxşılaşdırmaq demək deyil.

Catboost sıralama ölçülərini optimallaşdırmağı bilir qutudan. Reytinq göstəriciləri haqqında oxudum, uğur hekayələri catboost istifadə edərkən və bir gecədə məşq etmək üçün YetiRankPairwise seçin. Nəticə təsirli olmadı. Təlimsiz olduğumu qərara alaraq, səhv funksiyasını QueryRMSE-ə dəyişdim, bu, catboost sənədlərinə əsasən daha sürətli birləşir. Sonda təsnifat üçün məşq edərkən eyni nəticələr əldə etdim, lakin bu iki modelin ansamblları yaxşı artım verdi, bu da məni hər üç müsabiqədə birinci yerə gətirdi.

“Birgə sistemlər” müsabiqəsinin onlayn mərhələsinin bağlanmasına 5 dəqiqə qalmış Sergey Şalnov məni ikinci yerə daşıdı. Sonrakı yolu birlikdə getdik.

Oflayn mərhələyə hazırlaşır

RTX 2080 TI video kartı ilə onlayn mərhələdə qələbəyə zəmanət verdik, lakin 300 rubl əsas mükafat və çox güman ki, son birinci yer bizi bu 000 həftə ərzində işləməyə məcbur etdi.

Məlum olub ki, Sergey də catboost-dan istifadə edib. Biz fikir və xüsusiyyətlər mübadiləsi apardıq və mən də öyrəndim Anna Veronika Doroquşun hesabatı bir çox suallarıma, hətta o vaxta qədər almadığım suallara cavablar var idi.

Hesabata baxmaq məni bütün parametrləri standart dəyərə qaytarmalı və parametrləri çox diqqətlə və yalnız bir sıra funksiyaları düzəltdikdən sonra etməli olduğumuz fikrinə gətirdi. İndi bir məşq təxminən 15 saat çəkdi, lakin bir model reytinqlə ansamblda əldə ediləndən daha yüksək sürət əldə edə bildi.

Xüsusiyyət generasiyası

Collaborative Systems yarışmasında çoxlu sayda xüsusiyyət model üçün vacib kimi qiymətləndirilir. Misal üçün, auditweights_spark_svd - ən vacib əlamətdir, lakin onun nə demək olduğu barədə məlumat yoxdur. Müxtəlif aqreqatları vacib xüsusiyyətlərə əsasən saymağın məqsədəuyğun olacağını düşündüm. Məsələn, istifadəçi, qrup, obyekt üzrə orta auditweights_spark_svd. Eyni, heç bir məşq edilməmiş və hədəf = 1, yəni orta olan məlumatlardan istifadə etməklə hesablana bilər auditweights_spark_svd istifadəçi tərəfindən bəyəndiyi obyektlərə görə. Bundan başqa vacib əlamətlər auditweights_spark_svd, bir neçə var idi. Onlardan bəzilərini təqdim edirik:

  • auditweightsCtrGender
  • auditweightsCtrHigh
  • userOwnerCounterCreateLikes

Məsələn, orta auditweightsCtrGender userId görə, orta dəyər kimi vacib bir xüsusiyyət olduğu ortaya çıxdı userOwnerCounterCreateLikes userId+ownerId ilə. Bu, artıq sizi sahələrin mənasını anlamaq lazım olduğunu düşünməyə vadar etməlidir.

Həm də mühüm xüsusiyyətlər idi auditweightsLikesCount и auditweightsShowsCount. Bir-birini ayıraraq daha vacib bir xüsusiyyət əldə edildi.

Məlumat sızması

Rəqabət və istehsalın modelləşdirilməsi çox fərqli vəzifələrdir. Məlumat hazırlayarkən, bütün detalları nəzərə almaq və testdə hədəf dəyişən haqqında bəzi qeyri-trivial məlumatları çatdırmamaq çox çətindir. İstehsal həlli yaradırıqsa, modeli öyrədərkən məlumat sızmasından istifadə etməməyə çalışacağıq. Ancaq rəqabətdə qalib gəlmək istəyiriksə, məlumat sızması ən yaxşı xüsusiyyətlərdir.

Məlumatları tədqiq etdikdən sonra bunu obyektId dəyərlərinə görə görə bilərsiniz auditweightsLikesCount и auditweightsShowsCount dəyişiklik, yəni bu xüsusiyyətlərin maksimum dəyərlərinin nisbəti post-konversiyanı nümayiş zamanı nisbətdən daha yaxşı əks etdirəcəkdir.

Tapdığımız ilk sızmadır auditweightsLikesCountMax/auditweightsShowsCountMax.
Bəs məlumatlara daha yaxından baxsaq nə olacaq? Gəlin nümayiş tarixinə görə sıralayaq və əldə edək:

obyekt ID İstifadəçi adı auditweightsShowsCount auditweightsLikesCount hədəf (bəyəndim)
1 1 12 3 yəqin ki, yox
1 2 15 3 bəlkə bəli
1 3 16 4

İlk belə nümunəni tapanda təəccübləndim və proqnozum özünü doğrultmadı. Ancaq obyekt daxilində bu xüsusiyyətlərin maksimum dəyərlərinin artdığını nəzərə alaraq, biz tənbəl olmadıq və tapmaq qərarına gəldik. auditweightsShowsCountNext и auditweightsLikesCountNext, yəni növbəti andakı dəyərlər. Xüsusiyyət əlavə etməklə
(auditweightsShowsCountNext-auditweightsShowsCount)/(auditweightsLikesCount-auditweights LikesCount-Next) sürətlə kəskin sıçrayış etdik.
Oxşar sızıntılar üçün aşağıdakı dəyərləri tapmaqla istifadə edilə bilər userOwnerCounterCreateLikes userId+ownerId daxilində və məsələn, auditweightsCtrGender objectId+userGender daxilində. Biz sızması olan 6 oxşar sahə tapdıq və onlardan mümkün qədər çox məlumat çıxardıq.

O vaxta qədər biz əməkdaşlıq xüsusiyyətlərindən mümkün qədər çox məlumatı sıxışdırmışdıq, lakin şəkil və mətn müsabiqələrinə qayıtmadıq. Yoxlamaq üçün gözəl bir fikrim var idi: şəkillərə və ya mətnlərə birbaşa əsaslanan xüsusiyyətlər müvafiq müsabiqələrdə nə qədər verir?

Şəkil və mətn müsabiqələrində heç bir sızma yox idi, lakin o vaxta qədər mən standart catboost parametrlərini qaytardım, kodu təmizlədim və bir neçə xüsusiyyət əlavə etdim. Cəmi idi:

qərar tezliklə
Şəkillərlə maksimum 0.6411
Maksimum şəkil yoxdur 0.6297
İkinci yer nəticəsi 0.6295

qərar tezliklə
Mətnlərlə maksimum 0.666
Mətnlər olmadan maksimum 0.660
İkinci yer nəticəsi 0.656

qərar tezliklə
Əməkdaşlıqda maksimum 0.745
İkinci yer nəticəsi 0.723

Məlum oldu ki, mətnlərdən və şəkillərdən çox şey çıxara bilməyəcəyik və bir neçə ən maraqlı ideyanı sınadıqdan sonra onlarla işləməyi dayandırdıq.

Birgə sistemlərdə funksiyaların sonrakı nəsli artım vermədi və biz sıralamağa başladıq. Onlayn mərhələdə təsnifat və sıralama ansamblı mənə kiçik bir artım verdi, çünki təsnifatı az hazırladığım üçün ortaya çıxdı. YetiRanlPairwise daxil olmaqla, xəta funksiyalarının heç biri LogLoss-un göstərdiyi nəticəyə yaxın yerdə yaranmadı (0,745-ə qarşı 0,725). QueryCrossEntropy üçün hələ də ümid var idi, onu işə salmaq mümkün deyildi.

Offline mərhələ

Oflayn mərhələdə məlumat strukturu eyni qaldı, lakin kiçik dəyişikliklər oldu:

  • userId, objectId, ownerId identifikatorları yenidən təsadüfiləşdirildi;
  • bir neçə işarə çıxarıldı və bir neçəsinin adı dəyişdirildi;
  • məlumatlar təxminən 1,5 dəfə artmışdır.

Sadalanan çətinliklərə əlavə olaraq, bir böyük artı var idi: komandaya RTX 2080TI ilə böyük bir server ayrıldı. Uzun müddətdir htopdan həzz alıram.
SNA Hackathon 2019

Yalnız bir fikir var idi - sadəcə olaraq mövcud olanı təkrarlamaq. Serverdə mühitin qurulmasına bir neçə saat sərf etdikdən sonra biz tədricən nəticələrin təkrar oluna biləcəyini yoxlamağa başladıq. Qarşılaşdığımız əsas problem məlumatların həcminin artmasıdır. Yükü bir az azaltmaq və catboost parametrini ctr_complexity=1 təyin etmək qərarına gəldik. Bu, sürəti bir az azaldır, amma modelim işə başladı, nəticə yaxşı idi - 0,733. Sergey, məndən fərqli olaraq, məlumatları 2 hissəyə bölmədi və bütün məlumatlar üzərində məşq etdi, baxmayaraq ki, bu, onlayn mərhələdə ən yaxşı nəticələr verdi, oflayn mərhələdə bir çox çətinliklər var idi. Yaratdığımız bütün xüsusiyyətləri götürsək və onları catboost-a qovuşdurmağa çalışsaq, onlayn mərhələdə heç nə işləməyəcək. Sergey tipi optimallaşdırma etdi, məsələn, float64 növlərini float32-ə çevirdi. Bu yazıda, Yaddaşın optimallaşdırılması haqqında məlumatı pandalarda tapa bilərsiniz. Nəticədə, Sergey bütün məlumatlardan istifadə edərək CPU-da məşq etdi və təxminən 0,735 aldı.

Bu nəticələr qalib gəlmək üçün kifayət idi, lakin biz əsl sürətimizi gizlətdik və digər komandaların da belə etmədiyinə əmin ola bilmədik.

Sonuna qədər mübarizə aparın

Catboost tuning

Bizim həllimiz tamamilə təkrarlandı, mətn məlumatlarının və şəkillərin xüsusiyyətlərini əlavə etdik, buna görə də yalnız catboost parametrlərini tənzimləmək qaldı. Sergey az sayda iterasiya ilə CPU üzərində məşq etdi, mən isə ctr_complexity=1 olan birində məşq etdim. Bir gün qaldı və əgər siz sadəcə təkrarlamalar əlavə etsəniz və ya ctr_complexity-i artırsanız, səhərə qədər daha da yaxşı sürət əldə edə və bütün günü gəzə bilərsiniz.

Oflayn mərhələdə, saytdakı ən yaxşı həlli seçməklə sürətləri çox asanlıqla gizlətmək olar. Təqdimatlar bağlanana qədər son dəqiqələrdə liderlər cədvəlində kəskin dəyişikliklər gözləyirdik və dayanmamaq qərarına gəldik.

Annanın videosundan öyrəndim ki, modelin keyfiyyətini yaxşılaşdırmaq üçün aşağıdakı parametrləri seçmək daha yaxşıdır:

  • öyrənmə_dərəcəsi — Defolt dəyər verilənlər dəstinin ölçüsünə əsasən hesablanır. Öyrənmə_dərəcəsinin artırılması təkrarların sayının artırılmasını tələb edir.
  • l2_leaf_reg — Tənzimləmə əmsalı, defolt dəyər 3, tercihen 2-dən 30-a kimi seçin. Dəyərin azaldılması həddindən artıq uyğunluğun artmasına səbəb olur.
  • torbalama_temperatur — nümunədəki obyektlərin çəkilərinə təsadüfiləşdirmə əlavə edir. Defolt dəyər 1-dir, burada çəkilər eksponensial paylanmadan götürülür. Dəyərin azalması həddindən artıq uyğunluğun artmasına səbəb olur.
  • təsadüfi_güc — Müəyyən bir iterasiyada bölünmələrin seçilməsinə təsir göstərir. Təsadüfi_gücü nə qədər yüksəkdirsə, aşağı əhəmiyyət kəsbinin seçilmə şansı bir o qədər yüksəkdir. Hər növbəti iterasiyada təsadüfilik azalır. Dəyərin azalması həddindən artıq uyğunluğun artmasına səbəb olur.

Digər parametrlər son nəticəyə daha az təsir göstərir, ona görə də onları seçməyə çalışmadım. ctr_complexity=1 ilə GPU verilənlər dəstimdə təlimin bir iterasiyası 20 dəqiqə çəkdi və azaldılmış verilənlər bazasında seçilmiş parametrlər tam verilənlər bazasındakı optimal parametrlərdən bir qədər fərqli idi. Sonda verilənlərin 30%-i üzrə təxminən 10 təkrarlama, sonra isə bütün məlumatlar üzrə təxminən 10 təkrarlama etdim. Belə bir şey çıxdı:

  • öyrənmə_dərəcəsi Mən standartdan 40% artırdım;
  • l2_leaf_reg onu eyni qoydu;
  • torbalama_temperatur и təsadüfi_güc 0,8-ə endirildi.

Belə nəticəyə gələ bilərik ki, model standart parametrlərə uyğunlaşdırılmayıb.

Nəticəni liderlər lövhəsində görəndə çox təəccübləndim:

Model model 1 model 2 model 3 ansamblı
Tuning olmadan 0.7403 0.7404 0.7404 0.7407
Tuning ilə 0.7406 0.7405 0.7406 0.7408

Özüm üçün belə bir nəticəyə gəldim ki, modelin sürətli tətbiqinə ehtiyac yoxdursa, parametrlərin seçimini optimallaşdırılmamış parametrlərdən istifadə edərək bir neçə modeldən ibarət ansamblı ilə əvəz etmək daha yaxşıdır.

Sergey onu GPU-da işlətmək üçün məlumat dəstinin ölçüsünü optimallaşdırırdı. Ən sadə seçim məlumatların bir hissəsini kəsməkdir, lakin bu bir neçə yolla edilə bilər:

  • verilənlər toplusu yaddaşa sığmağa başlayana qədər ən köhnə məlumatları (fevralın əvvəli) tədricən çıxarın;
  • ən az əhəmiyyət kəsb edən xüsusiyyətləri silmək;
  • yalnız bir giriş olan istifadəçi identifikatorlarını silin;
  • yalnız testdə olan userID-ləri buraxın.

Və nəhayət, bütün variantlardan bir ansambl hazırlayın.

Son ansambl

Keçən günün axşam saatlarında biz 0,742 nəticə verən modellərimizdən ibarət ansambl hazırladıq. Gecədə ctr_complexity=2 ilə modelimi işə saldım və 30 dəqiqə əvəzinə 5 saat məşq etdi. Yalnız səhər saat 4-də hesablandı və mən ictimai liderlər lövhəsində 0,7433 verən sonuncu ansamblı yaratdım.

Problemin həllinə fərqli yanaşmalar səbəbindən proqnozlarımız güclü bir şəkildə əlaqələndirilmədi, bu da ansamblda yaxşı artım verdi. Yaxşı bir ansambl əldə etmək üçün xam model proqnozlarını proqnozlaşdırmaq (prediction_type='RawFormulaVal') istifadə etmək və scale_pos_weight=neg_count/pos_count təyin etmək daha yaxşıdır.

SNA Hackathon 2019

Saytda baxa bilərsiniz şəxsi liderlər lövhəsində yekun nəticələr.

Digər həllər

Bir çox komanda tövsiyə sistemi alqoritmlərinin qanunlarına əməl etdi. Mən bu sahədə mütəxəssis olmadığım üçün onları qiymətləndirə bilmirəm, amma 2 maraqlı həll yolu yadımdadır.

  • Nikolay Anokhinin həlli. Mail.ru-nun əməkdaşı olan Nikolay mükafatlar üçün müraciət etməyib, ona görə də onun məqsədi maksimum sürətə nail olmaq deyil, asanlıqla genişləndirilə bilən həll yolu əldə etmək olub.
  • Münsiflər Heyəti Mükafatını qazanan komandanın qərarına əsaslanır bu məqalə facebookdandır, əl işi olmadan çox yaxşı təsvir klasterinə icazə verdi.

Nəticə

Yaddaşımda ən çox nə qalıb:

  • Məlumatlarda kateqoriyalı xüsusiyyətlər varsa və hədəf kodlamasını necə düzgün edəcəyinizi bilirsinizsə, catboost-u sınamaq daha yaxşıdır.
  • Əgər siz müsabiqədə iştirak edirsinizsə, öyrənmə_dərəcəsi və təkrarlamalardan başqa parametrləri seçərək vaxt itirməməlisiniz. Daha sürətli bir həll bir neçə modeldən ibarət ansambl etməkdir.
  • Gücləndirmələr GPU-da öyrənilə bilər. Catboost GPU-da çox tez öyrənə bilər, lakin çox yaddaş yeyir.
  • İdeyaların inkişafı və sınaqdan keçirilməsi zamanı kiçik rsm~=0.2 (yalnız CPU) və ctr_complexity=1 təyin etmək daha yaxşıdır.
  • Digər komandalardan fərqli olaraq modellərimizin ansamblı böyük artım verdi. Sadəcə fikir mübadiləsi apardıq və müxtəlif dillərdə yazdıq. Məlumatların bölünməsinə fərqli yanaşmamız var idi və məncə, hər birinin öz səhvləri var idi.
  • Reytinq optimallaşdırmasının niyə təsnifat optimallaşdırmasından daha pis olduğu aydın deyil.
  • Mətnlərlə işləmək təcrübəsi və tövsiyə sistemlərinin necə qurulduğunu başa düşdüm.

SNA Hackathon 2019

Təşkilatçılara duyğulara, biliklərə və alınan mükafatlara görə təşəkkür edirik.

Mənbə: www.habr.com

Добавить комментарий