SNA Hackathon 2019

Noong Pebrero-Marso 2019, isang kumpetisyon ang ginanap para i-rank ang social network feed SNA Hackathon 2019, kung saan nakuha ng aming koponan ang unang lugar. Sa artikulong sasabihin ko ang tungkol sa organisasyon ng kumpetisyon, ang mga pamamaraan na sinubukan namin, at ang mga setting ng catboost para sa pagsasanay sa malaking data.

SNA Hackathon 2019

SNA Hackathon

Ito ang pangatlong beses na nagkaroon ng hackathon sa ilalim ng pangalang ito. Ito ay inayos ng social network ok.ru, ayon sa pagkakabanggit, ang gawain at data ay direktang nauugnay sa social network na ito.
Ang SNA (pagsusuri ng social network) sa kasong ito ay mas wastong nauunawaan hindi bilang isang pagsusuri ng isang social graph, ngunit sa halip bilang isang pagsusuri ng isang social network.

  • Noong 2014, ang gawain ay hulaan ang bilang ng mga like na makukuha ng isang post.
  • Sa 2016 - ang gawain ng VVZ (marahil pamilyar ka), mas malapit sa pagsusuri ng social graph.
  • Sa 2019, niraranggo ang feed ng user batay sa posibilidad na magustuhan ng user ang post.

Hindi ko masasabi ang tungkol sa 2014, ngunit noong 2016 at 2019, bilang karagdagan sa mga kakayahan sa pagsusuri ng data, kinakailangan din ang mga kasanayan sa pagtatrabaho sa malaking data. Sa tingin ko, ang kumbinasyon ng machine learning at mga problema sa pagpoproseso ng malaking data ang nakaakit sa akin sa mga kumpetisyon na ito, at ang aking karanasan sa mga lugar na ito ay nakatulong sa akin na manalo.

mlbootcamp

Noong 2019, ang kumpetisyon ay inayos sa platform https://mlbootcamp.ru.

Nagsimula ang kompetisyon online noong Pebrero 7 at binubuo ng 3 gawain. Kahit sino ay maaaring magparehistro sa site, mag-download baseline at i-load ang iyong sasakyan sa loob ng ilang oras. Sa pagtatapos ng online stage noong Marso 15, ang nangungunang 15 ng bawat show jumping event ay inimbitahan sa opisina ng Mail.ru para sa offline na yugto, na naganap mula Marso 30 hanggang Abril 1.

Gawain

Nagbibigay ang source data ng mga user ID (userId) at post ID (objectId). Kung ipinakita sa user ang isang post, ang data ay naglalaman ng isang linya na naglalaman ng userId, objectId, mga reaksyon ng user sa post na ito (feedback) at isang set ng iba't ibang feature o link sa mga larawan at text.

userId objectId ownerId feedback imahe
3555 22 5677 [nagustuhan, na-click] [hash1]
12842 55 32144 [ayaw] [hash2, hash3]
13145 35 5677 [na-click, ibinahagi] [hash2]

Naglalaman ang set ng data ng pagsubok ng katulad na istraktura, ngunit nawawala ang field ng feedback. Ang gawain ay hulaan ang pagkakaroon ng 'nagustuhan' na reaksyon sa field ng feedback.
Ang pagsusumite ng file ay may sumusunod na istraktura:

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

Ang sukatan ay ang average na ROC AUC para sa mga user.

Ang isang mas detalyadong paglalarawan ng data ay matatagpuan sa website ng konseho. Maaari ka ring mag-download ng data doon, kasama ang mga pagsubok at larawan.

Online stage

Sa online stage, hinati ang gawain sa 3 bahagi

Offline na yugto

Sa offline na yugto, ang data ay kasama ang lahat ng mga tampok, habang ang mga teksto at mga imahe ay kalat-kalat. Mayroong 1,5 beses na mas maraming row sa dataset, kung saan marami na ang mga ito.

Paglutas ng problema

Dahil gumagawa ako ng CV sa trabaho, sinimulan ko ang aking paglalakbay sa kompetisyong ito gamit ang gawaing "Mga Larawan". Ang data na ibinigay ay userId, objectId, ownerId (ang pangkat kung saan na-publish ang post), mga timestamp para sa paggawa at pagpapakita ng post, at, siyempre, ang larawan para sa post na ito.
Pagkatapos makabuo ng ilang feature batay sa mga timestamp, ang susunod na ideya ay kunin ang penultimate layer ng neuron na pre-trained sa imagenet at ipadala ang mga embeddings na ito sa boosting.

SNA Hackathon 2019

Ang mga resulta ay hindi kahanga-hanga. Ang mga pag-embed mula sa imagenet neuron ay hindi nauugnay, naisip ko, kailangan kong gumawa ng sarili kong autoencoder.

SNA Hackathon 2019

Ito ay tumagal ng maraming oras at ang resulta ay hindi bumuti.

Pagbuo ng tampok

Ang pagtatrabaho sa mga larawan ay tumatagal ng maraming oras, kaya nagpasya akong gumawa ng isang bagay na mas simple.
Tulad ng makikita mo kaagad, mayroong ilang mga tampok na kategorya sa dataset, at para hindi masyadong mag-abala, kumuha na lang ako ng catboost. Ang solusyon ay mahusay, nang walang anumang mga setting ay agad akong nakarating sa unang linya ng leaderboard.

Mayroong maraming data at ito ay inilatag sa parquet format, kaya nang hindi nag-iisip ng dalawang beses, kinuha ko ang scala at nagsimulang isulat ang lahat sa spark.

Ang pinakasimpleng feature na nagbigay ng higit na paglago kaysa sa mga pag-embed ng larawan:

  • ilang beses lumabas ang objectId, userId at ownerId sa data (dapat na may kaugnayan sa kasikatan);
  • kung gaano karaming mga post ang nakita ng userId mula sa ownerId (dapat na nauugnay sa interes ng user sa grupo);
  • kung gaano karaming mga natatanging userId ang tumingin ng mga post mula sa ownerId (sinasalamin ang laki ng audience ng grupo).

Mula sa mga timestamp, posibleng makuha ang oras ng araw kung kailan pinanood ng user ang feed (umaga/hapon/gabi/gabi). Sa pamamagitan ng pagsasama-sama ng mga kategoryang ito, maaari kang magpatuloy sa pagbuo ng mga feature:

  • kung ilang beses nag-log in ang userId sa gabi;
  • sa anong oras ang post na ito ay madalas na ipinapakita (objectId) at iba pa.

Lahat ng ito ay unti-unting napabuti ang mga sukatan. Ngunit ang laki ng dataset ng pagsasanay ay humigit-kumulang 20M record, kaya ang pagdaragdag ng mga feature ay lubos na nagpabagal sa pagsasanay.

Inisip kong muli ang aking diskarte sa paggamit ng data. Bagama't ang data ay nakasalalay sa oras, wala akong nakitang anumang halatang pagtagas ng impormasyon "sa hinaharap", gayunpaman, kung sakali, sinira ko ito tulad nito:

SNA Hackathon 2019

Ang set ng pagsasanay na ibinigay sa amin (Pebrero at 2 linggo ng Marso) ay hinati sa 2 bahagi.
Ang modelo ay sinanay sa data mula sa huling N araw. Ang mga pinagsama-samang inilarawan sa itaas ay binuo sa lahat ng data, kabilang ang pagsubok. Kasabay nito, lumitaw ang data kung saan posible na bumuo ng iba't ibang mga pag-encode ng target na variable. Ang pinakasimpleng diskarte ay ang muling paggamit ng code na lumilikha na ng mga bagong feature, at i-feed lang ito ng data kung saan hindi ito sasanayin at target = 1.

Kaya, nakakuha kami ng mga katulad na tampok:

  • Ilang beses na nakakita ng post ang userId sa ownerId ng grupo;
  • Ilang beses nagustuhan ng userId ang post sa ownerId ng grupo;
  • Ang porsyento ng mga post na nagustuhan ng userId mula sa ownerId.

Ibig sabihin, ito pala ibig sabihin ng target na encoding sa bahagi ng dataset para sa iba't ibang kumbinasyon ng mga tampok na kategorya. Sa prinsipyo, ang catboost ay bumubuo din ng target na pag-encode at mula sa puntong ito ng view ay walang pakinabang, ngunit, halimbawa, naging posible na bilangin ang bilang ng mga natatanging user na nagustuhan ang mga post sa pangkat na ito. Kasabay nito, ang pangunahing layunin ay nakamit - ang aking dataset ay nabawasan nang maraming beses, at posible na magpatuloy sa pagbuo ng mga tampok.

Bagama't ang catboost ay makakagawa lang ng pag-encode batay sa nagustuhang reaksyon, ang feedback ay may iba pang mga reaksyon: muling ibinahagi, hindi nagustuhan, hindi nagustuhan, na-click, binalewala, mga pag-encode na maaaring gawin nang manu-mano. Muli kong kinakalkula ang lahat ng uri ng mga pinagsama-samang at inalis ang mga feature na may mababang kahalagahan para hindi lumaki ang dataset.

Sa oras na iyon ako ay nasa unang lugar sa pamamagitan ng isang malawak na margin. Ang tanging bagay na nakalilito ay ang mga pag-embed ng imahe ay nagpakita ng halos walang paglago. Dumating ang ideya na ibigay ang lahat sa catboost. Kinu-cluster namin ang Kmeans ng mga larawan at nakakakuha kami ng bagong tampok na kategorya na imageCat.

Narito ang ilang mga klase pagkatapos ng manu-manong pag-filter at pagsasama ng mga kumpol na nakuha mula sa KMeans.

SNA Hackathon 2019

Batay sa imageCat na nabuo namin:

  • Mga bagong tampok na kategorya:
    • Aling imageCat ang pinakamadalas na tiningnan ng userId;
    • Aling imageCat ang madalas na nagpapakita ng ownerId;
    • Aling imageCat ang pinakamadalas na nagustuhan ng userId;
  • Iba't ibang mga counter:
    • Ilang natatanging imageCat ang tumingin sa userId;
    • Humigit-kumulang 15 katulad na feature kasama ang target na encoding gaya ng inilarawan sa itaas.

Mga teksto

Ang mga resulta sa kumpetisyon ng imahe ay nababagay sa akin at nagpasya akong subukan ang aking kamay sa mga teksto. Hindi ako masyadong nagtrabaho sa mga text dati at, kalokohan, pinatay ko ang araw sa tf-idf at svd. Pagkatapos ay nakita ko ang baseline na may doc2vec, na ginagawa kung ano mismo ang kailangan ko. Ang pagkakaroon ng bahagyang naayos ang mga parameter ng doc2vec, nakakuha ako ng mga pag-embed ng teksto.

At pagkatapos ay ginamit ko lang muli ang code para sa mga imahe, kung saan pinalitan ko ang mga pag-embed ng larawan ng mga pag-embed ng teksto. Dahil dito, nakakuha ako ng 2nd place sa text competition.

Sistema ng pagtutulungan

May isang kumpetisyon na natitira na hindi ko pa "nasusundutan" ng isang stick, at sa paghusga sa pamamagitan ng AUC sa leaderboard, ang mga resulta ng partikular na kumpetisyon na ito ay dapat na may pinakamalaking epekto sa offline na yugto.
Kinuha ko ang lahat ng feature na nasa source data, mga napiling kategorya at kinakalkula ang parehong mga pinagsama-samang para sa mga larawan, maliban sa mga feature na batay sa mga larawan mismo. Ang paglalagay lang nito sa catboost ay nakakuha na ako sa 2nd place.

Mga unang hakbang ng pag-optimize ng catboost

Isang una at dalawang pangalawang puwesto ang natuwa sa akin, ngunit nagkaroon ng pag-unawa na wala akong ginawang espesyal, na nangangahulugang maaari kong asahan ang pagkawala ng posisyon.

Ang gawain ng kumpetisyon ay ang pagraranggo ng mga post sa loob ng user, at sa lahat ng oras na ito ay nilulutas ko ang problema sa pag-uuri, iyon ay, ang pag-optimize ng maling sukatan.

Hayaan akong magbigay sa iyo ng isang simpleng halimbawa:

userId objectId hula lupa katotohanan
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

Gumawa tayo ng isang maliit na muling pagsasaayos

userId objectId hula lupa katotohanan
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

Nakukuha namin ang mga sumusunod na resulta:

Modelo AUC User1 AUC User2 AUC ibig sabihin ay AUC
Pagpipilian 1 0,8 1,0 0,0 0,5
Pagpipilian 2 0,7 0,75 1,0 0,875

Gaya ng nakikita mo, ang pagpapahusay sa pangkalahatang sukatan ng AUC ay hindi nangangahulugang pagpapahusay sa average na sukatan ng AUC sa loob ng isang user.

Catboost alam kung paano i-optimize ang mga sukatan ng pagraranggo mula sa kahon. Nabasa ko ang tungkol sa mga sukatan ng pagraranggo, mga kwento ng tagumpay kapag gumagamit ng catboost at itakda ang YetiRankPairwise upang magsanay magdamag. Ang resulta ay hindi kahanga-hanga. Sa pagpapasya na ako ay undertrained, binago ko ang error function sa QueryRMSE, na kung saan, kung ihahambing sa dokumentasyon ng catboost, ay mas mabilis na nagtatagpo. Sa huli, nakuha ko ang parehong mga resulta tulad ng noong pagsasanay para sa pag-uuri, ngunit ang mga ensemble ng dalawang modelong ito ay nagbigay ng magandang pagtaas, na nagdala sa akin sa unang lugar sa lahat ng tatlong kumpetisyon.

5 minuto bago ang pagsasara ng online na yugto ng kumpetisyon ng "Collaborative Systems", inilipat ako ni Sergey Shalnov sa pangalawang lugar. Sabay kaming naglakad sa kabilang daan.

Paghahanda para sa offline na yugto

Kami ay garantisadong tagumpay sa online na yugto gamit ang isang RTX 2080 TI video card, ngunit ang pangunahing premyo na 300 rubles at, malamang, kahit na ang huling unang lugar ay pinilit kaming magtrabaho para sa 000 linggong ito.

Tulad ng nangyari, gumamit din si Sergey ng catboost. Nagpalitan kami ng mga ideya at tampok, at nalaman ko ang tungkol ulat ni Anna Veronica Dorogush na naglalaman ng mga sagot sa marami sa aking mga tanong, at maging sa mga hindi ko pa natatamo noong panahong iyon.

Ang pagtingin sa ulat ay humantong sa akin sa ideya na kailangan naming ibalik ang lahat ng mga parameter sa default na halaga, at gawin ang mga setting nang maingat at pagkatapos lamang ayusin ang isang hanay ng mga tampok. Ngayon ang isang pagsasanay ay tumagal ng halos 15 oras, ngunit ang isang modelo ay nakakuha ng bilis na mas mahusay kaysa sa nakuha sa ensemble na may ranggo.

Pagbuo ng tampok

Sa kumpetisyon ng Collaborative Systems, ang isang malaking bilang ng mga tampok ay tinasa bilang mahalaga para sa modelo. Halimbawa, auditweights_spark_svd - ang pinakamahalagang tanda, ngunit walang impormasyon tungkol sa kung ano ang ibig sabihin nito. Naisip ko na magiging kapaki-pakinabang na bilangin ang iba't ibang mga pinagsama-samang batay sa mahahalagang tampok. Halimbawa, ang average na auditweights_spark_svd ng user, ayon sa pangkat, ayon sa bagay. Ang parehong ay maaaring kalkulahin gamit ang data kung saan walang pagsasanay na ginanap at target = 1, iyon ay, average auditweights_spark_svd ng gumagamit sa pamamagitan ng mga bagay na nagustuhan niya. Mga mahalagang palatandaan bukod pa auditweights_spark_svd, may ilan. Narito ang ilan sa mga ito:

  • auditweightsCtrGender
  • auditweightsCtrHigh
  • userOwnerCounterCreateLikes

Halimbawa, ang average auditweightsCtrGender ayon sa userId ito ay naging isang mahalagang tampok, tulad ng average na halaga userOwnerCounterCreateLikes ng userId+ownerId. Ito ay dapat na mag-isip sa iyo na kailangan mong maunawaan ang kahulugan ng mga patlang.

Gayundin mahalagang mga tampok ay auditweightsLikesCount ΠΈ auditweightsShowsCount. Ang paghahati sa isa't isa, isang mas mahalagang tampok ang nakuha.

Mga pagtagas ng data

Ang kumpetisyon at pagmomodelo ng produksyon ay ibang-iba na mga gawain. Kapag naghahanda ng data, napakahirap na isaalang-alang ang lahat ng mga detalye at hindi ihatid ang ilang di-maliit na impormasyon tungkol sa target na variable sa pagsubok. Kung gagawa kami ng solusyon sa produksyon, susubukan naming iwasan ang paggamit ng mga pagtagas ng data kapag sinasanay ang modelo. Ngunit kung gusto nating manalo sa kumpetisyon, kung gayon ang mga pagtagas ng data ay ang pinakamahusay na mga tampok.

Sa pag-aaral ng data, makikita mo iyon ayon sa mga halaga ng objectId auditweightsLikesCount ΠΈ auditweightsShowsCount pagbabago, na nangangahulugan na ang ratio ng maximum na mga halaga ng mga tampok na ito ay magpapakita ng post na conversion na mas mahusay kaysa sa ratio sa oras ng pagpapakita.

Ang unang pagtagas na nakita namin ay auditweightsLikesCountMax/auditweightsShowsCountMax.
Ngunit paano kung titingnan natin ang data nang mas malapit? Pagbukud-bukurin natin ayon sa petsa ng palabas at makuha ang:

objectId userId auditweightsShowsCount auditweightsLikesCount target (nagustuhan)
1 1 12 3 hindi siguro
1 2 15 3 siguro oo
1 3 16 4

Nakapagtataka nang matagpuan ko ang unang tulad na halimbawa at lumabas na hindi nagkatotoo ang hula ko. Ngunit, isinasaalang-alang ang katotohanan na ang pinakamataas na halaga ng mga katangiang ito sa loob ng bagay ay nagbigay ng pagtaas, hindi kami tamad at nagpasyang hanapin auditweightsShowsCountNext ΠΈ auditweightsLikesCountNext, iyon ay, ang mga halaga sa susunod na sandali sa oras. Sa pamamagitan ng pagdaragdag ng isang tampok
(auditweightsShowsCountNext-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountNext) mabilis kaming gumawa ng matalim na pagtalon.
Maaaring gamitin ang mga katulad na pagtagas sa pamamagitan ng paghahanap ng mga sumusunod na halaga para sa userOwnerCounterCreateLikes sa loob ng userId+ownerId at, halimbawa, auditweightsCtrGender sa loob ng objectId+userGender. Nakakita kami ng 6 na katulad na field na may mga leaks at nakuha ang maraming impormasyon hangga't maaari mula sa kanila.

Sa oras na iyon, na-squeeze namin ang maraming impormasyon hangga't maaari mula sa mga collaborative na feature, ngunit hindi bumalik sa mga kumpetisyon sa larawan at teksto. Mayroon akong magandang ideya na suriin: gaano kalaki ang direktang ibinibigay ng mga feature batay sa mga larawan o teksto sa mga nauugnay na kumpetisyon?

Walang mga leaks sa mga kumpetisyon sa larawan at teksto, ngunit sa oras na iyon ay naibalik ko na ang mga default na parameter ng catboost, nilinis ang code at nagdagdag ng ilang feature. Ang kabuuan ay:

desisyon malapit na
Maximum na may mga larawan 0.6411
Maximum na walang mga larawan 0.6297
Resulta ng pangalawang lugar 0.6295

desisyon malapit na
Maximum na may mga text 0.666
Pinakamataas na walang mga text 0.660
Resulta ng pangalawang lugar 0.656

desisyon malapit na
Maximum sa collaborative 0.745
Resulta ng pangalawang lugar 0.723

Naging malinaw na malamang na hindi namin mapiga ang marami sa mga teksto at larawan, at pagkatapos subukan ang ilang pinakakawili-wiling ideya, huminto kami sa pakikipagtulungan sa kanila.

Ang karagdagang henerasyon ng mga feature sa mga collaborative na system ay hindi nagbigay ng pagtaas, at sinimulan namin ang pagraranggo. Sa online stage, ang classification at ranking ensemble ay nagbigay sa akin ng maliit na pagtaas, dahil ito pala ay dahil undertrained ko ang classification. Wala sa mga error function, kabilang ang YetiRanlPairwise, na ginawa kahit saan malapit sa resulta na ginawa ng LogLoss (0,745 vs. 0,725). Nagkaroon pa rin ng pag-asa para sa QueryCrossEntropy, na hindi mailunsad.

Offline na yugto

Sa offline na yugto, nanatiling pareho ang istraktura ng data, ngunit may mga maliliit na pagbabago:

  • na-rerandomize ang mga identifier na userId, objectId, ownerId;
  • ilang mga palatandaan ang inalis at ilan ang pinalitan ng pangalan;
  • ang data ay tumaas ng humigit-kumulang 1,5 beses.

Bilang karagdagan sa mga nakalistang paghihirap, mayroong isang malaking plus: ang koponan ay inilaan ng isang malaking server na may isang RTX 2080TI. Matagal na akong nag enjoy sa htop.
SNA Hackathon 2019

Nagkaroon lamang ng isang ideya - ang simpleng kopyahin kung ano ang mayroon na. Pagkatapos gumugol ng ilang oras sa pag-set up ng environment sa server, unti-unti naming sinimulan na i-verify na ang mga resulta ay maaaring kopyahin. Ang pangunahing problema na kinakaharap namin ay ang pagtaas ng dami ng data. Nagpasya kaming bawasan ng kaunti ang pagkarga at itakda ang parameter ng catboost ctr_complexity=1. Ito ay nagpapababa ng bilis ng kaunti, ngunit ang aking modelo ay nagsimulang gumana, ang resulta ay mabuti - 0,733. Si Sergey, hindi katulad sa akin, ay hindi hinati ang data sa 2 bahagi at sinanay sa lahat ng data, kahit na ito ay nagbigay ng pinakamahusay na mga resulta sa online na yugto, sa offline na yugto mayroong maraming mga paghihirap. Kung kinuha namin ang lahat ng mga tampok na nabuo namin at sinubukang itulak ang mga ito sa catboost, walang gagana sa online na yugto. Ginawa ni Sergey ang pag-optimize ng uri, halimbawa, pag-convert ng float64 sa mga uri ng float32. Sa artikulong ito, Makakahanap ka ng impormasyon sa pag-optimize ng memorya sa mga panda. Bilang resulta, nagsanay si Sergey sa CPU gamit ang lahat ng data at nakakuha ng humigit-kumulang 0,735.

Ang mga resultang ito ay sapat na upang manalo, ngunit itinago namin ang aming tunay na bilis at hindi namin masigurado na hindi ganoon din ang ginagawa ng ibang mga koponan.

Labanan hanggang sa huli

Pag-tune ng Catboost

Ang aming solusyon ay ganap na muling ginawa, idinagdag namin ang mga tampok ng data ng teksto at mga imahe, kaya ang natitira na lang ay upang ibagay ang mga parameter ng catboost. Sinanay ni Sergey ang CPU na may maliit na bilang ng mga pag-ulit, at nagsanay ako sa isa na may ctr_complexity=1. Isang araw na lang ang natitira, at kung nagdagdag ka lang ng mga pag-ulit o nadagdagan ang ctr_complexity, sa umaga maaari kang makakuha ng mas mahusay na bilis at maglakad sa buong araw.

Sa offline na yugto, ang mga bilis ay maaaring napakadaling maitago sa pamamagitan lamang ng pagpili ng hindi ang pinakamahusay na solusyon sa site. Inaasahan namin ang matinding pagbabago sa leaderboard sa mga huling minuto bago magsara ang mga pagsusumite at nagpasyang huwag huminto.

Mula sa video ni Anna, natutunan ko na upang mapabuti ang kalidad ng modelo, pinakamahusay na piliin ang mga sumusunod na parameter:

  • learning_rate β€” Ang default na halaga ay kinakalkula batay sa laki ng dataset. Ang pagtaas ng learning_rate ay nangangailangan ng pagtaas ng bilang ng mga pag-ulit.
  • l2_leaf_reg β€” Regularization coefficient, default na value 3, mas mainam na pumili mula 2 hanggang 30. Ang pagbaba sa value ay humahantong sa pagtaas ng overfit.
  • bagging_temperature β€” nagdaragdag ng randomization sa mga timbang ng mga bagay sa sample. Ang default na halaga ay 1, kung saan ang mga timbang ay kinukuha mula sa isang exponential distribution. Ang pagbaba ng halaga ay humahantong sa pagtaas ng overfit.
  • random_strength β€” Nakakaapekto sa pagpili ng mga split sa isang partikular na pag-ulit. Kung mas mataas ang random_strength, mas mataas ang pagkakataon na mapili ang isang mababang paghahati ng kahalagahan. Sa bawat kasunod na pag-ulit, bumababa ang randomness. Ang pagbaba ng halaga ay humahantong sa pagtaas ng overfit.

Ang iba pang mga parameter ay may mas maliit na epekto sa huling resulta, kaya hindi ko sinubukang piliin ang mga ito. Ang isang pag-ulit ng pagsasanay sa aking GPU dataset na may ctr_complexity=1 ay tumagal ng 20 minuto, at ang mga napiling parameter sa pinababang dataset ay bahagyang naiiba sa mga pinakamainam sa buong dataset. Sa huli, gumawa ako ng humigit-kumulang 30 pag-ulit sa 10% ng data, at pagkatapos ay humigit-kumulang 10 pang pag-ulit sa lahat ng data. Ito ay naging ganito:

  • learning_rate Tumaas ako ng 40% mula sa default;
  • l2_leaf_reg iniwan itong pareho;
  • bagging_temperature ΠΈ random_strength nabawasan sa 0,8.

Maaari naming tapusin na ang modelo ay undertrained sa mga default na parameter.

Laking gulat ko nang makita ko ang resulta sa leaderboard:

Modelo modelo 1 modelo 2 modelo 3 grupo
Nang walang tuning 0.7403 0.7404 0.7404 0.7407
Sa pag-tune 0.7406 0.7405 0.7406 0.7408

Napagpasyahan ko para sa aking sarili na kung ang mabilis na aplikasyon ng modelo ay hindi kinakailangan, pagkatapos ay mas mahusay na palitan ang pagpili ng mga parameter na may isang grupo ng ilang mga modelo gamit ang mga hindi na-optimize na mga parameter.

Ini-optimize ni Sergey ang laki ng dataset para patakbuhin ito sa GPU. Ang pinakasimpleng opsyon ay ang pagputol ng bahagi ng data, ngunit ito ay maaaring gawin sa maraming paraan:

  • unti-unting alisin ang pinakalumang data (simula ng Pebrero) hanggang sa magsimulang magkasya ang dataset sa memorya;
  • alisin ang mga tampok na may pinakamababang kahalagahan;
  • alisin ang mga userId kung saan mayroon lamang isang entry;
  • iwanan lamang ang mga userId na nasa pagsubok.

At sa huli, gumawa ng ensemble sa lahat ng mga opsyon.

Ang huling grupo

Sa huli ng gabi ng huling araw, inilatag namin ang isang grupo ng aming mga modelo na nagbunga ng 0,742. Magdamag ay inilunsad ko ang aking modelo sa ctr_complexity=2 at sa halip na 30 minuto ay nagsanay ito ng 5 oras. Sa 4 am lamang ito ay binilang, at ginawa ko ang huling ensemble, na nagbigay ng 0,7433 sa pampublikong leaderboard.

Dahil sa iba't ibang mga diskarte sa paglutas ng problema, ang aming mga hula ay hindi malakas na nakakaugnay, na nagbigay ng isang mahusay na pagtaas sa ensemble. Para makakuha ng magandang ensemble, mas mainam na gamitin ang raw model predictions predict(prediction_type='RawFormulaVal') at itakda ang scale_pos_weight=neg_count/pos_count.

SNA Hackathon 2019

Sa website makikita mo mga huling resulta sa pribadong leaderboard.

Iba pang mga solusyon

Sinundan ng maraming koponan ang mga canon ng mga algorithm ng nagrerekomenda ng system. Ako, hindi isang dalubhasa sa larangang ito, ay hindi maaaring suriin ang mga ito, ngunit may natatandaan akong 2 kawili-wiling solusyon.

  • Ang solusyon ni Nikolay Anokhin. Si Nikolay, bilang isang empleyado ng Mail.ru, ay hindi nag-aplay para sa mga premyo, kaya ang kanyang layunin ay hindi upang makamit ang maximum na bilis, ngunit upang makakuha ng isang madaling scalable na solusyon.
  • Ang desisyon ng pangkat na nanalong Jury Prize batay sa ang artikulong ito mula sa facebook, pinapayagan para sa napakahusay na clustering ng imahe nang walang manu-manong trabaho.

Konklusyon

Ano ang pinaka tumatak sa aking alaala:

  • Kung may mga kategoryang tampok sa data, at alam mo kung paano gawin ang target na pag-encode nang tama, mas mahusay pa ring subukan ang catboost.
  • Kung kasali ka sa isang kompetisyon, hindi ka dapat mag-aksaya ng oras sa pagpili ng mga parameter maliban sa learning_rate at mga pag-ulit. Ang isang mas mabilis na solusyon ay ang paggawa ng isang grupo ng ilang mga modelo.
  • Maaaring matuto ang mga pagpapalakas sa GPU. Ang Catboost ay maaaring matuto nang napakabilis sa GPU, ngunit kumakain ito ng maraming memorya.
  • Sa panahon ng pagbuo at pagsubok ng mga ideya, mas mainam na magtakda ng maliit na rsm~=0.2 (CPU lang) at ctr_complexity=1.
  • Hindi tulad ng ibang mga koponan, ang grupo ng aming mga modelo ay nagbigay ng malaking pagtaas. Nagpalitan lamang kami ng mga ideya at nagsulat sa iba't ibang wika. Nagkaroon kami ng iba't ibang diskarte sa paghahati ng data at, sa palagay ko, bawat isa ay may sariling mga bug.
  • Hindi malinaw kung bakit ang pag-optimize ng ranggo ay gumanap nang mas malala kaysa sa pag-optimize ng pag-uuri.
  • Nakakuha ako ng ilang karanasan sa pagtatrabaho sa mga text at pag-unawa sa kung paano ginagawa ang mga system ng nagrerekomenda.

SNA Hackathon 2019

Salamat sa mga organizer para sa mga emosyon, kaalaman at mga premyo na natanggap.

Pinagmulan: www.habr.com

Magdagdag ng komento