SNA Hackathon 2019

Am Februar-Mäerz 2019 gouf e Concours ofgehale fir de sozialen Netzwierkfeed ze klasséieren SNA Hackathon 2019, an där eis Equipe déi éischt Plaz geholl huet. Am Artikel wäert ech iwwer d'Organisatioun vum Concours schwätzen, d'Methoden déi mir probéiert hunn an d'Catboost-Astellunge fir Training op Big Data.

SNA Hackathon 2019

SNA Hackathon

Et ass déi drëtte Kéier datt en Hackathon ënnert dësem Numm ofgehale gëtt. Et gëtt vum sozialen Netzwierk ok.ru organiséiert, respektiv d'Aufgab an d'Donnéeë sinn direkt mat dësem sozialen Netzwierk verbonnen.
SNA (sozial Netzwierk Analyse) ass an dësem Fall méi korrekt net als Analyse vun enger sozialer Grafik, mä éischter als Analyse vun engem sozialen Netzwierk verstanen.

  • Am Joer 2014 war d'Aufgab d'Zuel vun de Likes virauszesoen e Post géif kréien.
  • An 2016 - d'VVZ Aufgab (vläicht Dir kennt), méi no un der Analyse vun der sozialer Grafik.
  • Am Joer 2019, Ranking vum Benotzerfeed baséiert op der Wahrscheinlechkeet datt de Benotzer de Post gär huet.

Ech kann net iwwer 2014 soen, awer am Joer 2016 an 2019, nieft Datenanalysefäegkeeten, waren och Fäegkeeten fir mat Big Data ze schaffen erfuerderlech. Ech mengen et war d'Kombinatioun vu Maschinnléieren a grouss Datenveraarbechtungsproblemer, déi mech op dës Concoursen ugezunn hunn, a meng Erfahrung an dëse Beräicher huet mir gehollef ze gewannen.

mlbootcamp

Am Joer 2019 gouf de Concours op der Plattform organiséiert https://mlbootcamp.ru.

De Concours huet de 7. Februar online ugefaang an huet aus 3 Aufgaben bestanen. Jiddereen konnt sech um Site aschreiwen, download Baseline an lued Ären Auto fir e puer Stonnen. Um Enn vun der Online Bühn de 15. Mäerz sinn déi Top 15 vun all Show Jumping Event op de Mail.ru Büro invitéiert fir d'Offline Bühn, déi vum 30. Mäerz bis den 1. Abrëll stattfonnt huet.

Objective

D'Quelldaten liwweren User IDs (userId) a Post IDs (objectId). Wann de Benotzer e Post gewise gouf, dann enthalen d'Donnéeën eng Zeil mat UserId, ObjectId, Benotzerreaktiounen op dëse Post (Feedback) an eng Rei vu verschiddene Funktiounen oder Linken op Biller an Texter.

Benotzer ID objectId BesëtzerId Feedback Biller
3555 22 5677 [gefällt, geklickt] [hash1]
12842 55 32144 [net gär] [hash2, hash3]
13145 35 5677 [geklickt, gedeelt] [hash2]

Den Testdatenset enthält eng ähnlech Struktur, awer de Feedbackfeld fehlt. D'Aufgab ass d'Präsenz vun der 'gefällt' Reaktioun am Feedbackfeld virauszesoen.
De Soumissiounsdatei huet déi folgend Struktur:

Benotzer ID Sortéiert Lëscht[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

D'Metrik ass den duerchschnëttleche ROC AUC fir Benotzer.

Eng méi detailléiert Beschreiwung vun den Donnéeën fannt Dir op Gemengerot Websäit. Dir kënnt och Daten do eroflueden, dorënner Tester a Biller.

Online Etapp

Op der Online-Bühn gouf d'Aufgab an 3 Deeler opgedeelt

  • Zesummenaarbecht System - enthält all Funktiounen ausser Biller an Texter;
  • Biller - enthält nëmmen Informatioun iwwer Biller;
  • Texter - enthält nëmmen Informatioun iwwer Texter.

Offline Etapp

Op der Offline-Bühn hunn d'Donnéeën all Feature abegraff, während Texter a Biller schaarf waren. Et waren 1,5 Mol méi Reihen am Dataset, vun deenen et scho vill waren.

D'Léisung vum Problem

Well ech CV op der Aarbecht maachen, hunn ech meng Rees an dësem Concours mat der Aufgab "Biller" ugefaang. D'Donnéeën déi geliwwert goufen waren userId, objectId, ownerId (de Grupp an deem de Post publizéiert gouf), Zäitstempel fir d'Erstelle an d'Affichage vum Post, an natierlech d'Bild fir dëse Post.
Nodeem e puer Features op Basis vun Zäitstempel generéiert hunn, war déi nächst Iddi d'Penultimate Schicht vum Neuron ze huelen, dee viraus trainéiert gouf op Imagenet an dës Embeddings ze schécken.

SNA Hackathon 2019

D'Resultater waren net beandrockend. Embeddings vum Imagenet Neuron sinn irrelevant, ech hu geduecht, ech muss mäin eegenen Autoencoder maachen.

SNA Hackathon 2019

Et huet vill Zäit gedauert an d'Resultat huet sech net verbessert.

Feature Generatioun

Mat Biller ze schaffen brauch vill Zäit, also hunn ech beschloss eppes méi einfach ze maachen.
Wéi Dir direkt gesitt, sinn et e puer kategoresch Features am Dataset, a fir net ze vill ze stéieren, hunn ech just Catboost geholl. D'Léisung war exzellent, ouni Astellunge sinn ech direkt op déi éischt Zeil vum Leaderboard komm.

Et gëtt zimmlech vill Donnéeën an et ass am Parkettformat ausgeluecht, also ouni zweemol ze denken, hunn ech Scala geholl an ugefaang alles an Spark ze schreiwen.

Déi einfachst Features, déi méi Wuesstum ginn hunn wéi Bildbebauungen:

  • wéivill Mol ObjectId, UserId an OwnerId an den Donnéeën opgetaucht sinn (soll mat Popularitéit korreléieren);
  • wéivill Posts userId vun OwnerId gesinn huet (soll mam Interesse vum Benotzer an der Grupp korreléieren);
  • wéivill eenzegaarteg UserIds gekuckt Posts vum BesëtzerId (reflektéiert d'Gréisst vum Publikum vum Grupp).

Vun Zäitstempele war et méiglech d'Zäit vum Dag ze kréien, wou de Benotzer d'Feed gekuckt huet (Moien / Nomëtteg / Owend / Nuecht). Andeems Dir dës Kategorien kombinéiere kënnt Dir weider Features generéieren:

  • wéi oft userId owes ageloggt ass;
  • zu wéi enger Zäit dëse Post am meeschten gewise gëtt (objectId) a sou weider.

All dëst huet d'Metriken lues a lues verbessert. Awer d'Gréisst vum Trainingsdataset ass ongeféier 20M records, sou datt d'Features derbäigesat hunn den Training staark verlangsamt.

Ech hunn meng Approche iwwer d'Benotzung vun Daten iwwerluecht. Och wann d'Daten Zäit-ofhängeg sinn, hunn ech keng offensichtlech Informatioun Leckage "an Zukunft" gesinn, trotzdem, just am Fall, hunn ech se esou opgebrach:

SNA Hackathon 2019

De Formatiounsset, deen eis geliwwert gouf (Februar an 2 Wochen Mäerz) war an 2 Deeler opgedeelt.
De Modell gouf op Daten aus de leschten N Deeg trainéiert. Déi uewe beschriwwe Aggregatioune goufen op all Daten gebaut, och den Test. Zur selwechter Zäit sinn Daten opgetaucht, op deenen et méiglech ass verschidde Kodéierunge vun der Zilvariabel ze bauen. Déi einfachst Approche ass de Code weiderbenotzen, dee scho nei Features erstellt, an einfach Daten fidderen op déi et net trainéiert gëtt an Zil = 1.

Also hu mir ähnlech Features:

  • Wéi oft huet userId e Post an der Group ownerId gesinn;
  • Wéi oft userId de Post an der Grupp BesëtzerId gefall huet;
  • De Prozentsaz vun de Posts déi userId vum BesëtzerId gär huet.

Dat heescht, huet sech erausgestallt heescht Zil Kodéierung op en Deel vum Dataset fir verschidde Kombinatioune vu kategoreschen Features. Am Prinzip baut Catboost och Zilkodéierung an aus dëser Siicht gëtt et kee Virdeel, awer zum Beispill gouf et méiglech d'Zuel vun eenzegaartege Benotzer ze zielen déi Posts an dëser Grupp gär hunn. Zur selwechter Zäit gouf d'Haaptziel erreecht - meng Dataset gouf e puer Mol reduzéiert, an et war méiglech weider Features ze generéieren.

Wärend Catboost Kodéierung nëmmen op Basis vun der gär Reaktioun ka bauen, huet de Feedback aner Reaktiounen: reshared, disliked, unliked, clicked, ignored, codings for which can be made manually. Ech hunn all Zorte vun Aggregaten nei berechent an d'Features mat gerénger Wichtegkeet eliminéiert fir den Dataset net opzebauen.

Deemools war ech mat groussem Spillraum op der éischter Plaz. Dat eenzegt wat duerchernee war, war datt d'Bildbebauung bal kee Wuesstum gewisen huet. D'Iddi koum alles fir de Catboost ze ginn. Mir cluster Kmeans Biller a kréien eng nei kategoresch Feature imageCat.

Hei sinn e puer Klassen no manueller Filteren a Fusioun vu Stärekéip kritt vu KMeans.

SNA Hackathon 2019

Baséierend op imageCat generéiere mir:

  • Nei kategoresch Features:
    • Wéi eng ImageCat gouf am meeschten vum UserId gekuckt;
    • Wéi eng ImageCat weist meeschtens BesëtzerId;
    • Wéi eng imageCat gouf am meeschte gefall vum UserId;
  • Verschidde Konter:
    • Wéi vill eenzegaarteg imageCat op userId gekuckt;
    • Ongeféier 15 ähnlech Funktiounen plus Zilkodéierung wéi uewen beschriwwen.

Texter

D'Resultater am Bildkonkurrenz hu mir gepasst an ech hu beschloss, Texter ze probéieren. Ech hunn nach net vill mat Texter geschafft an, domm, hunn ech den Dag op tf-idf an svd ëmbruecht. Duerno hunn ech d'Basislinn mat doc2vec gesinn, wat genau mécht wat ech brauch. Nodeems ech d'doc2vec Parameteren liicht ugepasst hunn, krut ech Text Embeddings.

An dunn hunn ech de Code fir d'Biller einfach erëmbenotzt, an deem ech d'Bildbefestegungen duerch Textbebauungen ersat hunn. Als Resultat hunn ech 2. Plaz am Text Concours.

Zesummenaarbecht System

Et war nach ee Concours, deen ech nach net mat engem Bengel "gepockt" haten, an no der AUC op der Leaderboard ze beuerteelen, sollten d'Resultater vun dësem bestëmmte Concours de gréissten Impakt op der Offline-Bühn hunn.
Ech hunn all d'Features geholl, déi an de Quelldaten waren, kategoresch ausgewielt an déi selwecht Aggregater berechent wéi fir Biller, ausser Features op Basis vun de Biller selwer. Just dëst an Catboost ze setzen huet mech op 2. Plaz.

Éischt Schrëtt vun der Catboost Optimisatioun

Eng éischt an zwou zweet Plazen hunn mech gefreet, awer et war e Verständnis datt ech näischt Besonnesches gemaach hunn, dat heescht datt ech e Verloscht vu Positioun erwaarden.

D'Zil vum Concours ass Posts am Benotzer ze rangéieren, an all dës Zäit hunn ech de Klassifikatiounsproblem geléist, dat heescht, déi falsch Metrik optimiséieren.

Loosst mech Iech en einfacht Beispill ginn:

Benotzer ID objectId Cepheid Grond Wourecht
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

Loosst eis eng kleng Rearrangement maachen

Benotzer ID objectId Cepheid Grond Wourecht
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

Mir kréien déi folgend Resultater:

De Modell AUC Benotzer1 AUC Benotzer2 AUC heescht AUC
Option 1 0,8 1,0 0,0 0,5
Option 2 0,7 0,75 1,0 0,875

Wéi Dir kënnt gesinn, d'Verbesserung vun der Gesamt AUC Metrik heescht net d'Verbesserung vun der Moyenne AUC Metrik bannent engem Benotzer.

Catboost weess wéi Ranking Metriken optimiséieren vun der Këscht. Ech liesen iwwer Ranking Metriken, Erfollegsgeschichten wann Dir Catboost benotzt a setzt YetiRankPairwise fir Iwwernuechtung ze trainéieren. D'Resultat war net beandrockend. Entscheet datt ech ënnertrainéiert war, hunn ech d'Fehlerfunktioun op QueryRMSE geännert, déi, no der Catboost-Dokumentatioun beurteelen, méi séier konvergéiert. Um Enn krut ech déi selwecht Resultater wéi beim Training fir d'Klassifikatioun, awer d'Ensemblen vun dësen zwee Modeller hunn eng gutt Erhéijung ginn, wat mech op déi éischt Plaz an allen dräi Concoursen bruecht huet.

5 Minutte virum Schluss vun der Online Etapp vum Concours "Collaborative Systems" huet de Sergey Shalnov mech op déi zweet Plaz geplënnert. Mir sinn zesummen de weidere Wee gaangen.

Virbereedung fir d'Offline Stage

Mir waren garantéiert Victoire an der online Etapp mat enger RTX 2080 TI Video Kaart, mä den Haaptpräis vun 300 Rubelen an, wahrscheinlech, och déi lescht éischt Plaz gezwongen eis fir dës 000 Wochen ze schaffen.

Wéi et sech erausstellt, huet de Sergey och Catboost benotzt. Mir hunn Iddien a Fonctiounen austauscht, an ech hunn iwwer geléiert Bericht vum Anna Veronica Dorogush déi Äntwerten op vill vu menge Froen enthält, an och déi, déi ech bis deemools nach net hat.

De Bericht gesinn huet mech op d'Iddi gefouert datt mir all Parameteren op de Standardwäert zréckginn, an d'Astellunge ganz suergfälteg maachen an nëmmen nodeems Dir eng Rei vu Feature fixéiert. Elo huet een Training ongeféier 15 Stonnen gedauert, awer ee Modell huet et fäerdeg bruecht eng Geschwindegkeet besser ze kréien wéi déi am Ensembel mam Ranking.

Feature Generatioun

Am Collaborative Systems Concours ginn eng grouss Zuel vu Funktiounen als wichteg fir de Modell bewäert. Zum Beispill, auditweights_spark_svd - dat wichtegst Zeechen, awer et gëtt keng Informatioun iwwer wat et heescht. Ech hu geduecht datt et derwäert wier déi verschidde Aggregater op Basis vu wichtege Featuren ze zielen. Zum Beispill, duerchschnëttlech Auditweights_spark_svd vum Benotzer, duerch Grupp, vum Objet. Datselwecht kann berechent ginn mat Daten op déi keng Ausbildung gemaach gëtt an Ziel = 1, dat heescht duerchschnëttlech auditweights_spark_svd vum Benotzer duerch Objeten déi hie gär huet. Wichteg Schëlder ausser auditweights_spark_svd, et waren e puer. Hei sinn e puer vun hinnen:

  • auditweightsCtrGender
  • auditweightsCtrHigh
  • userOwnerCounterCreateLikes

Zum Beispill, der Moyenne auditweightsCtrGender laut UserId huet et sech als eng wichteg Feature erausgestallt, grad wéi den Duerchschnëttswäert userOwnerCounterCreateLikes vum userId+ownerId. Dëst sollt Iech scho mengen datt Dir d'Bedeitung vun de Felder muss verstoen.

Och wichteg Fonctiounen waren auditweightsLikesCount и auditweightsShowsCount. Een duerch deen aneren deelen, gouf eng nach méi wichteg Feature kritt.

Datelek

Konkurrenz a Produktiounsmodelléierung si ganz verschidden Aufgaben. Wann Dir Daten virbereet, ass et ganz schwéier all Detailer ze berücksichtegen an net e puer net-trivial Informatioun iwwer d'Zilvariabel am Test ze vermëttelen. Wa mir eng Produktiounsléisung kreéieren, wäerte mir probéieren d'Benotzung vun Datenlecks beim Training vum Modell ze vermeiden. Awer wa mir d'Konkurrenz wëllen gewannen, da sinn Datenleck déi bescht Features.

Nodeems Dir d'Daten studéiert hutt, kënnt Dir dat no den ObjectId Wäerter gesinn auditweightsLikesCount и auditweightsShowsCount änneren, dat heescht datt de Verhältnis vun de maximale Wäerter vun dëse Funktiounen d'Postkonversioun vill besser reflektéiert wéi d'Verhältnis zum Zäitpunkt vum Display.

Déi éischt Leck déi mir fonnt hunn ass auditweightsLikesCountMax/auditweightsShowsCountMax.
Awer wat wa mir d'Donnéeë méi genau kucken? Loosst eis no Showdatum sortéieren a kréien:

objectId Benotzer ID auditweightsShowsCount auditweightsLikesCount Ziel (gëtt gär)
1 1 12 3 wahrscheinlech net
1 2 15 3 vläicht jo
1 3 16 4

Et war iwwerraschend wéi ech dat éischt sou Beispill fonnt hunn an et huet sech erausgestallt datt meng Prognose net richteg ass. Awer wann Dir d'Tatsaach berücksichtegt datt d'maximal Wäerter vun dësen Charakteristiken am Objet eng Erhéijung ginn hunn, ware mir net faul an hunn decidéiert ze fannen auditweightsShowsCountNext и auditweightsLikesCountNext, dat heescht d'Wäerter am nächste Moment an der Zäit. Andeems Dir eng Feature bäidréit
(auditweightsShowsCountNext-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountNext) mir hu séier e schaarfe Sprong gemaach.
Ähnlech Leckage kéinte benotzt ginn andeems Dir déi folgend Wäerter fënnt userOwnerCounterCreateLikes bannent userId+ownerId an z.B. auditweightsCtrGender bannent objectId+userGender. Mir hunn 6 ähnlech Felder mat Leck fonnt an esou vill wéi méiglech Informatioune vun hinnen extrahéiert.

Zu där Zäit hu mir sou vill Informatioun wéi méiglech aus Zesummenaarbecht Feature gepresst, awer sinn net zréck op Bild- an Textconcoursen. Ech hat eng gutt Iddi fir ze kontrolléieren: wéi vill ginn d'Features direkt op Biller oder Texter an relevante Concoursen?

Et waren keng Leckage am Bild- an Textwettbewerb, awer zu där Zäit hunn ech d'Standardcatboost-Parameter zréckginn, de Code gebotzt an e puer Features bäigefüügt. Den Total war:

Decisioun geschwënn
Maximum mat Biller 0.6411
Maximum keng Biller 0.6297
Zweet Plaz Resultat 0.6295

Decisioun geschwënn
Maximum mat Texter 0.666
Maximum ouni Texter 0.660
Zweet Plaz Resultat 0.656

Decisioun geschwënn
Maximum an Zesummenaarbecht 0.745
Zweet Plaz Resultat 0.723

Et gouf offensichtlech datt mir onwahrscheinlech vill aus Texter a Biller kënnen ausdrécken, an nodeems mir e puer vun den interessantsten Iddien probéiert hunn, hu mir opgehalen mat hinnen ze schaffen.

Weider Generatioun vun Fonctiounen an Zesummenaarbecht Systemer huet keng Erhéijung ginn, a mir ugefaang Ranking. Op der Online-Bühn huet d'Klassifikatioun an d'Ranking-Ensemble mir eng kleng Erhéijung ginn, wéi et sech erausgestallt huet, well ech de Klassement ënnertrainéiert hunn. Keen vun de Fehlerfunktiounen, dorënner YetiRanlPairwise, huet iwwerall no dem Resultat produzéiert datt LogLoss gemaach huet (0,745 vs. 0,725). Et war nach ëmmer Hoffnung fir QueryCrossEntropy, déi net lancéiert konnt ginn.

Offline Etapp

Op der offline Stadium ass d'Datestruktur d'selwecht bliwwen, awer et goufen kleng Ännerungen:

  • Identifizéierer userId, objectId, ownerId goufen nei randomiséiert;
  • e puer Schëlder goufen ewechgeholl an e puer goufen ëmbenannt;
  • d'Daten sinn ongeféier 1,5 Mol eropgaang.

Zousätzlech zu de opgezielte Schwieregkeeten, gouf et e grousse Plus: d'Equipe gouf e grousse Server mat engem RTX 2080TI zougewisen. Ech hunn htop scho laang genoss.
SNA Hackathon 2019

Et war nëmmen eng Iddi - einfach ze reproduzéieren wat schonn existéiert. Nodeems mir e puer Stonnen d'Ëmfeld um Server verbruecht hunn, hu mir lues a lues ugefaang ze verifizéieren datt d'Resultater reproduzéierbar waren. Den Haaptproblem dee mir konfrontéiert ass d'Erhéijung vum Datevolumen. Mir hu beschloss d'Laascht e bëssen ze reduzéieren an de Catboost Parameter ctr_complexity=1 ze setzen. Dëst reduzéiert d'Geschwindegkeet e bëssen, awer mäi Modell huet ugefaang ze schaffen, d'Resultat war gutt - 0,733. De Sergey, am Géigesaz zu mir, huet d'Donnéeën net an 2 Deeler opgedeelt an op all Daten trainéiert, obwuel dëst déi bescht Resultater op der Online-Bühn ginn huet, an der Offline-Bühn waren et vill Schwieregkeeten. Wa mir all d'Features huelen déi mir generéiert hunn a probéiert se an de Catboost ze drécken, da géif näischt op der Online-Bühn funktionnéieren. De Sergey huet Typoptimiséierung gemaach, zum Beispill, float64 Typen op float32 ëmgewandelt. An dësem Artikel, Dir kënnt Informatioun iwwer Erënnerungsoptimiséierung a Pandas fannen. Als Resultat huet de Sergey op der CPU trainéiert mat all Daten a krut ongeféier 0,735.

Dës Resultater ware genuch fir ze gewannen, awer mir hunn eis richteg Geschwindegkeet verstoppt a konnten net sécher sinn datt aner Équipen datselwecht maachen.

Kampf bis zum leschte

Catboost Tuning

Eis Léisung gouf komplett reproduzéiert, mir hunn d'Features vun Textdaten a Biller bäigefüügt, sou datt alles wat bliwwen ass d'Catboost-Parameteren ofzestëmmen. De Sergey trainéiert op der CPU mat enger klenger Unzuel vun Iteratiounen, an ech trainéiert op der mat ctr_complexity=1. Et war nach een Dag, a wann Dir just Iteratiounen bäigefüügt hutt oder d'ctr_complexity erhéicht hutt, da kënnt Dir de Moien nach eng besser Geschwindegkeet kréien an de ganzen Dag zu Fouss goen.

Op der offline Etapp kënne Geschwindegkeete ganz einfach verstoppt ginn andeems Dir einfach net déi bescht Léisung um Site wielt. Mir erwaarden drastesch Ännerungen am Leaderboard an de leschte Minutte virun der Soumissioun zougemaach an decidéiert net ze stoppen.

Vum Anna sengem Video hunn ech geléiert datt fir d'Qualitéit vum Modell ze verbesseren ass et am beschten déi folgend Parameteren ze wielen:

  • léieren_rate - De Standardwäert gëtt berechent baséiert op der Gréisst vum Datesaz. D'Erhéijung vun der Léierrate erfuerdert d'Erhéijung vun der Unzuel vun Iteratiounen.
  • l2_leaf_reg — Regularisatiounskoeffizient, Standardwäert 3, am léifsten vun 2 op 30 wielen. D'Verréngerung vum Wäert féiert zu enger Erhéijung vun der Iwwerfit.
  • bagging_temperatur - füügt Randomiséierung un d'Gewichte vun Objeten an der Probe. De Standardwäert ass 1, wou d'Gewiichter aus enger exponentieller Verdeelung gezunn ginn. Ofsenkung vum Wäert féiert zu enger Erhéijung vun der Iwwerfit.
  • random_strength - Afloss op d'Wiel vu Spaltungen op enger spezifescher Iteratioun. Wat méi héich ass random_strength, wat méi héich ass d'Chance datt eng niddereg Wichtegkeet Split ausgewielt gëtt. Bei all spéider Iteratioun fällt d'Zoufällegkeet erof. Ofsenkung vum Wäert féiert zu enger Erhéijung vun der Iwwerfit.

Aner Parameteren hunn e vill méi klengen Effekt op d'Endresultat, also hunn ech net probéiert se ze wielen. Eng Iteratioun vum Training op menger GPU-Datebank mat ctr_complexity = 1 huet 20 Minutten gedauert, an déi gewielte Parameteren op der reduzéierter Dataset ware liicht anescht wéi déi optimal op der ganzer Datesaz. Um Enn hunn ech ongeféier 30 Iteratiounen op 10% vun den Donnéeën gemaach, an dann ongeféier 10 méi Iteratiounen op all Daten. Et huet sech sou eppes erausgestallt:

  • léieren_rate Ech vergréissert vun 40% aus der Default;
  • l2_leaf_reg lénks et déi selwecht;
  • bagging_temperatur и random_strength reduzéiert op 0,8.

Mir kënnen ofschléissen datt de Modell mat de Standardparameter ënnertrainéiert gouf.

Ech war ganz iwwerrascht wéi ech d'Resultat um Leaderboard gesinn hunn:

De Modell Modell 1 Modell 2 Modell 3 ensemble
Ouni tuning 0.7403 0.7404 0.7404 0.7407
Mat Tuning 0.7406 0.7405 0.7406 0.7408

Ech hunn fir mech selwer ofgeschloss datt wann eng séier Uwendung vum Modell net gebraucht gëtt, ass et besser d'Auswiel vu Parameteren mat engem Ensembel vu verschiddene Modeller ze ersetzen mat net-optimiséierte Parameteren.

De Sergey huet d'Gréisst vum Dataset optiméiert fir se op der GPU ze lafen. Déi einfachst Optioun ass en Deel vun den Donnéeën ofzeschneiden, awer dëst kann op verschidde Weeër gemaach ginn:

  • lues a lues déi eelst Donnéeën ewechhuelen (Ufank Februar) bis d'Dateset ufänkt an d'Erënnerung ze passen;
  • ewechzehuelen Fonctiounen mat der niddregster Wichtegkeet;
  • läschen UserIds fir déi et nëmmen eng Entrée gëtt;
  • loosst nëmmen d'UserIden déi am Test sinn.

A schlussendlech maacht en Ensembel aus allen Optiounen.

Déi lescht Ensembel

Um spéiden Owend vum leschten Dag hu mir en Ensembel vun eise Modeller geluecht, déi 0,742 erausginn. Iwwernuechtung hunn ech mäi Modell mat ctr_complexity=2 lancéiert an amplaz 30 Minutten huet en 5 Stonnen trainéiert. Eréischt um 4 Auer gouf et gezielt, an ech hunn dee leschten Ensembel gemaach, deen op der ëffentlecher Leaderboard 0,7433 ginn huet.

Wéinst verschiddenen Approche fir de Problem ze léisen, waren eis Prognosen net staark korreléiert, wat e gudde Steigerung vum Ensembel ginn huet. Fir e gudden Ensembel ze kréien, ass et besser d'Rohmodell Prognosen virauszesoen (prediction_type='RawFormulaVal') a setze scale_pos_weight=neg_count/pos_count.

SNA Hackathon 2019

Op der Websäit kënnt Dir gesinn Finale Resultater op der privater Leaderboard.

Aner Léisungen

Vill Teams hunn d'Kanonen vun de Recommandatiounssystem Algorithmen gefollegt. Ech, net en Expert an dësem Beräich, kann se net evaluéieren, mee ech erënneren 2 interessant Léisungen.

  • Nikolay Anokhin Léisung. Nikolay, als Employé vun Mail.ru, huet net fir Präisser gëlle, sou war säin Zil net maximal Geschwindegkeet ze erreechen, mä eng einfach scalable Léisung ze kréien.
  • Jury Präis Gewënner Equipe d'Decisioun baséiert op dësen Artikel vu Facebook, erlaabt fir ganz gutt Bildclusterung ouni manuell Aarbecht.

Konklusioun

Wat am meeschten a menger Erënnerung stoungen:

  • Wann et kategoresch Features an den Donnéeën sinn, an Dir wësst wéi Dir Zilkodéierung richteg maacht, ass et nach ëmmer besser Catboost ze probéieren.
  • Wann Dir un engem Concours deelhëllt, sollt Dir keng Zäit verschwenden andeems Dir aner Parameteren wéi learning_rate an Iteratiounen auswielen. Eng méi séier Léisung ass en Ensembel vu verschiddene Modeller ze maachen.
  • Boosting kann op der GPU léieren. Catboost kann ganz séier op der GPU léieren, awer et ësst vill Erënnerung.
  • Wärend der Entwécklung an Testen vun Iddien ass et besser e klenge rsm ~=0.2 (nëmmen CPU) an ctr_complexity=1 ze setzen.
  • Am Géigesaz zu aneren Teams huet den Ensembel vun eise Modeller eng grouss Erhéijung ginn. Mir hunn nëmmen Iddien ausgetosch an a verschiddene Sprooche geschriwwen. Mir haten eng aner Approche fir d'Daten opzedeelen an, ech mengen, jidderee hat seng eege Bugs.
  • Et ass net kloer firwat d'Rankingoptimiséierung méi schlecht gemaach huet wéi d'Klassifikatiounsoptimiséierung.
  • Ech krut e puer Erfahrung mat Texter ze schaffen an e Verständnis vu wéi Recommandatiounssystemer gemaach ginn.

SNA Hackathon 2019

Merci den Organisateuren fir d'Emotiounen, d'Wëssen an d'Präisser.

Source: will.com

Setzt e Commentaire