SNA Hackathon 2019

2019 жылдың ақпан-наурыз айларында әлеуметтік желі лентасын саралау бойынша байқау өтті SNA Hackathon 2019, онда біздің команда бірінші орынды иеленді. Мақалада мен жарысты ұйымдастыру, біз қолданып көрген әдістер және үлкен деректер бойынша жаттығуларға арналған catboost параметрлері туралы айтатын боламын.

SNA Hackathon 2019

SNA Hackathon

Мұндай атаумен хакатон үшінші рет өткізіліп отыр. Оны ok.ru әлеуметтік желісі ұйымдастырады, сәйкесінше тапсырма мен деректер осы әлеуметтік желіге тікелей қатысты.
SNA (әлеуметтік желіні талдау) бұл жағдайда әлеуметтік графикті талдау ретінде емес, әлеуметтік желіні талдау ретінде дұрысырақ түсініледі.

  • 2014 жылы постқа қанша ұнайтынын болжау міндеті тұрды.
  • 2016 жылы - VVZ тапсырмасы (мүмкін сіз таныс шығарсыз), әлеуметтік графикті талдауға жақынырақ.
  • 2019 жылы пайдаланушының жазбаны ұнату ықтималдығы негізінде пайдаланушы арнасының рейтингі жасалады.

Мен 2014 жыл туралы айта алмаймын, бірақ 2016 және 2019 жылдары деректерді талдау қабілеттерінен басқа, үлкен деректермен жұмыс істеу дағдылары да қажет болды. Менің ойымша, машиналық оқыту мен үлкен деректерді өңдеу проблемаларының үйлесімі мені осы жарыстарға тартты және осы салалардағы тәжірибем жеңіске жетуге көмектесті.

mlbootcamp

2019 жылы жарыс алаңында ұйымдастырылды https://mlbootcamp.ru.

Сайыс 7 ақпанда онлайн режимінде басталып, 3 тапсырмадан тұрды. Кез келген адам сайтқа тіркеле алады, жүктей алады базалық сызба және көлігіңізді бірнеше сағатқа жүктеңіз. 15 наурызда онлайн кезеңнің соңында әрбір шоу-секіру оқиғасының үздік 15-і Mail.ru кеңсесіне 30 наурыз бен 1 сәуір аралығында өткен офлайн кезеңіне шақырылды.

Мақсаты

Бастапқы деректер пайдаланушы идентификаторларын (userId) және пост идентификаторларын (objectId) қамтамасыз етеді. Егер пайдаланушыға жазба көрсетілсе, деректерде userId, objectId, осы жазбаға пайдаланушы реакциялары (кері байланыс) және әртүрлі мүмкіндіктер жиынтығы немесе суреттер мен мәтіндерге сілтемелер бар жол бар.

Қолданушының ID объект идентификаторы иеленуші идентификаторы Кері байланыс суреттер
3555 22 5677 [ұнады, басылды] [хэш1]
12842 55 32144 [ұнамаған] [хэш2, хэш3]
13145 35 5677 [басылды, ортақ] [хэш2]

Сынақ деректер жинағында ұқсас құрылым бар, бірақ кері байланыс өрісі жоқ. Тапсырма кері байланыс өрісінде «ұнаған» реакцияның болуын болжау.
Жіберу файлы келесі құрылымға ие:

Қолданушының ID SortedList[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

Көрсеткіш пайдаланушылар үшін орташа ROC AUC болып табылады.

Деректердің толығырақ сипаттамасын мына жерден табуға болады кеңесінің сайты. Сондай-ақ ол жерден деректерді, соның ішінде сынақтар мен суреттерді жүктеп алуға болады.

Онлайн кезең

Онлайн кезеңде тапсырма 3 бөлікке бөлінді

Офлайн кезең

Офлайн кезеңде деректер барлық мүмкіндіктерді қамтыды, ал мәтіндер мен кескіндер сирек болды. Деректер жинағында 1,5 есе көп жолдар болды, олардың ішінде көп болды.

Мәселені шешу

Мен жұмыста түйіндеме жасайтындықтан, мен осы байқауға саяхатымды «Сурет» тапсырмасынан бастадым. Берілген деректер userId, objectId, ownerId (жазба жарияланған топ), жазбаны жасауға және көрсетуге арналған уақыт белгілері және, әрине, осы жазбаның суреті болды.
Уақыт белгілеріне негізделген бірнеше мүмкіндіктерді жасағаннан кейін, келесі идея imagenet желісінде алдын ала дайындалған нейронның соңғы қабатын алып, осы ендірулерді күшейтуге жіберу болды.

SNA Hackathon 2019

Нәтижелері әсерлі болмады. Imagenet нейронының кірістірулері маңызды емес, мен өзімнің автокодерімді жасауым керек деп ойладым.

SNA Hackathon 2019

Бұл көп уақытты алды және нәтиже жақсармады.

Ерекшелік генерациясы

Суреттермен жұмыс істеу көп уақытты қажет етеді, сондықтан мен қарапайым нәрсе жасауды шештім.
Бірден көріп отырғаныңыздай, деректер жинағында бірнеше категориялық мүмкіндіктер бар және тым көп алаңдамау үшін мен жай ғана catboost алдым. Шешім тамаша болды, мен ешқандай параметрлерсіз бірден көшбасшылар тақтасының бірінші жолына шықтым.

Деректер өте көп және олар паркет форматында орналастырылған, сондықтан мен екі рет ойланбастан, скаланы алып, бәрін ұшқынмен жаза бастадым.

Кескінді ендіруге қарағанда көбірек өсуді қамтамасыз ететін қарапайым мүмкіндіктер:

  • objectId, userId және ownerId деректерде қанша рет пайда болды (танымалдыққа сәйкес келуі керек);
  • userId иеленуші идентификаторынан қанша хабарлама көрді (пайдаланушының топқа қызығушылығымен сәйкес келуі керек);
  • иеленуші идентификаторынан қанша бірегей пайдаланушы идентификаторлары жазбаларды қарады (топ аудиториясының өлшемін көрсетеді).

Уақыт белгілерінен пайдаланушы арнаны қараған тәулік уақытын алуға болады (таңертең/түс/кеш/түн). Осы санаттарды біріктіру арқылы мүмкіндіктерді жасауды жалғастыра аласыз:

  • userId кешке қанша рет кірді;
  • бұл пост қай уақытта жиі көрсетіледі (objectId) және т.б.

Мұның бәрі бірте-бірте көрсеткіштерді жақсартты. Бірақ жаттығу деректер жинағының өлшемі шамамен 20 миллион жазбаны құрайды, сондықтан мүмкіндіктерді қосу жаттығуды айтарлықтай баяулатады.

Мен деректерді пайдалану тәсілін қайта қарастырдым. Деректер уақытқа тәуелді болса да, мен «болашақта» ешқандай анық ақпараттың ағып кетуін көрмедім, дегенмен, мен оны келесідей бөлдім:

SNA Hackathon 2019

Бізге берілген тренинг жинағы (ақпан және наурыздың 2 аптасы) 2 бөлікке бөлінді.
Модель соңғы N күндегі деректер бойынша оқытылды. Жоғарыда сипатталған біріктірулер барлық деректерге, соның ішінде сынаққа негізделген. Сонымен қатар, мақсатты айнымалының әртүрлі кодтауларын құруға болатын деректер пайда болды. Ең қарапайым тәсіл - жаңа мүмкіндіктерді жасап жатқан кодты қайта пайдалану және оған оқытылмайтын деректерді беру және мақсат = 1.

Осылайша, біз ұқсас функцияларды алдық:

  • UserId топ иесінің идентификаторындағы жазбаны қанша рет көрді;
  • userId тобының иесінің идентификаторындағы жазбаны қанша рет ұнатты;
  • UserId иеленуші идентификаторынан ұнаған жазбалардың пайызы.

Яғни, бұл шықты орташа мақсатты кодтау категориялық белгілердің әртүрлі комбинациялары үшін деректер жиынының бөлігінде. Негізінде, catboost сонымен қатар мақсатты кодтауды құрастырады және бұл тұрғыдан ешқандай пайда жоқ, бірақ, мысалы, осы топтағы жазбаларды ұнатқан бірегей пайдаланушылардың санын санауға болады. Сонымен қатар, негізгі мақсатқа қол жеткізілді - менің деректер жиынтығым бірнеше рет қысқартылды және мүмкіндіктерді генерациялауды жалғастыруға болады.

catboost тек ұнаған реакция негізінде кодтауды құра алатынымен, кері байланыстың басқа реакциялары бар: қайта бөлісілген, ұнамаған, ұнамаған, басылған, еленбеген, кодтауды қолмен жасауға болады. Мен жиынтықтардың барлық түрлерін қайта есептедім және деректер жиынын толтырмау үшін маңыздылығы төмен мүмкіндіктерді алып тастадым.

Ол кезде мен үлкен айырмашылықпен бірінші орында болдым. Түсініксіз қалдыратын жалғыз нәрсе - кескінді ендіруде өсу байқалмады. Идея барлығын catboost-қа беру үшін келді. Біз Kmeans кескіндерін кластерлейміз және imageCat жаңа категориялық мүмкіндігін аламыз.

Мұнда KMeans-тен алынған кластерлерді қолмен сүзу және біріктіруден кейінгі кейбір сыныптар берілген.

SNA Hackathon 2019

imageCat негізінде біз жасаймыз:

  • Жаңа категориялық ерекшеліктер:
    • Қай imageCat пайдаланушы идентификаторы арқылы жиі қаралды;
    • Қай imageCat жиі иеленуші идентификаторын көрсетеді;
    • Қай imageCat пайдаланушы идентификаторына жиі ұнады;
  • Әртүрлі есептегіштер:
    • Пайдаланушы идентификаторына қанша бірегей imageCat қарады;
    • Жоғарыда сипатталғандай 15-ке жуық ұқсас мүмкіндіктер және мақсатты кодтау.

Мәтіндер

Бейнелеу байқауының нәтижелері маған ұнады және мен өзімді мәтіндерде сынап көруді шештім. Мен бұрын мәтіндермен көп жұмыс істемедім және ақымақтықпен, tf-idf және svd-де күнді өлтірдім. Содан кейін мен doc2vec көмегімен базалық сызықты көрдім, ол маған қажет нәрсені жасайды. doc2vec параметрлерін сәл реттей отырып, мен мәтінді ендіруді алдым.

Содан кейін мен жай ғана кескіндердің кодын қайта пайдаландым, онда кескін ендірілгендерді мәтін ендірілгендермен ауыстырдым. Нәтижесінде мәтін сайысында 2 орынға ие болдым.

Ынтымақтастық жүйесі

Мен әлі таяқпен «соқпаған» бір жарыс қалды, және көшбасшылар тақтасындағы AUC бойынша бағаланатын болсақ, осы жарыстың нәтижелері офлайн кезеңге ең көп әсер етуі керек еді.
Мен бастапқы деректердегі барлық мүмкіндіктерді алдым, категориялықтарды таңдадым және кескіндердің өздеріне негізделген мүмкіндіктерді қоспағанда, кескіндер сияқты жиынтықтарды есептедім. Мұны catboost-қа қою мені 2-ші орынға жеткізді.

Catboost оңтайландырудың алғашқы қадамдары

Бір бірінші және екі екінші орын мені қуантты, бірақ мен ерекше ештеңе жасамағанымды түсіндім, яғни мен позицияларды жоғалтуды күтуім мүмкін.

Байқаудың міндеті - пайдаланушының ішіндегі жазбаларды ранжирлеу және осы уақыт ішінде мен жіктеу мәселесін шештім, яғни қате метриканы оңтайландырдым.

Сізге қарапайым мысал келтірейін:

Қолданушының ID объект идентификаторы болжау негізгі шындық
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

Кішкене қайта құру жасайық

Қолданушының ID объект идентификаторы болжау негізгі шындық
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

Біз келесі нәтижелерді аламыз:

Модель AUC Пайдаланушы 1 AUC Пайдаланушы 2 AUC AUC білдіреді
1 нұсқасы 0,8 1,0 0,0 0,5
2 нұсқасы 0,7 0,75 1,0 0,875

Көріп отырғаныңыздай, жалпы AUC метрикасын жақсарту пайдаланушыдағы орташа AUC көрсеткішін жақсартуды білдірмейді.

Catboost рейтинг көрсеткіштерін оңтайландыруды біледі қораптан. Мен рейтинг көрсеткіштері туралы оқыдым, сәттілік тарихы catboost пайдаланғанда және түнде жаттығу үшін YetiRankPairwise орнатыңыз. Нәтиже әсерлі болмады. Тәжірибесіз болдым деп шешіп, қате функциясын QueryRMSE-ге өзгерттім, ол catboost құжаттамасы бойынша тезірек біріктіріледі. Соңында мен классификацияға дайындық кезіндегідей нәтиже алдым, бірақ бұл екі модельдің ансамбльдері жақсы өсім берді, бұл мені үш байқауда да бірінші орынға әкелді.

«Бірлескен жүйелер» байқауының онлайн кезеңінің жабылуына 5 минут қалғанда Сергей Шалнов мені екінші орынға жылжытты. Әрі қарай бірге жүріп өттік.

Офлайн кезеңіне дайындық

Бізге RTX 2080 TI видеокартасымен онлайн кезеңде жеңіске кепілдік берілді, бірақ 300 000 рубль көлеміндегі бас жүлде және, ең алдымен, соңғы бірінші орын бізді осы 2 апта бойы жұмыс істеуге мәжбүр етті.

Белгілі болғандай, Сергей catboost-ты да пайдаланған. Біз идеялармен және ерекшеліктермен алмастық, мен бұл туралы білдім Анна Вероника Дорогуштың баяндамасы онда менің көптеген сұрақтарыма, тіпті сол уақытқа дейін әлі білмеген сұрақтарыма жауаптар болды.

Есепті қарау мені барлық параметрлерді әдепкі мәнге қайтару керек және параметрлерді өте мұқият және мүмкіндіктер жиынтығын бекіткеннен кейін ғана жасау керек деген ойға әкелді. Енді бір жаттығу шамамен 15 сағатқа созылды, бірақ бір модель рейтингі бар ансамбльде алған жылдамдықтан жоғары жылдамдыққа ие болды.

Ерекшелік генерациясы

Бірлескен жүйелер сайысында көптеген мүмкіндіктер модель үшін маңызды деп бағаланады. Мысалы, auditweights_spark_svd - ең маңызды белгі, бірақ оның нені білдіретіні туралы мәлімет жоқ. Маңызды белгілерге негізделген әртүрлі агрегаттарды санау орынды деп ойладым. Мысалы, пайдаланушы, топ, нысан бойынша орташа auditweights_spark_svd. Ешқандай жаттығу орындалмаған және мақсатты = 1, яғни орташа мәліметтерді пайдаланып есептелуі мүмкін auditweights_spark_svd пайдаланушыға ұнаған нысандар бойынша. Бұдан басқа маңызды белгілер auditweights_spark_svd, бірнеше болды. Мұнда олардың кейбіреулері бар:

  • auditweightsCtrGender
  • аудит салмақтарыCtrЖоғары
  • userOwnerCounterCreateLikes

Мысалы, орташа auditweightsCtrGender userId сәйкес бұл орташа мән сияқты маңызды мүмкіндік болып шықты userOwnerCounterCreateLikes пайдаланушы идентификаторы + иесінің идентификаторы бойынша. Бұл сізге өрістердің мағынасын түсіну керек деп ойлауға мәжбүр етуі керек.

Сондай-ақ маңызды ерекшеліктер болды auditweightsLikesCount и auditweightsShowsCount. Бірін-бірі бөле отырып, одан да маңызды ерекшелік алынды.

Деректер ағып кетеді

Бәсекелестік пен өндірісті модельдеу өте әртүрлі міндеттер. Деректерді дайындау кезінде тестте мақсатты айнымалы туралы кейбір тривиальды емес ақпаратты жеткізбеу және барлық мәліметтерді ескеру өте қиын. Егер біз өндіріс шешімін жасайтын болсақ, үлгіні оқыту кезінде деректердің ағып кетуін пайдаланбауға тырысамыз. Бірақ егер біз бәсекелестікте жеңгіміз келсе, онда деректердің ағып кетуі - ең жақсы мүмкіндіктер.

Деректерді зерттей отырып, сіз оны objectId мәндеріне сәйкес көре аласыз auditweightsLikesCount и auditweightsShowsCount өзгерту, яғни бұл мүмкіндіктердің максималды мәндерінің қатынасы кейінгі түрлендіруді көрсету кезіндегі қатынасқа қарағанда әлдеқайда жақсы көрсетеді.

Біз тапқан бірінші ағып кету auditweightsLikesCountMax/auditweightsShowsCountMax.
Бірақ деректерді мұқият қарастырсақ ше? Көрсетілім күні бойынша сұрыптап, алайық:

объект идентификаторы Қолданушының ID auditweightsShowsCount auditweightsLikesCount мақсат (ұнады)
1 1 12 3 Бәлкім жоқ
1 2 15 3 мүмкін Ия
1 3 16 4

Мен мұндай мысалды бірінші тапқан кезде таң қалдым және менің болжамым орындалмай қалды. Бірақ объект ішіндегі осы сипаттамалардың максималды мәндері өскенін ескере отырып, біз жалқау емеспіз және табуға шешім қабылдадық. аудиторлық салмақтарШоуларСанауКелесі и auditweightsLikesCountNext, яғни келесі уақыттағы мәндер. Мүмкіндік қосу арқылы
(аудитсалмақтарыШоуларСанауыКелесі-аудитсалмақтарыШоуларСанауы)/(аудитсалмақтарыҰнатуларСанауы-аудитсалмақтарыҰнатуларСанауыКелесі) біз жылдам секірдік.
Ұқсас ағып кетулерді келесі мәндерді табу арқылы пайдалануға болады userOwnerCounterCreateLikes userId+ownerId ішінде және, мысалы, auditweightsCtrGender objectId+userGender ішінде. Біз ағып кетуі бар 6 ұқсас өрісті таптық және олардан мүмкіндігінше көбірек ақпарат алдық.

Осы уақытқа дейін біз бірлескен мүмкіндіктерден мүмкіндігінше көп ақпаратты сығып алдық, бірақ сурет пен мәтін байқауларына оралмадық. Менде тексеру үшін тамаша идея болды: суреттерге немесе мәтіндерге тікелей негізделген мүмкіндіктер сәйкес жарыстарда қаншалықты береді?

Суреттер мен мәтіндік жарыстарда ешқандай ағып кетулер болған жоқ, бірақ сол уақытта мен әдепкі catboost параметрлерін қайтардым, кодты тазалап, бірнеше мүмкіндіктерді қостым. Барлығы болды:

шешім жақын арада
Суреттермен максималды 0.6411
Максималды кескіндер жоқ 0.6297
Екінші орын нәтижесі 0.6295

шешім жақын арада
Мәтіндермен максимум 0.666
Мәтінсіз максимум 0.660
Екінші орын нәтижесі 0.656

шешім жақын арада
Ынтымақтастықта максимум 0.745
Екінші орын нәтижесі 0.723

Мәтіндер мен суреттерден көп нәрсені сығып алу екіталай екені белгілі болды және бірнеше қызықты идеяларды қолданып көргеннен кейін біз олармен жұмыс істеуді тоқтаттық.

Бірлескен жүйелердегі мүмкіндіктердің одан әрі генерациясы өсім бермеді және біз рейтингті бастадық. Онлайн кезеңде классификация мен рейтинг ансамблі маған шамалы өсім берді, өйткені мен классификацияны аз орындағандықтан болды. Қате функцияларының ешқайсысы, соның ішінде YetiRanlPairwise, LogLoss жасаған нәтижеге жақын жерде жасалған жоқ (0,745 қарсы 0,725). QueryCrossEntropy үшін әлі де үміт болды, оны іске қосу мүмкін болмады.

Офлайн кезең

Офлайн кезеңде деректер құрылымы өзгеріссіз қалды, бірақ шамалы өзгерістер болды:

  • userId, objectId, ownerId идентификаторлары қайта таңдалды;
  • бірнеше белгілер жойылды және бірнеше атаулары өзгертілді;
  • деректер шамамен 1,5 есе өсті.

Көрсетілген қиындықтардан басқа, бір үлкен плюс болды: командаға RTX 2080TI бар үлкен сервер бөлінді. Маған ұзақ уақыт бойы htop ұнады.
SNA Hackathon 2019

Бір ғана идея болды - бар нәрсені жай ғана жаңғырту. Серверде ортаны орнатуға бірнеше сағат жұмсағаннан кейін біз нәтижелердің қайталанатынына бірте-бірте тексере бастадық. Бізге тап болған басты мәселе – деректер көлемінің ұлғаюы. Біз жүктемені аздап азайтуды және catboost параметрін ctr_complexity=1 орнатуды шештік. Бұл жылдамдықты сәл төмендетеді, бірақ менің моделім жұмыс істей бастады, нәтиже жақсы болды - 0,733. Сергей, мен сияқты, деректерді 2 бөлікке бөлмеді және барлық деректерге жаттықты, бұл онлайн кезеңде ең жақсы нәтиже бергенімен, офлайн кезеңінде көптеген қиындықтар болды. Егер біз жасаған барлық мүмкіндіктерді алып, оларды catboost-қа қосуға тырыссақ, онда онлайн кезеңде ештеңе жұмыс істемейді. Сергей типті оңтайландыруды жасады, мысалы, float64 түрлерін float32 түріне түрлендіру. Бұл мақалада, Жадты оңтайландыру туралы ақпаратты пандалардан таба аласыз. Нәтижесінде Сергей барлық деректерді пайдалана отырып, орталық процессорда жаттығып, шамамен 0,735 алды.

Жеңіске жету үшін бұл нәтижелер жеткілікті болды, бірақ біз шынайы жылдамдығымызды жасырып, басқа командалардың да солай етпейтініне сенімді бола алмадық.

Соңына дейін күрес

Catboost баптау

Біздің шешіміміз толығымен қайта шығарылды, біз мәтіндік деректер мен кескіндердің мүмкіндіктерін қостық, сондықтан catboost параметрлерін реттеу ғана қалды. Сергей аздаған итерациялар санымен процессорда жаттықты, мен ctr_complexity=1 бар бірінде жаттықтым. Бір күн қалды, егер сіз жай ғана итерацияларды қоссаңыз немесе ctr_complexity деңгейін арттырсаңыз, таңертең одан да жақсы жылдамдыққа қол жеткізіп, күні бойы жүруге болады.

Офлайн кезеңде сайттағы ең жақсы шешімді таңдау арқылы жылдамдықтарды оңай жасыруға болады. Біз хабарландырулар жабылғанға дейін соңғы минуттарда көшбасшылар тақтасында күрт өзгерістер болады деп күттік және тоқтамауға шешім қабылдадық.

Аннаның бейнесінен мен модельдің сапасын жақсарту үшін келесі параметрлерді таңдаған дұрыс екенін білдім:

  • оқу_бағасы — Әдепкі мән деректер жиынының өлшемі негізінде есептеледі. Оқыту_бағдарламасын арттыру қайталанулар санын көбейтуді талап етеді.
  • l2_leaf_reg — Регуляризация коэффициенті, әдепкі мән 3, 2-ден 30-ға дейін таңдаған дұрыс. Мәнді азайту артық сәйкестіктің артуына әкеледі.
  • қаптау_температурасы — үлгідегі объектілердің салмағына рандомизацияны қосады. Әдепкі мән 1 болып табылады, мұнда салмақтар экспоненциалды үлестірімнен алынады. Мәннің төмендеуі артық сәйкестіктің артуына әкеледі.
  • кездейсоқ_күш — Белгілі бір итерациядағы бөлулерді таңдауға әсер етеді. Кездейсоқ_күші неғұрлым жоғары болса, маңыздылығы төмен бөлудің таңдалу мүмкіндігі соғұрлым жоғары болады. Әрбір келесі итерацияда кездейсоқтық азаяды. Мәннің төмендеуі артық сәйкестіктің артуына әкеледі.

Басқа параметрлер соңғы нәтижеге әлдеқайда аз әсер етеді, сондықтан мен оларды таңдауға тырыспадым. ctr_complexity=1 бар GPU деректер жинағындағы жаттығудың бір итерациясы 20 минутқа созылды және қысқартылған деректер жиынындағы таңдалған параметрлер толық деректер жиынындағы оңтайлы параметрлерден сәл өзгеше болды. Соңында мен деректердің 30% -ында шамамен 10 итерация жасадым, содан кейін барлық деректерде тағы 10 итерация жасадым. Мынадай нәрсе шықты:

  • оқу_бағасы Мен әдепкіден 40%-ға өстім;
  • l2_leaf_reg оны сол күйінде қалдырды;
  • қаптау_температурасы и кездейсоқ_күш 0,8 дейін төмендеді.

Модель әдепкі параметрлермен оқытылмаған деп қорытынды жасауға болады.

Мен көшбасшылар тақтасындағы нәтижені көргенде қатты таң қалдым:

Модель 1 үлгісі 2 үлгісі 3 үлгісі ансамбль
Баптаусыз 0.7403 0.7404 0.7404 0.7407
Баптаумен 0.7406 0.7405 0.7406 0.7408

Мен өзім үшін қорытынды жасадым, егер модельді жылдам қолдану қажет болмаса, онда оңтайландырылмаған параметрлерді пайдалана отырып, параметрлерді таңдауды бірнеше модельдер ансамблімен ауыстырған дұрыс.

Сергей GPU-да іске қосу үшін деректер жинағының өлшемін оңтайландырды. Ең қарапайым нұсқа - деректердің бір бөлігін кесіп тастау, бірақ мұны бірнеше жолмен жасауға болады:

  • деректер жинағы жадқа сыйдыра бастағанша ең ескі деректерді (ақпанның басы) біртіндеп алып тастаңыз;
  • маңыздылығы аз мүмкіндіктерді жою;
  • бір ғана жазбасы бар пайдаланушы идентификаторларын жою;
  • тек сынақтағы пайдаланушы идентификаторларын қалдырыңыз.

Және, сайып келгенде, барлық нұсқалардан ансамбль жасаңыз.

Соңғы ансамбль

Өткен күннің кешіне қарай біз 0,742 нәтиже берген модельдер ансамблін дайындадық. Бір түнде мен өз моделімді ctr_complexity=2 арқылы іске қостым және 30 минуттың орнына ол 5 сағат жаттықты. Таңертеңгі сағат 4-те ғана есептеліп, мен қоғамдық лидерлер тақтасында 0,7433 берген соңғы ансамбльді жасадым.

Мәселені шешудің әртүрлі тәсілдеріне байланысты біздің болжамдарымыз қатты сәйкес келмеді, бұл ансамбльде жақсы өсім берді. Жақсы ансамбль алу үшін, болжауды болжау (prediction_type='RawFormulaVal') өңделмеген модельді қолданып, scale_pos_weight=neg_count/pos_count орнатқан дұрыс.

SNA Hackathon 2019

Веб-сайтта сіз көре аласыз жеке көшбасшылар тақтасындағы соңғы нәтижелер.

Басқа шешімдер

Көптеген командалар кеңес беру жүйесінің алгоритмдерінің ережелерін ұстанды. Мен бұл саланың маманы болмағандықтан, оларды бағалай алмаймын, бірақ 2 қызықты шешім есімде.

  • Николай Анохин шешімі. Николай Mail.ru қызметкері бола отырып, жүлделерге өтініш бермеді, сондықтан оның мақсаты максималды жылдамдыққа жету емес, оңай масштабталатын шешім алу болды.
  • Қазылар алқасының жүлдесін жеңіп алған топтың шешімі негізінде бұл мақала facebook-тен, қолмен жұмыссыз кескінді өте жақсы кластерлеуге мүмкіндік берді.

қорытынды

Менің жадымда ең көп сақталатын нәрсе:

  • Егер деректерде категориялық мүмкіндіктер болса және мақсатты кодтауды қалай дұрыс жасау керектігін білсеңіз, catboost қолданбасын қолданып көргеніңіз дұрыс.
  • Егер сіз конкурсқа қатысып жатсаңыз, үйрену_ставкасы мен итерациядан басқа параметрлерді таңдауға уақытты жоғалтпауыңыз керек. Жылдамырақ шешім - бірнеше модельдерден тұратын ансамбль жасау.
  • Күшейтуді GPU арқылы үйренуге болады. Catboost графикалық процессорда өте жылдам үйрене алады, бірақ ол көп жадты жейді.
  • Идеяларды әзірлеу және тестілеу кезінде шағын rsm~=0.2 (тек CPU) және ctr_complexity=1 орнатқан дұрыс.
  • Басқа командалардан айырмашылығы, біздің модельдер ансамблі үлкен өсім берді. Біз тек пікір алмасып, түрлі тілде жаздық. Деректерді бөлуге бізде басқаша көзқарас болды және менің ойымша, әрқайсысында өз қателері болды.
  • Неліктен рейтингті оңтайландыру классификацияны оңтайландырудан нашар орындағаны түсініксіз.
  • Мен мәтіндермен жұмыс істеу тәжірибесі мен кеңес беру жүйелерінің қалай жасалатынын түсіндім.

SNA Hackathon 2019

Ұйымдастырушыларға эмоциялар, білім және алған сыйлықтары үшін рахмет.

Ақпарат көзі: www.habr.com

пікір қалдыру