SNA Hackathon 2019

2019ko otsailean-martxoan, sare sozialen jarioa sailkatzeko lehiaketa bat egin zen SNA Hackathon 2019, eta bertan gure taldeak lehen postua lortu zuen. Artikuluan lehiaketaren antolaketaz, probatu ditugun metodoez eta big datan entrenatzeko catboost ezarpenez hitz egingo dut.

SNA Hackathon 2019

SNA Hackathon

Hirugarren aldia da izen honekin hackaton bat egiten dena. ok.ru sare sozialak antolatuta dago, hurrenez hurren, zeregina eta datuak sare sozial honekin zuzenean lotuta daude.
SNA (sare sozialen analisia) kasu honetan zuzenago ulertzen da ez grafiko sozial baten analisi gisa, sare sozial baten analisi gisa baizik.

  • 2014an, argitalpen batek lortuko zuen atseden kopurua aurreikustea izan zen.
  • 2016an - VVZ zeregina (agian ezaguna zara), grafiko sozialaren azterketatik gertuago.
  • 2019an, erabiltzailearen jarioaren sailkapena erabiltzaileari mezua gustatuko zaion probabilitatearen arabera.

Ezin dut 2014az esan, baina 2016an eta 2019an, datuak aztertzeko gaitasunez gain, big datarekin lan egiteko trebetasunak ere beharrezkoak ziren. Uste dut lehiaketa hauetara erakarri ninduena ikaskuntza automatikoa eta datu handiak prozesatzeko arazoen konbinazioa izan zela, eta arlo hauetan dudan esperientziak irabazten lagundu zidan.

mlbootcamp

2019an, lehiaketa antolatu zen plataforman https://mlbootcamp.ru.

Lehiaketa otsailaren 7an hasi zen sarean eta 3 zeregin izan zituen. Edonork izena eman zezakeen webgunean, deskargatu oinarri eta kargatu zure autoa ordu batzuetan. Martxoaren 15ean lineako etaparen amaieran, show-jauziko ekitaldi bakoitzeko 15 onenak Mail.ru bulegora gonbidatu zituzten lineaz kanpoko etaparako, martxoaren 30etik apirilaren 1era bitartean.

Task

Iturburuko datuek erabiltzaile IDak (userId) eta argitalpen IDak (objectId) eskaintzen dituzte. Erabiltzaileari argitalpen bat erakutsi bazaio, datuek userId, objectId, mezu honen erabiltzaileen erreakzioak (feedback) eta argazki eta testuetarako hainbat ezaugarri edo esteka dituen lerro bat dauka.

userId objectId jabearenId iritzia irudiak
3555 22 5677 [gustatu zait, egin klik] [hash1]
12842 55 32144 [ez gustatu] [hash2,hash3]
13145 35 5677 [klikatua, partekatua] [hash2]

Proba datu multzoak antzeko egitura dauka, baina feedback eremua falta da. Eginkizuna feedback-aren eremuan 'gustatu' erreakzioaren presentzia aurreikustea da.
Aurkezteko fitxategiak egitura hau du:

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

Neurria erabiltzaileen batez besteko ROC AUC da.

Datuen deskribapen zehatzagoa helbidean aurki daiteke udalaren webgunea. Bertan datuak ere deskarga ditzakezu, probak eta argazkiak barne.

Lineako etapa

Lineako fasean, zeregina 3 zatitan banatu zen

Lineaz kanpoko etapa

Lineaz kanpoko fasean, datuek ezaugarri guztiak barne hartzen zituzten, testuak eta irudiak urriak ziren bitartean. Datu multzoan 1,5 aldiz errenkada gehiago zeuden, eta horietatik asko zeuden jada.

Arazoaren konponbidea

Lanean CV-a egiten dudanez, β€œIrudiak” zereginarekin hasi nuen nire ibilbidea lehiaketa honetan. Emandako datuak userId, objectId, ownerId (argitalpena argitaratu zen taldea), mezua sortzeko eta bistaratzeko denbora-zigiluak eta, jakina, mezu honen irudia izan ziren.
Denbora-zigiluetan oinarritutako hainbat ezaugarri sortu ondoren, hurrengo ideia izan zen imagenet-en aldez aurretik trebatutako neuronaren azken-aurreko geruza hartzea eta txertaketa horiek boostera bidaltzea.

SNA Hackathon 2019

Emaitzak ez ziren ikusgarriak izan. Imagenet neuronaren txertatzeak ez du garrantzirik, pentsatu nuen, nire autokodetzailea egin behar dudala.

SNA Hackathon 2019

Denbora asko behar izan zuen eta emaitza ez zen hobetu.

Ezaugarrien sorrera

Irudiekin lan egiteak denbora asko eskatzen du, beraz, zerbait sinpleagoa egitea erabaki nuen.
Berehala ikusten duzunez, datu multzoan hainbat ezaugarri kategoriko daude, eta gehiegi ez kezkatzeko, catboost hartu dut. Irtenbidea bikaina izan zen, ezarpenik gabe berehala iritsi nintzen sailkapeneko lehen lerrora.

Datu asko dago eta parket formatuan jarrita dago, beraz, bi aldiz pentsatu gabe, scala hartu eta txinpartaz dena idazten hasi nintzen.

Irudien txertaketak baino hazkunde handiagoa eman duten ezaugarri sinpleenak:

  • zenbat aldiz agertzen diren objectId, userId eta ownerId datuetan (ospearekin erlazionatu beharko lukete);
  • userId-ek zenbat mezu ikusi dituen ownerId-etik (erabiltzaileak taldearekiko duen interesarekin erlazionatu beharko luke);
  • zenbat userId esklusiboek ikusi dituzten mezuak ownerId-etik (taldearen audientziaren tamaina islatzen du).

Denbora-zigiluetatik erabiltzaileak jarioa ikusi zuen eguneko ordua lor daiteke (goizez/arratsaldez/arratsaldez/gauez). Kategoria hauek konbinatuz, eginbideak sortzen jarraitu dezakezu:

  • zenbat aldiz saioa hasi zen userId arratsaldean;
  • zer ordutan agertzen den mezu hau gehienetan (objectId) eta abar.

Horrek guztiak pixkanaka neurketak hobetu zituen. Baina prestakuntza datu-multzoaren tamaina 20 milioi erregistro ingurukoa da, beraz, ezaugarriak gehitzeak asko moteldu du prestakuntza.

Datuak erabiltzeko nire ikuspegia birplanteatu dut. Datuak denboraren araberakoak diren arren, "etorkizunean" informazio-filtrazio agerikorik ez nuen ikusi, hala ere, badaezpada, honela banatu nuen:

SNA Hackathon 2019

Emandako prestakuntza multzoa (otsaila eta martxoko 2 aste) 2 zatitan banatu zen.
Azken N egunetako datuekin trebatu zen eredua. Goian deskribatutako agregazioak datu guztietan eraiki ziren, proba barne. Aldi berean, xede-aldagaiaren hainbat kodeketa eraiki daitezkeen datuak agertu dira. Ikuspegirik errazena jada funtzio berriak sortzen ari den kodea berrerabiltzea da, eta entrenatu ez diren datuak elikatzea eta helburu = 1.

Horrela, antzeko ezaugarriak lortu ditugu:

  • Zenbat aldiz ikusi du userId-ek mezu bat talde jabearenId-an;
  • Zenbat aldiz gustatu zaion userId-i mezua taldearen jabeId-en;
  • UserId-ek jabearen Idaztik gustatu zaizkion argitalpenen ehunekoa.

Alegia, atera zen helburuko kodeketa batez bestekoa ezaugarri kategorikoen hainbat konbinaziorako datu-multzoaren zati batean. Printzipioz, catboost-ek xede-kodeketa ere eraikitzen du eta ikuspuntu horretatik ez dago onurarik, baina, adibidez, talde honetako mezuak gustuko zituzten erabiltzaile bakarrak zenbatzea posible egin zen. Aldi berean, helburu nagusia lortu zen - nire datu-multzoa hainbat aldiz murriztu zen, eta eginbideak sortzen jarraitzea posible izan zen.

Catboost-ek gustuko erreakzioaren arabera soilik eraiki dezakeen kodeketa, feedback-ak beste erreakzio batzuk ditu: birpartekatua, gustatu ez zaiona, gustatu ez zaiona, klik egina, ez ikusia izan, eskuz egin daitezkeen kodeketak. Era guztietako agregatuak berriro kalkulatu eta garrantzi txikiko ezaugarriak ezabatu nituen datu multzoa ez puzteko.

Ordurako lehen postuan nengoen alde handiarekin. Nahasgarria zen bakarra irudien txertaketak ia hazkunderik ez zuela erakusten zuen. Catboost-i dena emateko ideia sortu zen. Kmeans irudiak biltzen ditugu eta kategoriako ezaugarrien irudi Catat berria lortzen dugu.

Hona hemen KMeans-etik lortutako klusterrak eskuz iragazi eta batu ondoren klase batzuk.

SNA Hackathon 2019

ImageCat-en oinarrituta sortzen dugu:

  • Ezaugarri kategoriko berriak:
    • Zein imageCat ikusten zen gehien erabiltzaile-Id-ek;
    • Zein imageCat-ek erakusten du gehien jabearen Idaz;
    • Zein irudiCat gustatu zaio gehien userId-ri;
  • Hainbat kontagailu:
    • Zenbat imageCat-ek begiratu zion userId-ari;
    • Antzeko 15 ezaugarri inguru gehi goian deskribatutako xede-kodeketa.

Testuak

Irudi lehiaketako emaitzak egokitu zitzaizkidan eta testuetan probatzea erabaki nuen. Lehenago ez dut testuekin asko landu eta, ergelkeriaz, eguna hil nuen tf-idf eta svd-en. Ondoren, baseline ikusi nuen doc2vec-ekin, behar dudana egiten duena. Doc2vec parametroak apur bat egokituta, testu txertaketak lortu ditut.

Eta, ondoren, irudien kodea berrerabili nuen, eta bertan irudien txertaketak testu txertaketak ordezkatu nituen. Ondorioz, testu lehiaketan 2. postua lortu nuen.

Lankidetza-sistema

Lehiaketa bat geratzen zen oraindik makila batekin "sakatu" ez nuena, eta sailkapeneko AUC-ek ikusita, lehiaketa zehatz honen emaitzek izan behar zuten eragin handiena lineaz kanpoko fasean.
Sorburuko datuetan zeuden ezaugarri guztiak hartu, kategorikoak hautatu eta irudien agregazio berdinak kalkulatu nituen, irudietan oinarritutako ezaugarriak izan ezik. Hau catboost-ean jartzeak 2. postura eraman ninduen.

Catboost optimizazioaren lehen urratsak

Lehenengo postu bat eta bi bigarren postuak gustura geratu ziren, baina ezer berezirik egin ez nuela ulertu nuen, eta horrek esan nahi du postua galtzea espero nezakeela.

Lehiaketaren zeregina erabiltzailearen barruan mezuak sailkatzea da, eta denbora honetan guztian sailkapen arazoa konpontzen ari nintzen, hau da, metrika okerrak optimizatzen.

Adibide erraz bat emango dizut:

userId objectId aurresatea lurreko egia
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

Egin dezagun berrantolaketa txiki bat

userId objectId aurresatea lurreko egia
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

Emaitza hauek lortzen ditugu:

Model AUC Erabiltzailea1 AUC Erabiltzailea2 AUC esan nahi du AUC
Aukera 1 0,8 1,0 0,0 0,5
Aukera 2 0,7 0,75 1,0 0,875

Ikus dezakezunez, AUC metrika orokorra hobetzeak ez du esan nahi erabiltzaile baten batez besteko AUC metrika hobetzea.

Catboost badaki sailkapen-neurriak optimizatzen kutxatik. Sailkapen-neurriei buruz irakurri dut, arrakasta-istorioak catboost erabiltzean eta ezarri YetiRankPairwise gauetik entrenatzeko. Emaitza ez zen ikusgarria izan. Gutxi entrenatu nintzela erabakiz, errore-funtzioa QueryRMSE-ra aldatu nuen, zeina, catboost dokumentazioaren arabera, azkarrago bat egiten duena. Azkenean, sailkapenerako entrenatzerakoan izandako emaitza berberak lortu nituen, baina bi modelo hauen multzoek gorakada ona eman zuten, eta horrek hiru lehiaketetan lehen postura eraman ninduen.

"Collaborative Systems" lehiaketaren online fasea itxi baino 5 minutu lehenago, Sergey Shalnov bigarren postura eraman ninduen. Elkarrekin egin genuen beste bidetik.

Lineaz kanpoko faserako prestatzen

RTX 2080 TI bideo-txartel batekin garaipena ziurtatuta genuen lineako fasean, baina 300 errubloko sari nagusiak eta, ziurrenik, azken lehen postuak ere 000 aste hauetan lan egitera behartu gintuzten.

Gertatu zenez, Sergeyk catboost ere erabili zuen. Ideiak eta ezaugarriak trukatu genituen, eta buruz ikasi nuen Anna Veronica Dorogush-en erreportaia horrek nire galdera askoren erantzunak zituen, baita ordurako oraindik izan ez nituenak ere.

Txostena ikusita, parametro guztiak lehenetsitako baliora itzuli behar ditugula eta ezarpenak kontu handiz egin behar ditugula eta funtzio multzo bat konpondu ondoren bakarrik pentsatu nuen. Orain entrenamendu batek 15 ordu inguru behar zituen, baina eredu batek sailkapenarekin multzoan lortutakoa baino abiadura hobea lortzea lortu zuen.

Ezaugarrien sorrera

Elkarlaneko Sistemak lehiaketan, ezaugarri ugari baloratzen dira eredurako garrantzitsuak direla. Adibidez, auditweights_spark_svd - seinale garrantzitsuena, baina ez dago zer esan nahi duenari buruzko informaziorik. Ezaugarri garrantzitsuetan oinarrituta hainbat agregatu zenbatzea mereziko zuela uste nuen. Adibidez, batez besteko auditweights_spark_svd erabiltzailearen, taldearen eta objektuaren arabera. Gauza bera kalkula daiteke entrenamendurik egiten ez den datuekin eta helburua = 1, hau da, batez bestekoa auditweights_spark_svd erabiltzaileak gustuko dituen objektuen arabera. Seinale garrantzitsuak gainera auditweights_spark_svd, hainbat izan ziren. Hona hemen horietako batzuk:

  • auditweightsCtrGender
  • auditweightsCtrHigh
  • userOwnerCounterCreateLikes

Adibidez, batez bestekoa auditweightsCtrGender userId-en arabera ezaugarri garrantzitsu bat izan zen, batez besteko balioa bezala userOwnerCounterCreateLikes userId+ownerId arabera. Honek dagoeneko eremuen esanahia ulertu behar duzula pentsatu beharko luke.

Ezaugarri garrantzitsuak ere izan ziren auditweightsLikesCount ΠΈ auditweightsShowsCount. Bata bestea zatituz gero, ezaugarri are garrantzitsuagoa lortu zen.

Datu ihesak

Lehiaketa eta ekoizpenaren modelizazioa oso zeregin desberdinak dira. Datuak prestatzerakoan, oso zaila da xehetasun guztiak kontuan hartzea eta proban xede-aldagaiari buruzko informazio ez hutsala ez ematea. Produkzio-irtenbide bat sortzen ari bagara, eredua entrenatzerakoan datu-ihesak erabiltzen saiatuko gara. Baina lehiaketa irabazi nahi badugu, datuen filtrazioak dira ezaugarri onenak.

Datuak aztertuta, objectId balioen arabera ikus dezakezu auditweightsLikesCount ΠΈ auditweightsShowsCount aldatu, eta horrek esan nahi du ezaugarri hauen balio maximoen ratioak osteko bihurketa bistaratzeko unean baino askoz hobeto islatuko duela.

Aurkitu dugun lehen ihesa da auditweightsLikesCountMax/auditweightsShowsCountMax.
Baina zer gertatzen da datuak zehatzago aztertuz gero? Ordena dezagun ikuskizun dataren arabera eta lortu:

objectId userId auditweightsShowsCount auditweightsLikesCount helburua (gustatzen zaio)
1 1 12 3 seguruenik ez
1 2 15 3 agian bai
1 3 16 4

Harrigarria izan zen horrelako lehen adibidea aurkitu nuenean eta nire iragarpena ez zela egia bihurtu. Baina, objektuaren barruan ezaugarri horien gehieneko balioek igoera eman zutela kontuan hartuta, ez ginen alferrak izan eta aurkitzea erabaki genuen. auditorweightsShowsCountNext ΠΈ auditweightsLikesCountNext, hau da, hurrengo momentuko balioak. Ezaugarri bat gehituz
(auditweightsShowsCountHurrengoa-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountNext) salto zorrotza egin genuen azkar.
Antzeko filtrazioak erabil litezke honako balio hauek aurkituz userOwnerCounterCreateLikes userId+ownerId barruan eta, adibidez, auditweightsCtrGender objectId+userGender barruan. Filtrazioekin antzeko 6 eremu aurkitu ditugu eta haietatik ahalik eta informazio gehien atera dugu.

Ordurako, lankidetza-funtzioetatik ahalik eta informazio gehien atera genuen, baina ez ginen irudi- eta testu-lehiaketetara itzuli. Ideia bikaina izan nuen egiaztatzeko: zenbat ematen dute zuzenean irudietan edo testuetan oinarritutako funtzioek lehiaketetan?

Irudi eta testu lehiaketetan ez zegoen filtraziorik, baina ordurako catboost parametro lehenetsiak itzuli, kodea garbitu eta funtzio batzuk gehitu nituen. Guztira:

Erabaki laster
Irudiekin gehienez 0.6411
Gehienez irudirik gabe 0.6297
Bigarren postuaren emaitza 0.6295

Erabaki laster
Gehienez testuekin 0.666
Gehienez testurik gabe 0.660
Bigarren postuaren emaitza 0.656

Erabaki laster
Gehienez lankidetzan 0.745
Bigarren postuaren emaitza 0.723

Testu eta irudiei nekez ateratzeko gai izango ginela nabaria zen, eta ideia interesgarrienetako pare bat probatu ondoren, haiekin lan egiteari utzi genion.

Elkarlaneko sistemetan eginbide gehiago sortzeak ez zuen igoerarik eman, eta sailkapenean hasi ginen. Lineako fasean, sailkapen eta sailkapeneko multzoak igoera txiki bat eman zidan, sailkapena gutxi entrenatu nuelako. Errore-funtzio batek, YetiRanlPairwise barne, ez zuen LogLoss-ek egin zuen emaitzatik gertu (0,745 vs. 0,725). Oraindik itxaropena zegoen QueryCrossEntropyrentzat, ezin izan zen abiarazi.

Lineaz kanpoko etapa

Lineaz kanpoko fasean, datuen egiturak bere horretan jarraitu zuen, baina aldaketa txikiak egon ziren:

  • userId, objectId, ownerId identifikatzaileak berriro ausazkoak dira;
  • hainbat errotulu kendu eta hainbat izena jarri zioten;
  • datuak gutxi gorabehera 1,5 aldiz handitu dira.

Zerrendatutako zailtasunez gain, abantaila handi bat zegoen: taldeari zerbitzari handi bat esleitu zitzaion RTX 2080TI batekin. Aspalditik gozatu dut htop.
SNA Hackathon 2019

Ideia bakarra zegoen: lehendik dagoena erreproduzitzea besterik gabe. Zerbitzarian ingurunea konfiguratzen ordu pare bat eman ondoren, pixkanaka emaitzak errepikagarriak zirela egiaztatzen hasi ginen. Aurrean dugun arazo nagusia datu-bolumenaren igoera da. Karga pixka bat murriztea eta catboost parametroa ctr_complexity=1 ezartzea erabaki dugu. Horrek abiadura apur bat jaisten du, baina nire modeloa lanean hasi zen, emaitza ona izan zen - 0,733. Sergeyk, nik ez bezala, ez zituen datuak 2 zatitan banatu eta datu guztietan entrenatu zuen, nahiz eta honek emaitzarik onenak lineako fasean eman, lineaz kanpoko fasean zailtasun asko zeuden. Sortutako ezaugarri guztiak hartu eta catboost-era sartzen saiatuko bagina, ez litzateke ezer funtzionatuko lineako fasean. Sergeyk motaren optimizazioa egin zuen, adibidez, float64 motak float32 bihurtuz. Artikulu honetan, Panda-n memoria optimizatzeari buruzko informazioa aurki dezakezu. Ondorioz, Sergey CPUan entrenatu zen datu guztiak erabiliz eta 0,735 inguru lortu zuen.

Emaitza hauek nahikoak izan ziren irabazteko, baina gure benetako abiadura ezkutatu genuen eta ezin izan genuen ziur beste taldeek gauza bera egiten ez zutenik.

Borrokatu azkeneraino

Catboost sintonizazioa

Gure irtenbidea guztiz erreproduzitu zen, testu-datuen eta irudien ezaugarriak gehitu genituen, beraz, catboost-en parametroak sintonizatzea besterik ez zen geratzen. Sergey-k CPUan entrenatu zuen iterazio kopuru txiki batekin, eta nik ctr_complexity=1-arekin entrenatu nuen. Egun bat falta zen, eta iterazioak gehitzen badituzu edo ctr_complexity areagotzen bazenu, goizerako abiadura are hobea lortu eta egun osoan ibiliko zara.

Lineaz kanpoko fasean, abiadurak oso erraz ezkutatu daitezke guneko irtenbiderik onena ez aukeratuz. Bidalketak itxi baino lehen azken minutuetan aldaketa zorrotzak espero genituen sailkapenean eta ez gelditzea erabaki genuen.

Annaren bideotik, modeloaren kalitatea hobetzeko, ondoko parametroak hautatzea dela ikasi nuen:

  • ikaskuntza_tasa β€” Balio lehenetsia datu-multzoaren tamainaren arabera kalkulatzen da. Learn_rate handitzeak iterazio kopurua handitzea eskatzen du.
  • l2_hosto_erreg β€” Erregularizazio koefizientea, lehenetsitako 3. balioa, hobe 2tik 30era aukeratu. Balioa murrizteak gainfitzia areagotzea dakar.
  • poltsa_tenperatura β€” ausazkotasuna gehitzen die lagineko objektuen pisuei. Balio lehenetsia 1 da, non pisuak banaketa esponentzial batetik ateratzen diren. Balioa murrizteak gainfitzia handitzea dakar.
  • ausazko_indarra β€” Zatiketen aukeraketari eragiten dio iterazio zehatz batean. Random_strength zenbat eta handiagoa izan, orduan eta aukera handiagoa izango da garrantzi txikiko zatiketa hautatzeko. Ondorengo iterazio bakoitzean, ausazkotasuna gutxitzen da. Balioa murrizteak gainfitzia handitzea dakar.

Beste parametro batzuek askoz eragin txikiagoa dute azken emaitzan, beraz, ez nintzen haiek hautatzen saiatu. Nire GPU datu-multzoan ctr_complexity=1-ekin entrenatzeko iterazio batek 20 minutu behar izan zituen, eta datu-multzo murriztuan hautatutako parametroak datu-multzo osoko optimoetatik apur bat desberdinak ziren. Azkenean, 30 bat iterazio egin nituen datuen %10ean, eta, ondoren, 10 bat iterazio gehiago datu guztietan. Horrelako zerbait atera zen:

  • ikaskuntza_tasa Lehenetsitakotik %40 handitu nintzen;
  • l2_hosto_erreg berdin utzi zuen;
  • poltsa_tenperatura ΠΈ ausazko_indarra 0,8ra murriztu da.

Eredua parametro lehenetsiekin gutxi entrenatu zela ondoriozta dezakegu.

Oso harrituta geratu nintzen emaitza sailkapenean ikusi nuenean:

Model 1 eredua 2 eredua 3 eredua multzoa
Afinatu gabe 0.7403 0.7404 0.7404 0.7407
Afinazioarekin 0.7406 0.7405 0.7406 0.7408

Nire kabuz ondorioztatu nuen ereduaren aplikazio azkarra behar ez bada, hobe dela parametroen hautaketa hainbat ereduren multzo batekin ordeztea optimizatu gabeko parametroak erabiliz.

Sergey datu-multzoaren tamaina optimizatzen ari zen GPUan exekutatzeko. Aukerarik errazena datuen zati bat moztea da, baina hau hainbat modutara egin daiteke:

  • pixkanaka kendu datu zaharrenak (otsailaren hasieran) datu multzoa memorian sartzen hasi arte;
  • garrantzi gutxien duten ezaugarriak kendu;
  • kendu sarrera bakarra duten userIds;
  • utzi proban dauden userId-ak soilik.

Eta azken finean, aukera guztietatik konpartsa bat egin.

Azken konpartsa

Azken eguneko iluntzean, 0,742 eman zuten gure ereduen multzoa jarri genuen. Gauean nire modeloa abiarazi nuen ctr_complexity=2-rekin eta 30 minuturen ordez 5 orduz entrenatu zen. Goizeko 4etan baino ez zen zenbatu, eta azken multzoa egin nuen, 0,7433 eman zuen sailkapen publikoan.

Arazoa konpontzeko planteamendu desberdinak direla eta, gure iragarpenak ez zeuden oso erlazionatuta, eta horrek gorakada ona eman zuen multzoan. Multzo ona lortzeko, hobe da eredu gordinaren iragarpenak predict(prediction_type='RawFormulaVal') erabiltzea eta scale_pos_weight=neg_count/pos_count ezartzea.

SNA Hackathon 2019

Webgunean ikus dezakezu sailkapen pribatuko azken emaitzak.

Beste irtenbide batzuk

Talde askok gomendio sistemaren algoritmoen kanonak jarraitu zituzten. Nik, arlo honetan aditua ez naizenez, ezin ditut ebaluatu, baina 2 irtenbide interesgarri gogoratzen ditut.

  • Nikolay Anokhinen irtenbidea. Nikolayk, Mail.ru-ko langilea izanik, ez zuen saririk eskatu, beraz, bere helburua ez zen abiadura maximoa lortzea, erraz eskala daitekeen irtenbide bat lortzea baizik.
  • Epaimahaiaren Saria irabazi duen taldearen erabakiaren arabera facebookeko artikulu hau, irudien multzoketa oso ona ahalbidetzen zuen eskuzko lan egin gabe.

Ondorioa

Gehien geratu zitzaidan memorian:

  • Datuetan ezaugarri kategorikoak badaude eta xede-kodeketa behar bezala egiten badakizu, hobe da catboost probatzea.
  • Lehiaketa batean parte hartzen ari bazara, ez duzu denbora galdu behar learning_rate eta iterazioak ez diren parametroak hautatzen. Irtenbide azkarrago bat hainbat modeloren multzoa egitea da.
  • Boostings GPUan ikas daiteke. Catboost-ek oso azkar ikas dezake GPUan, baina memoria asko jaten du.
  • Ideien garapenean eta proban zehar, hobe da rsm~=0.2 txiki bat ezartzea (CPU soilik) eta ctr_complexity=1.
  • Beste talde batzuek ez bezala, gure modeloen multzoak gorakada handia eman zuen. Ideiak trukatu eta hizkuntza ezberdinetan idazten genituen. Datuak banatzeko beste ikuspegi bat genuen eta, nire ustez, bakoitzak bere akatsak zituen.
  • Ez dago argi zergatik sailkapenaren optimizazioa sailkapenaren optimizazioa baino okerragoa izan zen.
  • Testuekin lan egiten esperientzia pixka bat lortu nuen eta gomendio sistemak nola egiten diren ulertzeko.

SNA Hackathon 2019

Eskerrik asko antolatzaileei jasotako emozio, ezagutza eta sariengatik.

Iturria: www.habr.com

Gehitu iruzkin berria