SNA Hackathon 2019

Ym mis Chwefror-Mawrth 2019, cynhaliwyd cystadleuaeth i raddio porthiant y rhwydwaith cymdeithasol SNA Hackathon 2019, yn yr hwn y cymerodd ein tîm y lle cyntaf. Yn yr erthygl byddaf yn siarad am drefniadaeth y gystadleuaeth, y dulliau y gwnaethom roi cynnig arnynt, a'r gosodiadau catboost ar gyfer hyfforddiant ar ddata mawr.

SNA Hackathon 2019

SNA Hackathon

Dyma'r trydydd tro i hacathon o dan yr enw hwn gael ei gynnal. Fe'i trefnir gan y rhwydwaith cymdeithasol ok.ru, yn y drefn honno, mae'r dasg a'r data yn uniongyrchol gysylltiedig â'r rhwydwaith cymdeithasol hwn.
Mae SNA (dadansoddiad rhwydwaith cymdeithasol) yn yr achos hwn yn cael ei ddeall yn gywirach nid fel dadansoddiad o graff cymdeithasol, ond yn hytrach fel dadansoddiad o rwydwaith cymdeithasol.

  • Yn 2014, y dasg oedd rhagweld nifer y bobl sy'n hoffi swydd.
  • Yn 2016 - y dasg VVZ (efallai eich bod yn gyfarwydd), yn nes at y dadansoddiad o'r graff cymdeithasol.
  • Yn 2019, graddio porthiant y defnyddiwr yn seiliedig ar y tebygolrwydd y bydd y defnyddiwr yn hoffi'r post.

Ni allaf ddweud am 2014, ond yn 2016 a 2019, yn ogystal â galluoedd dadansoddi data, roedd angen sgiliau gweithio gyda data mawr hefyd. Rwy’n meddwl mai’r cyfuniad o ddysgu peirianyddol a phroblemau prosesu data mawr a’m denodd i’r cystadlaethau hyn, ac fe wnaeth fy mhrofiad yn y meysydd hyn fy helpu i ennill.

mlbootcamp

Yn 2019, trefnwyd y gystadleuaeth ar y platfform https://mlbootcamp.ru.

Dechreuodd y gystadleuaeth ar-lein ar Chwefror 7 ac roedd yn cynnwys 3 tasg. Gallai unrhyw un gofrestru ar y wefan, lawrlwytho llinell sylfaen a llwythwch eich car am ychydig oriau. Ar ddiwedd y cam ar-lein ar Fawrth 15, gwahoddwyd 15 uchaf pob digwyddiad neidio sioe i swyddfa Mail.ru ar gyfer y llwyfan all-lein, a gynhaliwyd rhwng Mawrth 30 ac Ebrill 1.

Gorchwyl

Mae'r data ffynhonnell yn darparu IDau defnyddwyr (userId) a IDau post (objectId). Os dangoswyd postiad i'r defnyddiwr, yna mae'r data'n cynnwys llinell sy'n cynnwys userId, objectId, ymatebion defnyddwyr i'r post hwn (adborth) a set o nodweddion neu ddolenni amrywiol i luniau a thestunau.

ID Defnyddiwr gwrthrychId Id perchennog adborth delweddau
3555 22 5677 [hoffi, clicio] [hash1]
12842 55 32144 [ddim yn hoffi] [hash2, hash3]
13145 35 5677 [clicio, rhannu] [hash2]

Mae'r set ddata prawf yn cynnwys strwythur tebyg, ond mae'r maes adborth ar goll. Y dasg yw rhagweld presenoldeb yr ymateb 'hoffi' yn y maes adborth.
Mae gan y ffeil gyflwyno'r strwythur canlynol:

ID Defnyddiwr Rhestr Ddidoli[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

Y metrig yw'r ROC AUC cyfartalog ar gyfer defnyddwyr.

Ceir disgrifiad manylach o'r data yn gwefan y cyngor. Gallwch hefyd lawrlwytho data yno, gan gynnwys profion a lluniau.

Llwyfan ar-lein

Ar y cam ar-lein, rhannwyd y dasg yn 3 rhan

  • System gydweithredol — yn cynnwys yr holl nodweddion ac eithrio delweddau a thestunau;
  • Delweddau — yn cynnwys gwybodaeth am ddelweddau yn unig;
  • Testunau — yn cynnwys gwybodaeth am destunau yn unig.

Llwyfan all-lein

Ar y cam all-lein, roedd y data'n cynnwys yr holl nodweddion, tra bod testunau a delweddau yn brin. Roedd 1,5 gwaith yn fwy o resi yn y set ddata, ac roedd llawer ohonynt eisoes.

Datrysiad y broblem

Gan fy mod yn gwneud CV yn y gwaith, dechreuais fy nhaith yn y gystadleuaeth hon gyda'r dasg “Delweddau”. Y data a ddarparwyd oedd userId, objectId, ownerId (y grŵp y cyhoeddwyd y postiad ynddo), stampiau amser ar gyfer creu ac arddangos y post, ac, wrth gwrs, y ddelwedd ar gyfer y postiad hwn.
Ar ôl cynhyrchu sawl nodwedd yn seiliedig ar stampiau amser, y syniad nesaf oedd cymryd yr haen olaf ond un o'r niwron a hyfforddwyd ymlaen llaw ar imagenet ac anfon yr mewnosodiadau hyn at hwb.

SNA Hackathon 2019

Nid oedd y canlyniadau yn drawiadol. Mae mewnosodiadau o'r niwron imagenet yn amherthnasol, meddyliais, mae angen i mi wneud fy autoencoder fy hun.

SNA Hackathon 2019

Cymerodd lawer o amser ac ni wellodd y canlyniad.

Cynhyrchu nodwedd

Mae gweithio gyda delweddau yn cymryd llawer o amser, felly penderfynais wneud rhywbeth symlach.
Fel y gallwch weld ar unwaith, mae yna nifer o nodweddion categorïaidd yn y set ddata, ac er mwyn peidio â thrafferthu gormod, cymerais catboost yn unig. Roedd yr ateb yn ardderchog, heb unrhyw osodiadau cyrhaeddais linell gyntaf y bwrdd arweinwyr ar unwaith.

Mae cryn dipyn o ddata ac mae wedi'i osod mewn fformat parquet, felly heb feddwl ddwywaith, cymerais scala a dechrau ysgrifennu popeth mewn spark.

Y nodweddion symlaf a roddodd fwy o dwf nag ymgorfforiadau delwedd:

  • sawl gwaith ymddangosodd objectId, userId a OwnerId yn y data (dylai fod yn cyfateb i boblogrwydd);
  • faint o bostiadau y mae userId wedi'u gweld ganownerId (dylai fod yn cyfateb i ddiddordeb y defnyddiwr yn y grŵp);
  • faint o ID defnyddiwr unigryw a welwyd postiadau gan OwnerId (sy'n adlewyrchu maint cynulleidfa'r grŵp).

O'r stampiau roedd yn bosibl cael yr amser o'r dydd yr oedd y defnyddiwr yn gwylio'r porthiant (bore/prynhawn/noswaith/nos). Trwy gyfuno'r categorïau hyn, gallwch barhau i gynhyrchu nodweddion:

  • sawl gwaith y gwnaeth userId fewngofnodi gyda'r nos;
  • pryd y dangosir y swydd hon amlaf (objectId) ac ati.

Gwellodd hyn i gyd y metrigau yn raddol. Ond mae maint y set ddata hyfforddi tua 20M o gofnodion, felly fe wnaeth ychwanegu nodweddion arafu'r hyfforddiant yn fawr.

Rwyf wedi ailfeddwl fy null o ddefnyddio data. Er bod y data yn dibynnu ar amser, ni welais unrhyw ollyngiadau gwybodaeth amlwg “yn y dyfodol”, serch hynny, rhag ofn, fe wnes i ei dorri i lawr fel hyn:

SNA Hackathon 2019

Rhannwyd y set hyfforddi a ddarparwyd i ni (Chwefror a 2 wythnos o Fawrth) yn 2 ran.
Hyfforddwyd y model ar ddata o'r diwrnodau N diwethaf. Adeiladwyd y cydgrynhoadau a ddisgrifir uchod ar yr holl ddata, gan gynnwys y prawf. Ar yr un pryd, mae data wedi ymddangos lle mae'n bosibl adeiladu amgodiad amrywiol o'r newidyn targed. Y dull symlaf yw ailddefnyddio cod sydd eisoes yn creu nodweddion newydd, a bwydo data iddo na chaiff ei hyfforddi arno a thargedu = 1.

Felly, cawsom nodweddion tebyg:

  • Sawl gwaith mae userId wedi gweld postiad yn y grŵpownerId;
  • Sawl gwaith roedd userId wedi hoffi'r post yn grŵp perchennogId;
  • Canran y postiadau yr oedd userId yn eu hoffi gan OwnerId.

Hynny yw, mae'n troi allan amgodio targed cymedrig ar ran o'r set ddata ar gyfer cyfuniadau amrywiol o nodweddion categorïaidd. Mewn egwyddor, mae catboost hefyd yn adeiladu amgodio targed ac o'r safbwynt hwn nid oes unrhyw fudd, ond, er enghraifft, daeth yn bosibl cyfrif nifer y defnyddwyr unigryw a oedd yn hoffi swyddi yn y grŵp hwn. Ar yr un pryd, cyflawnwyd y prif nod - gostyngwyd fy set ddata sawl gwaith, ac roedd yn bosibl parhau i gynhyrchu nodweddion.

Er y gall catboost adeiladu amgodio yn seiliedig ar yr adwaith hoffus yn unig, mae gan adborth adweithiau eraill: wedi'i ailddosbarthu, ei gasáu, heb ei hoffi, ei glicio, ei anwybyddu, y gellir gwneud amgodiadau â llaw ar eu cyfer. Fe wnes i ailgyfrifo pob math o agregau a dileu nodweddion â phwysigrwydd isel er mwyn peidio â chwyddo'r set ddata.

Erbyn hynny roeddwn yn y lle cyntaf o gryn dipyn. Yr unig beth a oedd yn ddryslyd oedd nad oedd ymwreiddio delwedd bron yn dangos unrhyw dwf. Daeth y syniad i roi popeth i catboost. Rydym yn clystyru delweddau Kmeans ac yn cael nodwedd bendant newydd imageCat.

Dyma rai dosbarthiadau ar ôl hidlo â llaw ac uno clystyrau a gafwyd o KMeans.

SNA Hackathon 2019

Yn seiliedig ar imageCat rydym yn cynhyrchu:

  • Nodweddion categori newydd:
    • Pa ddelweddCat a welwyd amlaf gan userId;
    • Pa ddelweddCat sy'n dangos perchennogId amlaf;
    • Pa ddelweddCat oedd yn cael ei hoffi amlaf gan userId;
  • Cownteri amrywiol:
    • Sawl delwedd unigryw a edrychodd ar userId;
    • Tua 15 o nodweddion tebyg ynghyd ag amgodio targed fel y disgrifir uchod.

Testunau

Roedd canlyniadau'r gystadleuaeth delwedd yn fy siwtio a phenderfynais roi cynnig ar destunau. Dydw i ddim wedi gweithio llawer gyda thestunau o'r blaen ac, yn ffôl, lladdais y diwrnod ar tf-idf a svd. Yna gwelais waelodlin gyda doc2vec, sy'n gwneud yn union yr hyn sydd ei angen arnaf. Ar ôl addasu ychydig ar y paramedrau doc2vec, cefais fewnosod testun.

Ac yna fe wnes i ailddefnyddio'r cod ar gyfer y delweddau, lle rhoddais fewnosodiadau testun yn lle'r mewnosodiadau delwedd. O ganlyniad, cymerais yr 2il safle yn y gystadleuaeth testun.

System gydweithredol

Roedd yna un gystadleuaeth ar ôl nad oeddwn i wedi “pocio” â ffon eto, ac a barnu gan yr AUC ar y bwrdd arweinwyr, canlyniadau’r gystadleuaeth benodol hon ddylai fod wedi cael yr effaith fwyaf ar y llwyfan all-lein.
Cymerais yr holl nodweddion a oedd yn y data ffynhonnell, dewisais rai categorïaidd a chyfrifo'r un agregau ag ar gyfer delweddau, ac eithrio nodweddion yn seiliedig ar y delweddau eu hunain. Roedd rhoi hwn yn catboost yn fy nerbyn i'r 2il safle.

Camau cyntaf optimeiddio catboost

Roedd un lle cyntaf a dau eiliad yn fy mhlesio, ond roedd dealltwriaeth nad oeddwn wedi gwneud unrhyw beth arbennig, sy'n golygu y gallwn ddisgwyl colli swyddi.

Tasg y gystadleuaeth yw rhestru swyddi o fewn y defnyddiwr, a thrwy'r amser hwn roeddwn i'n datrys y broblem ddosbarthu, hynny yw, optimeiddio'r metrig anghywir.

Gadewch imi roi enghraifft syml i chi:

ID Defnyddiwr gwrthrychId rhagfynegiad gwirionedd daear
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

Gadewch i ni wneud ad-drefnu bach

ID Defnyddiwr gwrthrychId rhagfynegiad gwirionedd daear
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

Rydym yn cael y canlyniadau canlynol:

Model AUC Defnyddiwr1 AUC Defnyddiwr2 AUC golygu AUC
Opsiwn 1 0,8 1,0 0,0 0,5
Opsiwn 2 0,7 0,75 1,0 0,875

Fel y gallwch weld, nid yw gwella metrig cyffredinol AUC yn golygu gwella metrig AUC cyfartalog o fewn defnyddiwr.

Catboost yn gwybod sut i optimeiddio metrigau graddio o'r blwch. Darllenais am fetrigau graddio, straeon llwyddiant wrth ddefnyddio catboost a gosodwch YetiRankPairwise i hyfforddi dros nos. Nid oedd y canlyniad yn drawiadol. Gan benderfynu nad oeddwn wedi fy hyfforddi'n ddigonol, newidiais y swyddogaeth gwall i QueryRMSE, sydd, a barnu yn ôl y ddogfennaeth catboost, yn cydgyfeirio'n gyflymach. Yn y diwedd, cefais yr un canlyniadau ag wrth hyfforddi ar gyfer dosbarthu, ond rhoddodd ensembles y ddau fodel hyn gynnydd da, a ddaeth â mi i'r safle cyntaf ym mhob un o'r tair cystadleuaeth.

5 munud cyn cau cam ar-lein y gystadleuaeth “Systemau Cydweithredol”, symudodd Sergey Shalnov fi i’r ail safle. Cerddasom y llwybr pellach gyda'n gilydd.

Paratoi ar gyfer y cam all-lein

Cawsom fuddugoliaeth sicr yn y llwyfan ar-lein gyda cherdyn fideo RTX 2080 TI, ond fe wnaeth y brif wobr o 300 rubles ac, yn fwyaf tebygol, hyd yn oed y lle cyntaf terfynol ein gorfodi i weithio am y 000 wythnos hyn.

Fel y digwyddodd, defnyddiodd Sergey catboost hefyd. Fe wnaethom gyfnewid syniadau a nodweddion, a dysgais am adroddiad gan Anna Veronica Dorogush a oedd yn cynnwys atebion i lawer o'm cwestiynau, a hyd yn oed y rhai nad oeddwn wedi'u cael erbyn hynny.

Fe wnaeth edrych ar yr adroddiad fy arwain at y syniad bod angen i ni ddychwelyd yr holl baramedrau i'r gwerth rhagosodedig, a gwneud y gosodiadau'n ofalus iawn a dim ond ar ôl gosod set o nodweddion. Nawr cymerodd un hyfforddiant tua 15 awr, ond llwyddodd un model i gael cyflymder gwell na'r hyn a gafwyd yn yr ensemble gyda safle.

Cynhyrchu nodwedd

Yn y gystadleuaeth Systemau Cydweithredol, asesir bod nifer fawr o nodweddion yn bwysig ar gyfer y model. Er enghraifft, archwilio pwysau_spark_svd - yr arwydd pwysicaf, ond nid oes unrhyw wybodaeth am yr hyn y mae'n ei olygu. Roeddwn i'n meddwl y byddai'n werth cyfrif y gwahanol agregau ar sail nodweddion pwysig. Er enghraifft, auditweights_spark_svd cyfartalog fesul defnyddiwr, fesul grŵp, fesul gwrthrych. Gellir cyfrifo'r un peth gan ddefnyddio data lle nad oes unrhyw hyfforddiant yn cael ei berfformio a tharged = 1, hynny yw, cyfartaledd archwilio pwysau_spark_svd gan ddefnyddiwr yn ôl gwrthrychau roedd yn eu hoffi. Arwyddion pwysig hefyd archwilio pwysau_spark_svd, yr oedd amryw. Dyma rai ohonynt:

  • pwysau archwilioCtrGender
  • archwilio pwysauCtrHigh
  • userOwnerCounterCreateLikes

Er enghraifft, y cyfartaledd pwysau archwilioCtrGender yn ôl userId trodd allan i fod yn nodwedd bwysig, yn union fel y gwerth cyfartalog userOwnerCounterCreateLikes gan userId+ownerId. Dylai hyn eisoes wneud i chi feddwl bod angen i chi ddeall ystyr y meysydd.

Roedd nodweddion pwysig hefyd pwysau archwiliadLikesCount и archwilio pwysauShowsCount. Wrth rannu'r naill â'r llall, cafwyd nodwedd bwysicach fyth.

Data yn gollwng

Mae cystadleuaeth a modelu cynhyrchu yn dasgau gwahanol iawn. Wrth baratoi data, mae'n anodd iawn ystyried yr holl fanylion a pheidio â chyfleu rhywfaint o wybodaeth nad yw'n ddibwys am y newidyn targed yn y prawf. Os ydym yn creu datrysiad cynhyrchu, byddwn yn ceisio osgoi defnyddio gollyngiadau data wrth hyfforddi'r model. Ond os ydym am ennill y gystadleuaeth, yna gollyngiadau data yw'r nodweddion gorau.

Ar ôl astudio'r data, gallwch weld hynny yn ôl y gwerthoedd objectId pwysau archwiliadLikesCount и archwilio pwysauShowsCount newid, sy'n golygu y bydd cymhareb gwerthoedd uchaf y nodweddion hyn yn adlewyrchu'r trosiad post yn llawer gwell na'r gymhareb ar adeg arddangos.

Y gollyngiad cyntaf y daethom o hyd iddo yw pwysau archwilio LikeCountMax/pwysau archwilioShowsCountMax.
Ond beth os edrychwn ni ar y data yn agosach? Gadewch i ni ddidoli yn ôl dyddiad y sioe a chael:

gwrthrychId ID Defnyddiwr archwilio pwysauShowsCount pwysau archwiliadLikesCount targed (yn cael ei hoffi)
1 1 12 3 mae'n debyg na
1 2 15 3 efallai ie
1 3 16 4

Roedd yn syndod pan ddarganfyddais yr enghraifft gyntaf o'r fath a daeth i'r amlwg na ddaeth fy rhagfynegiad yn wir. Ond, gan gymryd i ystyriaeth y ffaith bod gwerthoedd uchaf y nodweddion hyn o fewn y gwrthrych yn rhoi cynnydd, nid oeddem yn ddiog a phenderfynwyd dod o hyd i archwilio pwysauShowsCountNext и pwysau archwiliadLikesCountNesaf, hynny yw, y gwerthoedd ar yr eiliad nesaf mewn amser. Trwy ychwanegu nodwedd
(pwysau archwilioSioeauCyfrifNesaf-PwysauArchwiliadShowsCount)/(pwysau awditsMegis Cyfrif-pwysau archwiliadLikesCountNext) gwnaethom naid sydyn yn gyflym.
Gellid defnyddio gollyngiadau tebyg trwy ddod o hyd i'r gwerthoedd canlynol ar gyfer userOwnerCounterCreateLikes o fewn userId +ownerId ac, er enghraifft, pwysau archwilioCtrGender o fewn objectId+userGender. Canfuom 6 maes tebyg gyda gollyngiadau a thynnu cymaint o wybodaeth â phosibl ohonynt.

Erbyn hynny, roeddem wedi gwasgu cymaint o wybodaeth â phosibl o nodweddion cydweithredol, ond ni wnaethom ddychwelyd i gystadlaethau delwedd a thestun. Roedd gen i syniad gwych i wirio: faint mae nodweddion sy'n seiliedig yn uniongyrchol ar ddelweddau neu destunau yn ei roi mewn cystadlaethau perthnasol?

Nid oedd unrhyw ollyngiadau yn y cystadlaethau delwedd a thestun, ond erbyn hynny roeddwn wedi dychwelyd y paramedrau catboost rhagosodedig, wedi glanhau'r cod ac wedi ychwanegu ychydig o nodweddion. Y cyfanswm oedd:

penderfyniad yn fuan
Uchafswm gyda delweddau 0.6411
Dim delweddau ar y mwyaf 0.6297
Canlyniad ail safle 0.6295

penderfyniad yn fuan
Uchafswm gyda thestunau 0.666
Uchafswm heb destunau 0.660
Canlyniad ail safle 0.656

penderfyniad yn fuan
Uchafswm mewn cydweithrediad 0.745
Canlyniad ail safle 0.723

Daeth yn amlwg nad oeddem yn debygol o allu gwasgu llawer allan o destunau a delweddau, ac ar ôl rhoi cynnig ar un neu ddau o’r syniadau mwyaf diddorol, rhoesom y gorau i weithio gyda nhw.

Ni wnaeth cynhyrchu nodweddion pellach mewn systemau cydweithredol arwain at gynnydd, a dechreuasom raddio. Ar y cam ar-lein, rhoddodd yr ensemble dosbarthu a graddio gynnydd bach i mi, fel y digwyddodd oherwydd fy mod wedi tanhyfforddi'r dosbarthiad. Ni chynhyrchodd unrhyw un o'r swyddogaethau gwall, gan gynnwys YetiRanlPairwise, yn agos at y canlyniad a wnaeth LogLoss (0,745 vs. 0,725). Roedd gobaith o hyd am QueryCrossEntropy, na ellid ei lansio.

Llwyfan all-lein

Ar y cam all-lein, arhosodd y strwythur data yr un fath, ond bu mân newidiadau:

  • ail-randomwyd dynodwyr userId, objectId, perchennogId;
  • tynnwyd sawl arwydd ac ailenwyd amryw;
  • mae'r data wedi cynyddu tua 1,5 gwaith.

Yn ogystal â'r anawsterau a restrwyd, roedd un fantais fawr: dyrannwyd gweinydd mawr gyda RTX 2080TI i'r tîm. Dwi wedi mwynhau htop ers talwm.
SNA Hackathon 2019

Dim ond un syniad oedd - dim ond atgynhyrchu'r hyn sy'n bodoli eisoes. Ar ôl treulio ychydig oriau yn sefydlu'r amgylchedd ar y gweinydd, yn raddol fe ddechreuon ni wirio bod y canlyniadau'n atgynhyrchadwy. Y brif broblem sy'n ein hwynebu yw'r cynnydd yng nghyfaint y data. Fe benderfynon ni leihau'r llwyth ychydig a gosod y paramedr catboost ctr_complexity=1. Mae hyn yn gostwng y cyflymder ychydig, ond dechreuodd fy model weithio, roedd y canlyniad yn dda - 0,733. Ni wnaeth Sergey, yn wahanol i mi, rannu'r data yn 2 ran a hyfforddi ar yr holl ddata, er bod hyn yn rhoi'r canlyniad gorau ar y cam ar-lein, ar y cam all-lein roedd llawer o anawsterau. Pe baem yn cymryd yr holl nodweddion a gynhyrchwyd gennym ac yn ceisio eu gwthio i mewn i catboost, yna ni fyddai dim yn gweithio ar y cam ar-lein. Gwnaeth Sergey optimeiddio teipio, er enghraifft, trosi mathau fflôt64 i fflôt32. Yn yr erthygl hon, Gallwch ddod o hyd i wybodaeth am optimeiddio cof mewn pandas. O ganlyniad, hyfforddodd Sergey ar y CPU gan ddefnyddio'r holl ddata a chafodd tua 0,735.

Roedd y canlyniadau hyn yn ddigon i ennill, ond fe wnaethon ni guddio ein gwir gyflymder a methu bod yn siŵr nad oedd timau eraill yn gwneud yr un peth.

Ymladd i'r olaf

Tiwnio catboost

Cafodd ein datrysiad ei atgynhyrchu'n llawn, fe wnaethom ychwanegu nodweddion data testun a delweddau, felly'r cyfan oedd ar ôl oedd tiwnio'r paramedrau catboost. Hyfforddodd Sergey ar y CPU gyda nifer fach o iteriadau, a hyfforddais ar yr un gyda ctr_complexity=1. Roedd un diwrnod ar ôl, ac os ydych chi newydd ychwanegu iteriadau neu gynyddu ctr_complexity, yna erbyn y bore gallech gael cyflymder hyd yn oed yn well a cherdded drwy'r dydd.

Ar y cam all-lein, gallai cyflymderau gael eu cuddio'n hawdd iawn trwy ddewis nid yr ateb gorau ar y wefan. Roeddem yn disgwyl newidiadau syfrdanol yn y bwrdd arweinwyr yn y munudau olaf cyn i'r cyflwyniadau gau a phenderfynwyd peidio â stopio.

O fideo Anna, dysgais, er mwyn gwella ansawdd y model, ei bod yn well dewis y paramedrau canlynol:

  • cyfradd_dysgu — Cyfrifir y gwerth rhagosodedig ar sail maint y set ddata. Mae cynyddu'r gyfradd ddysgu_ yn gofyn am gynyddu nifer yr iteriadau.
  • l2_dail_reg — Cyfernod rheoleiddio, gwerth diofyn 3, yn ddelfrydol dewiswch rhwng 2 a 30. Mae gostwng y gwerth yn arwain at gynnydd mewn gorffitio.
  • bagging_temperature — yn ychwanegu hapddiad at bwysau gwrthrychau yn y sampl. Y gwerth rhagosodedig yw 1, lle mae'r pwysau'n cael eu tynnu o ddosraniad esbonyddol. Mae gostwng y gwerth yn arwain at gynnydd mewn gorffit.
  • hap_cryfder — Yn effeithio ar y dewis o holltau ar iteriad penodol. Po uchaf yw'r random_strength, yr uchaf yw'r siawns y bydd rhaniad pwysigrwydd isel yn cael ei ddewis. Ar bob iteriad dilynol, mae'r hap yn lleihau. Mae gostwng y gwerth yn arwain at gynnydd mewn gorffit.

Mae paramedrau eraill yn cael effaith llawer llai ar y canlyniad terfynol, felly ni cheisiais eu dewis. Cymerodd un iteriad o hyfforddiant ar fy set ddata GPU gyda ctr_complexity=1 20 munud, ac roedd y paramedrau a ddewiswyd ar y set ddata lai ychydig yn wahanol i'r rhai optimaidd ar y set ddata lawn. Yn y diwedd, gwnes tua 30 iteriad ar 10% o'r data, ac yna tua 10 iteriad arall ar yr holl ddata. Daeth rhywbeth fel hyn allan:

  • cyfradd_dysgu Cynyddais 40% o'r rhagosodiad;
  • l2_dail_reg ei adael yr un peth;
  • bagging_temperature и hap_cryfder gostwng i 0,8.

Gallwn ddod i'r casgliad nad oedd y model wedi'i hyfforddi'n ddigonol gyda'r paramedrau rhagosodedig.

Cefais fy synnu’n fawr pan welais y canlyniad ar y bwrdd arweinwyr:

Model model 1 model 2 model 3 ensemble
Heb diwnio 0.7403 0.7404 0.7404 0.7407
Gyda thiwnio 0.7406 0.7405 0.7406 0.7408

Deuthum i'r casgliad drosof fy hun, os nad oes angen cymhwyso'r model yn gyflym, yna mae'n well disodli'r dewis o baramedrau gydag ensemble o sawl model gan ddefnyddio paramedrau heb eu optimeiddio.

Roedd Sergey yn optimeiddio maint y set ddata i'w redeg ar y GPU. Yr opsiwn symlaf yw torri rhan o'r data i ffwrdd, ond gellir gwneud hyn mewn sawl ffordd:

  • dileu'r data hynaf yn raddol (dechrau mis Chwefror) nes bod y set ddata'n dechrau ffitio i'r cof;
  • dileu nodweddion sydd â'r pwysigrwydd lleiaf;
  • dileu userIds nad oes ond un cofnod ar eu cyfer;
  • gadael dim ond yr IDs defnyddiwr sydd yn y prawf.

Ac yn y pen draw, gwnewch ensemble allan o'r holl opsiynau.

Yr ensemble olaf

Erbyn hwyr gyda'r nos ar y diwrnod olaf, roeddem wedi gosod ensemble o'n modelau a oedd yn rhoi 0,742. Dros nos lansiais fy model gyda ctr_complexity=2 ac yn lle 30 munud fe hyfforddais am 5 awr. Dim ond am 4 y bore y cafodd ei gyfrif, a gwnes yr ensemble olaf, a roddodd 0,7433 ar y bwrdd arweinwyr cyhoeddus.

Oherwydd gwahanol ddulliau o ddatrys y broblem, nid oedd cydberthynas gref rhwng ein rhagfynegiadau, a roddodd gynnydd da yn yr ensemble. I gael ensemble da, mae'n well defnyddio'r model crai rhagfynegiadau rhagfynegi(prediction_type='RawFormulaVal') a gosod scale_pos_weight=neg_count/pos_count.

SNA Hackathon 2019

Ar y wefan gallwch weld canlyniadau terfynol ar y bwrdd arweinwyr preifat.

Datrysiadau eraill

Dilynodd llawer o dimau ganonau algorithmau system argymellwyr. Ni allaf fi, gan nad wyf yn arbenigwr yn y maes hwn, eu gwerthuso, ond cofiaf 2 ateb diddorol.

  • Ateb Nikolay Anokhin. Ni wnaeth Nikolay, sy'n gyflogai i Mail.ru, gais am wobrau, felly nid ei nod oedd cyflawni'r cyflymder uchaf, ond cael datrysiad hawdd ei raddio.
  • Seiliwyd penderfyniad tîm buddugol Gwobr Rheithgor ar yr erthygl hon oddi ar facebook, a ganiateir ar gyfer clystyru delweddau da iawn heb waith llaw.

Casgliad

Beth sy'n aros yn fy nghof fwyaf:

  • Os oes nodweddion categorïaidd yn y data, a'ch bod chi'n gwybod sut i wneud amgodio targed yn gywir, mae'n dal yn well rhoi cynnig ar catboost.
  • Os ydych yn cymryd rhan mewn cystadleuaeth, ni ddylech wastraffu amser yn dewis paramedrau ar wahân i gyfradd_dysgu ac iteriadau. Ateb cyflymach yw gwneud ensemble o sawl model.
  • Gall hwbau ddysgu ar y GPU. Gall Catboost ddysgu'n gyflym iawn ar y GPU, ond mae'n bwyta llawer o gof.
  • Wrth ddatblygu a phrofi syniadau, mae'n well gosod rsm~=0.2 bach (CPU yn unig) a ctr_complexity=1.
  • Yn wahanol i dimau eraill, rhoddodd ensemble ein modelau gynnydd mawr. Dim ond mewn gwahanol ieithoedd y buom yn cyfnewid syniadau ac yn ysgrifennu. Roedd gennym ni ddull gwahanol o rannu’r data ac, rwy’n meddwl, roedd gan bob un ei fygiau ei hun.
  • Nid yw'n glir pam y perfformiodd optimeiddio graddio yn waeth nag optimeiddio dosbarthiad.
  • Cefais rywfaint o brofiad yn gweithio gyda thestunau a dealltwriaeth o sut mae systemau argymell yn cael eu gwneud.

SNA Hackathon 2019

Diolch i'r trefnwyr am yr emosiynau, gwybodaeth a gwobrau a dderbyniwyd.

Ffynhonnell: hab.com

Ychwanegu sylw