SNA Հեքըթոն 2019

2019 թվականի փետրվար-մարտ ամիսներին անցկացվել է սոցիալական ցանցի հոսքի վարկանիշավորման մրցույթ SNA Հեքըթոն 2019, որում մեր թիմը գրավեց առաջին տեղը։ Հոդվածում ես կխոսեմ մրցույթի կազմակերպման, մեր փորձած մեթոդների և մեծ տվյալների վրա ուսուցման catboost կարգավորումների մասին։

SNA Հեքըթոն 2019

SNA Հեքըթոն

Այս անվան տակ հաքաթոն անցկացվում է արդեն երրորդ անգամ։ Այն կազմակերպում է ok.ru սոցիալական ցանցը, համապատասխանաբար առաջադրանքն ու տվյալները անմիջականորեն կապված են այս սոցիալական ցանցի հետ։
SNA (սոցիալական ցանցի վերլուծություն) այս դեպքում ավելի ճիշտ ընկալվում է ոչ թե որպես սոցիալական գրաֆիկի վերլուծություն, այլ ավելի շուտ որպես սոցիալական ցանցի վերլուծություն։

  • 2014 թվականին խնդիր էր դրվել կանխատեսել, թե ինչքան հավանումներ կհավաքի գրառմանը։
  • 2016 թվականին - VVZ առաջադրանքը (գուցե ծանոթ եք), ավելի մոտ սոցիալական գրաֆիկի վերլուծությանը:
  • 2019 թվականին օգտատիրոջ հոսքի դասակարգումը՝ հիմնվելով այն հավանականության վրա, որ օգտատերը կհավանի գրառումը:

2014-ի մասին չեմ կարող ասել, բայց 2016-ին և 2019-ին, բացի տվյալների վերլուծության կարողություններից, պահանջվում էին նաև մեծ տվյալների հետ աշխատելու հմտություններ։ Կարծում եմ, որ մեքենայական ուսուցման և մեծ տվյալների մշակման խնդիրների համակցությունն էր, որ գրավեց ինձ դեպի այս մրցույթները, և այս ոլորտներում իմ փորձառությունն օգնեց ինձ հաղթել:

mlbootcamp

2019 թվականին մրցույթը կազմակերպվել է հարթակում https://mlbootcamp.ru.

Մրցույթը առցանց սկսվել է փետրվարի 7-ին և բաղկացած է եղել 3 առաջադրանքից։ Ցանկացած մարդ կարող էր գրանցվել կայքում, ներբեռնել բազային և բեռնեք ձեր մեքենան մի քանի ժամով: Մարտի 15-ին առցանց փուլի ավարտին յուրաքանչյուր շոու-ջամփինգ միջոցառման լավագույն 15-ը հրավիրվեցին Mail.ru-ի գրասենյակ՝ օֆլայն փուլի համար, որը տեղի ունեցավ մարտի 30-ից ապրիլի 1-ը։

Առաջադրանք

Աղբյուրի տվյալները տրամադրում են օգտվողի ID-ներ (userId) և հաղորդագրությունների ID-ներ (objectId): Եթե ​​օգտատիրոջը ցուցադրվել է գրառում, ապա տվյալները պարունակում են տող, որը պարունակում է userId, objectId, օգտատերերի արձագանքները այս գրառմանը (հետադարձ կապ) և մի շարք տարբեր հատկանիշներ կամ հղումներ դեպի նկարներ և տեքստեր:

օգտագործողի այ - Դի օբյեկտ ID սեփականատիրոջ ID հետադարձ կապ պատկերներ
3555 22 5677 [հավանել, սեղմել] [hash1]
12842 55 32144 [չհավանում] [hash2,hash3]
13145 35 5677 [սեղմել, կիսվել] [hash2]

Փորձարկման տվյալների հավաքածուն պարունակում է նմանատիպ կառուցվածք, սակայն հետադարձ կապի դաշտը բացակայում է: Խնդիրն է կանխատեսել «հավանած» ռեակցիայի առկայությունը հետադարձ կապի դաշտում:
Ներկայացման ֆայլն ունի հետևյալ կառուցվածքը.

օգտագործողի այ - Դի Տեսակավորված ցուցակ[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 Հեքըթոն 2019

Արդյունքները տպավորիչ չէին։ Imagenet-ի նեյրոնից ներկառուցումները անտեղի են, ես մտածեցի, որ ես պետք է ստեղծեմ իմ ինքնակոդավորիչը:

SNA Հեքըթոն 2019

Շատ ժամանակ պահանջվեց, և արդյունքը չբարելավվեց։

Հատկանիշների սերունդ

Պատկերների հետ աշխատելը շատ ժամանակ է պահանջում, ուստի որոշեցի ավելի պարզ բան անել:
Ինչպես անմիջապես տեսնում եք, տվյալների բազայում կան մի քանի դասակարգային առանձնահատկություններ, և որպեսզի շատ չանհանգստացնեմ, ես պարզապես վերցրեցի catboost: Լուծումը գերազանց էր, առանց որևէ կարգավորումների ես անմիջապես հասա առաջատարների առաջին տող:

Տվյալները բավականին շատ են, և դրանք շարված են մանրահատակի ձևաչափով, այնպես որ, առանց երկու անգամ մտածելու, ես վերցրեցի սկալան և սկսեցի ամեն ինչ գրել կայծով։

Ամենապարզ առանձնահատկությունները, որոնք ավելի շատ աճ են տվել, քան պատկերների ներդրումը.

  • քանի անգամ են տվյալների մեջ հայտնվել objectId-ը, userId-ը և ownerId-ը (պետք է համապատասխանի հանրաճանաչությանը);
  • քանի գրառում է տեսել userId-ը ownerId-ից (պետք է համընկնի խմբում օգտվողի հետաքրքրության հետ);
  • քանի եզակի userIds դիտել են հաղորդագրություններ ownerId-ից (արտացոլում է խմբի լսարանի չափը):

Ժամային դրոշմանիշներից հնարավոր եղավ ստանալ օրվա ժամը, երբ օգտատերը դիտել է լրահոսը (առավոտ/կեսօր/երեկո/գիշեր): Համատեղելով այս կատեգորիաները՝ կարող եք շարունակել ստեղծել առանձնահատկություններ.

  • քանի անգամ է userId-ը մուտք գործել երեկոյան;
  • որ ժամին է այս գրառումն առավել հաճախ ցուցադրվում (objectId) և այլն:

Այս ամենն աստիճանաբար բարելավեց չափումները։ Սակայն ուսուցման տվյալների շտեմարանի չափը կազմում է մոտ 20 միլիոն գրառում, ուստի գործառույթների ավելացումը զգալիորեն դանդաղեցրեց ուսուցումը:

Ես վերանայել եմ տվյալների օգտագործման իմ մոտեցումը: Թեև տվյալները ժամանակից կախված են, ես «ապագայում» որևէ ակնհայտ տեղեկատվության արտահոսք չեմ տեսել, այնուամենայնիվ, ամեն դեպքում, ես այն բաժանեցի այսպես.

SNA Հեքըթոն 2019

Մեզ տրամադրված թրեյնինգային հավաքածուն (փետրվար և մարտի 2 շաբաթ) բաժանված էր 2 մասի։
Մոդելը վերապատրաստվել է վերջին N օրերի տվյալների վրա: Վերը նկարագրված ագրեգացիաները կառուցվել են բոլոր տվյալների վրա, ներառյալ թեստը: Միաժամանակ հայտնվել են տվյալներ, որոնց վրա հնարավոր է կառուցել թիրախային փոփոխականի տարբեր կոդավորումներ։ Ամենապարզ մոտեցումն այն է, որ կոդը նորից օգտագործվի, որն արդեն իսկ ստեղծում է նոր առանձնահատկություններ, և պարզապես կերակրել այն տվյալների վրա, որոնց վրա այն չի վերապատրաստվի և թիրախավորվի = 1:

Այսպիսով, մենք ստացանք նմանատիպ հատկանիշներ.

  • Քանի անգամ է userId-ը տեսել գրառում խմբի ownerId-ում;
  • Քանի անգամ userId-ը հավանել է գրառումը խմբի ownerId-ում;
  • Գրառումների տոկոսը, որոնց userId-ը հավանել է ownerId-ից:

Այսինքն՝ պարզվեց միջին թիրախային կոդավորում տվյալների շտեմարանի մի մասի վրա՝ դասակարգային հատկանիշների տարբեր համակցությունների համար: Սկզբունքորեն, catboost-ը նաև կառուցում է թիրախային կոդավորում և այս տեսանկյունից ոչ մի օգուտ չկա, բայց, օրինակ, հնարավոր է դարձել հաշվել այս խմբի գրառումները հավանած եզակի օգտատերերի թիվը։ Միևնույն ժամանակ, հիմնական նպատակը ձեռք բերվեց. իմ տվյալների բազան մի քանի անգամ կրճատվեց, և հնարավոր եղավ շարունակել գեներացնել հատկանիշներ:

Թեև catboost-ը կարող է կոդավորում ստեղծել միայն հավանած ռեակցիայի հիման վրա, հետադարձ կապն ունի այլ արձագանքներ՝ վերատարածված, չհավանված, չհավանված, սեղմված, անտեսված, կոդավորումներ, որոնց համար կարելի է ձեռքով անել: Ես վերահաշվարկեցի բոլոր տեսակի ագրեգատները և վերացրեցի ցածր կարևորության հատկանիշները, որպեսզի չուռճացնեմ տվյալների բազան:

Այդ ժամանակ ես մեծ տարբերությամբ առաջին տեղում էի։ Միակ բանը, որ շփոթեցնող էր, այն էր, որ պատկերների ներկառուցումները գրեթե աճ չէին ցույց տալիս: Գաղափարն առաջացավ ամեն ինչ տալ catboost-ին: Մենք խմբավորում ենք Kmeans պատկերները և ստանում ենք նոր դասակարգային հատկանիշ՝ imageCat:

Ահա մի քանի դասեր ձեռքով զտելուց և կլաստերների միաձուլումից հետո, որոնք ստացվել են KMeans-ից:

SNA Հեքըթոն 2019

imageCat-ի հիման վրա մենք ստեղծում ենք.

  • Նոր կատեգորիայի հատկանիշներ.
    • Որ imageCat-ն է առավել հաճախ դիտվել userId-ի կողմից;
    • Ո՞ր imageCat-ն է ամենից հաճախ ցույց տալիս սեփականատերի ID-ն;
    • Ո՞ր imageCat-ն է առավել հաճախ հավանել userId-ը;
  • Տարբեր հաշվիչներ.
    • Քանի՞ եզակի imageCat նայեց userId-ին;
    • Մոտ 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- ն User1 AUC User2 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 շաբաթը։

Ինչպես պարզվեց, Սերգեյը նաև կատբուոստ է օգտագործել։ Մենք մտքեր ու առանձնահատկություններ փոխանակեցինք, և ես իմացա դրա մասին ռեպորտաժ՝ Աննա Վերոնիկա Դորոգուշի որը պարունակում էր իմ շատ հարցերի պատասխաններ, և նույնիսկ նրանց, որոնք ես դեռ չէի ունեցել այդ ժամանակ:

Զեկույցը դիտելը ինձ հանգեցրեց այն մտքին, որ մենք պետք է բոլոր պարամետրերը վերադարձնենք լռելյայն արժեքին և կատարենք կարգավորումները շատ ուշադիր և միայն մի շարք գործառույթներ ամրագրելուց հետո: Այժմ մեկ պարապմունքը տևում է մոտ 15 ժամ, բայց մեկ մոդելի հաջողվել է ավելի լավ արագություն ձեռք բերել, քան վարկանիշով անսամբլում ձեռք բերվածը։

Հատկանիշների սերունդ

Համատեղ համակարգերի մրցույթում մեծ թվով առանձնահատկություններ գնահատվում են որպես մոդելի համար կարևոր: Օրինակ, auditweights_spark_svd - ամենակարևոր նշանը, բայց չկա տեղեկություն այն մասին, թե դա ինչ է նշանակում: Կարծում էի, որ արժե հաշվել տարբեր ագրեգատները՝ հիմնվելով կարևոր հատկանիշների վրա: Օրինակ, միջին auditweights_spark_svd ըստ օգտագործողի, ըստ խմբի, ըստ օբյեկտի: Նույնը կարելի է հաշվարկել՝ օգտագործելով այն տվյալները, որոնց վրա ոչ մի ուսուցում չի իրականացվում և թիրախ = 1, այսինքն՝ միջին auditweights_spark_svd օգտագործողի կողմից՝ ըստ իրեն հավանած առարկաների: Բացի այդ, կարևոր նշաններ auditweights_spark_svd, մի քանիսն էին։ Ահա դրանցից մի քանիսը.

  • աուդիտի կշիռներCtrՍեռ
  • աուդիտի կշիռներCtrԲարձր
  • userOwnerCounterCreateLike

Օրինակ՝ միջինը աուդիտի կշիռներCtrՍեռ ըստ userId-ի, պարզվեց, որ դա կարևոր հատկանիշ է, ինչպես միջին արժեքը userOwnerCounterCreateLike userId+ownerId-ի կողմից: Սա արդեն պետք է ձեզ ստիպի մտածել, որ դուք պետք է հասկանաք դաշտերի իմաստը:

Կարևոր հատկանիշներ էին նաև աուդիտի կշիռներՀավանումների քանակը и աուդիտի քաշը ցույց է տալիս, որ հաշվարկը. Մեկը մյուսի վրա բաժանելով՝ ստացվեց էլ ավելի կարևոր հատկանիշ.

Տվյալների արտահոսք

Մրցակցությունը և արտադրության մոդելավորումը շատ տարբեր խնդիրներ են: Տվյալներ պատրաստելիս շատ դժվար է հաշվի առնել բոլոր մանրամասները և թեստում չփոխանցել թիրախային փոփոխականի մասին որոշ ոչ տրիվիալ տեղեկատվություն։ Եթե ​​մենք արտադրական լուծում ենք ստեղծում, մենք կփորձենք խուսափել մոդելի վերապատրաստման ժամանակ տվյալների արտահոսք օգտագործելուց: Բայց եթե մենք ցանկանում ենք հաղթել մրցույթում, ապա տվյալների արտահոսքը լավագույն հատկանիշներն են:

Ուսումնասիրելով տվյալները՝ դուք կարող եք տեսնել, որ ըստ objectId արժեքների աուդիտի կշիռներՀավանումների քանակը и աուդիտի քաշը ցույց է տալիս, որ հաշվարկը փոփոխությունը, ինչը նշանակում է, որ այս հատկանիշների առավելագույն արժեքների հարաբերակցությունը շատ ավելի լավ կարտացոլի գրառման փոխարկումը, քան ցուցադրման պահին:

Առաջին արտահոսքը, որը մենք գտանք, դա է աուդիտի կշիռներՀավանելՀաշիվՄաքս/աուդիտքաշերՑույցներՀաշիվՄաքս.
Բայց ի՞նչ, եթե մենք ավելի ուշադիր նայենք տվյալներին: Տեսակավորենք ըստ ցուցադրության ամսաթվի և ստանանք.

օբյեկտ ID օգտագործողի այ - Դի աուդիտի քաշը ցույց է տալիս, որ հաշվարկը աուդիտի կշիռներՀավանումների քանակը թիրախ (հավանում է)
1 1 12 3 հավանաբար ոչ
1 2 15 3 գուցե այո
1 3 16 4

Զարմանալի էր, երբ գտա առաջին նման օրինակը և պարզվեց, որ իմ կանխատեսումը չիրականացավ։ Բայց, հաշվի առնելով այն փաստը, որ այս բնութագրերի առավելագույն արժեքները օբյեկտի ներսում ավելացել են, մենք չծուլացանք և որոշեցինք գտնել. աուդիտի կշիռներըՑուցադրում էՀաշիվՀաջորդ и auditweightsLikesCountՀաջորդ, այսինքն՝ արժեքները ժամանակի հաջորդ պահին։ Հատկանիշ ավելացնելով
(auditweightsShowsCountNext-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountՀաջորդ) արագ ցատկ կատարեցինք։
Նմանատիպ արտահոսքերը կարող են օգտագործվել՝ գտնելով հետևյալ արժեքները userOwnerCounterCreateLike userId+ownerId-ի ներսում և, օրինակ, աուդիտի կշիռներCtrՍեռ 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 Հեքըթոն 2019

Կար միայն մեկ գաղափար՝ պարզապես վերարտադրել այն, ինչ արդեն կա։ Սերվերի վրա միջավայրը կարգավորելու համար մի քանի ժամ ծախսելուց հետո մենք աստիճանաբար սկսեցինք ստուգել, ​​որ արդյունքները վերարտադրելի են: Մեր առջեւ ծառացած հիմնական խնդիրը տվյալների ծավալի ավելացումն է։ Մենք որոշեցինք մի փոքր նվազեցնել բեռը և սահմանեցինք catboost պարամետրը ctr_complexity=1: Սա մի փոքր իջեցնում է արագությունը, բայց իմ մոդելը սկսեց աշխատել, արդյունքը լավն էր՝ 0,733։ Սերգեյը, ի տարբերություն ինձ, տվյալները 2 մասի չբաժանեց և մարզվեց բոլոր տվյալների վրա, չնայած դա լավագույն արդյունքներն էր տալիս առցանց փուլում, օֆլայն փուլում շատ դժվարություններ կային։ Եթե ​​մենք վերցնեինք մեր ստեղծած բոլոր հնարավորությունները և փորձեինք դրանք ներդնել catboost-ի մեջ, ապա առցանց փուլում ոչինչ չէր աշխատի: Սերգեյը տիպի օպտիմիզացիա է արել, օրինակ՝ float64 տեսակները վերածել է float32-ի։ Այս հոդվածում, Պանդաներում կարող եք գտնել հիշողության օպտիմալացման մասին տեղեկատվություն: Արդյունքում Սերգեյը մարզվել է պրոցեսորի վրա՝ օգտագործելով բոլոր տվյալները և ստացել մոտ 0,735։

Այս արդյունքները բավական էին հաղթելու համար, բայց մենք թաքցնում էինք մեր իրական արագությունը և չէինք կարող վստահ լինել, որ մյուս թիմերը նույնը չեն անում:

Պայքար մինչև վերջ

Catboost թյունինգ

Մեր լուծումը ամբողջությամբ վերարտադրվեց, մենք ավելացրինք տեքստային տվյալների և պատկերների առանձնահատկությունները, այնպես որ մնում էր միայն կարգավորել catboost-ի պարամետրերը: Սերգեյը պարապում էր պրոցեսորի վրա քիչ քանակությամբ կրկնություններով, իսկ ես ctr_complexity=1-ով: Մնաց մեկ օր, և եթե ավելացնեիք կրկնությունները կամ ավելացնեիք ctr_complexity, ապա առավոտ դուք կարող եք ավելի լավ արագություն ստանալ և ամբողջ օրը քայլել:

Օֆլայն փուլում արագությունները կարող էին շատ հեշտությամբ թաքցվել՝ պարզապես ընտրելով ոչ լավագույն լուծումը կայքում: Մենք ակնկալում էինք կտրուկ փոփոխություններ առաջատարների աղյուսակում վերջին րոպեներին, մինչև ներկայացումները փակվեն և որոշեցինք կանգ չառնել:

Աննայի տեսանյութից ես իմացա, որ մոդելի որակը բարելավելու համար լավագույնն է ընտրել հետևյալ պարամետրերը.

  • ուսուցման_դրույք — Լռելյայն արժեքը հաշվարկվում է տվյալների բազայի չափի հիման վրա: Learning_rate-ի բարձրացումը պահանջում է կրկնությունների քանակի ավելացում:
  • l2_leaf_reg — Կանոնավորեցման գործակից, լռելյայն արժեք 3, նախընտրելի է ընտրել 2-ից 30: Արժեքի նվազումը հանգեցնում է ավելցուկի ավելացման:
  • bagging_temperature — ավելացնում է պատահականություն նմուշի առարկաների կշիռներին: Լռելյայն արժեքը 1 է, որտեղ կշիռները վերցված են էքսպոնենցիալ բաշխումից: Արժեքի նվազումը հանգեցնում է ավելցուկի ավելացման:
  • պատահական_ուժ — Ազդում է բաժանումների ընտրության վրա որոշակի կրկնության ժամանակ: Որքան բարձր է պատահական_ուժեղությունը, այնքան մեծ է ցածր կարևորության բաժանման ընտրության հնարավորությունը: Յուրաքանչյուր հաջորդ կրկնության ժամանակ պատահականությունը նվազում է: Արժեքի նվազումը հանգեցնում է ավելցուկի ավելացման:

Այլ պարամետրերը շատ ավելի փոքր ազդեցություն ունեն վերջնական արդյունքի վրա, ուստի ես չփորձեցի ընտրել դրանք: Ctr_complexity=1-ով իմ GPU տվյալների ուսուցման մեկ կրկնությունը տևեց 20 րոպե, և կրճատված տվյալների ընտրված պարամետրերը մի փոքր տարբերվում էին ամբողջական տվյալների օպտիմալներից: Ի վերջո, ես կատարեցի մոտ 30 կրկնություն տվյալների 10%-ի վրա, իսկ հետո ևս մոտ 10 կրկնություն բոլոր տվյալների վրա: Պարզվեց այսպիսի մի բան.

  • ուսուցման_դրույք Լռելյայնից ավելացել եմ 40%-ով;
  • l2_leaf_reg թողեց նույնը;
  • bagging_temperature и պատահական_ուժ կրճատվել է մինչև 0,8:

Կարելի է եզրակացնել, որ մոդելը թերպատրաստված էր լռելյայն պարամետրերով:

Ես շատ զարմացա, երբ տեսա արդյունքը առաջատարների աղյուսակում.

Մոդել մոդել 1 մոդել 2 մոդել 3 անսամբլ
Առանց թյունինգի 0.7403 0.7404 0.7404 0.7407
Թյունինգով 0.7406 0.7405 0.7406 0.7408

Ես ինքս եզրակացրի, որ եթե մոդելի արագ կիրառումը անհրաժեշտ չէ, ապա ավելի լավ է փոխարինել պարամետրերի ընտրությունը մի քանի մոդելների համույթով, օգտագործելով ոչ օպտիմիզացված պարամետրեր:

Սերգեյը օպտիմիզացնում էր տվյալների շտեմարանի չափը՝ այն GPU-ում գործարկելու համար: Ամենապարզ տարբերակը տվյալների մի մասը կտրելն է, բայց դա կարելի է անել մի քանի եղանակով.

  • աստիճանաբար հեռացնել ամենահին տվյալները (փետրվարի սկզբին), մինչև տվյալների հավաքածուն սկսի տեղավորվել հիշողության մեջ.
  • հեռացնել նվազագույն կարևորության առանձնահատկությունները.
  • հեռացնել օգտվողի ID-ները, որոնց համար կա միայն մեկ մուտք;
  • թողեք միայն թեստում գտնվող օգտվողի ID-ները:

Եվ, ի վերջո, բոլոր տարբերակներից անսամբլ պատրաստեք:

Վերջին անսամբլը

Վերջին օրվա ուշ երեկոյան մենք ներկայացրել էինք մեր մոդելների համույթը, որը բերեց 0,742: Մի գիշեր ես գործարկեցի իմ մոդելը ctr_complexity=2-ով և 30 րոպեի փոխարեն այն մարզվեց 5 ժամ: Միայն առավոտյան ժամը 4-ին այն հաշվվեց, և ես պատրաստեցի վերջին անսամբլը, որը հանրային առաջատար տախտակի վրա տվեց 0,7433:

Խնդրի լուծման տարբեր մոտեցումների պատճառով մեր կանխատեսումները խիստ փոխկապակցված չէին, ինչը լավ աճ տվեց անսամբլում։ Լավ համույթ ստանալու համար ավելի լավ է օգտագործել հում մոդելի կանխատեսումները predict(prediction_type='RawFormulaVal') և սահմանել scale_pos_weight=neg_count/pos_count:

SNA Հեքըթոն 2019

Կայքում կարող եք տեսնել վերջնական արդյունքներ մասնավոր առաջատարների աղյուսակում.

Այլ լուծումներ

Շատ թիմեր հետևեցին առաջարկող համակարգի ալգորիթմների կանոններին: Ես, չլինելով այս ոլորտի մասնագետ, չեմ կարող գնահատել դրանք, բայց հիշում եմ 2 հետաքրքիր լուծում.

  • Նիկոլայ Անոխինի լուծումը. Նիկոլայը, լինելով Mail.ru-ի աշխատակից, չի դիմել մրցանակների, ուստի նրա նպատակը առավելագույն արագության հասնելը չէր, այլ հեշտությամբ մասշտաբային լուծում ստանալը։
  • Ժյուրիի մրցանակակիր թիմի որոշումը հիմնված է այս հոդվածը Ֆեյսբուքից, թույլ է տալիս շատ լավ պատկերների կլաստերավորում առանց ձեռքի աշխատանքի:

Ամփոփում

Ինչն ամենից շատ մնաց իմ հիշողության մեջ.

  • Եթե ​​տվյալների մեջ կան կատեգորիկ առանձնահատկություններ, և դուք գիտեք, թե ինչպես ճիշտ կատարել թիրախային կոդավորումը, ապա ավելի լավ է փորձել catboost-ը:
  • Եթե ​​դուք մասնակցում եք մրցույթի, ապա չպետք է ժամանակ վատնեք՝ ընտրելով այլ պարամետրեր, քան Learn_rate-ը և կրկնությունները: Ավելի արագ լուծում է մի քանի մոդելների անսամբլ պատրաստելը:
  • Boostings-ը կարող է սովորել GPU-ում: Catboost-ը կարող է շատ արագ սովորել GPU-ի վրա, բայց շատ հիշողություն է խլում:
  • Գաղափարների մշակման և փորձարկման ժամանակ ավելի լավ է սահմանել փոքր rsm~=0.2 (միայն CPU) և ctr_complexity=1:
  • Ի տարբերություն այլ թիմերի, մեր մոդելների անսամբլը մեծ աճ է տվել։ Մենք միայն մտքեր փոխանակեցինք և գրեցինք տարբեր լեզուներով։ Մենք տարբեր մոտեցում ունեինք տվյալների բաժանման հարցում և, կարծում եմ, յուրաքանչյուրն ուներ իր սեփական սխալները:
  • Անհասկանալի է, թե ինչու վարկանիշային օպտիմալացումը ավելի վատ կատարեց, քան դասակարգման օպտիմալացումը:
  • Ես ձեռք բերեցի որոշակի փորձ տեքստերի հետ աշխատելու և հասկացողություն, թե ինչպես են ստեղծվում առաջարկող համակարգերը:

SNA Հեքըթոն 2019

Շնորհակալություն կազմակերպիչներին հույզերի, գիտելիքների և ստացած մրցանակների համար։

Source: www.habr.com

Добавить комментарий