SNA Hackathon 2019

2019 оны XNUMX-XNUMX-р сард олон нийтийн сүлжээний сувгийг эрэмблэх уралдаан зохион байгуулсан 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-нд онлайнаар эхэлсэн бөгөөд XNUMX даалгавраас бүрдсэн. Хэн ч сайтад бүртгүүлж, татаж авах боломжтой үндсэн суурь тэгээд хэдэн цагийн турш машинаа ачаал. Гуравдугаар сарын 15-нд болсон онлайн тайзны төгсгөлд харайлтын төрөл бүрийн шилдэг 15-ыг 30-р сарын 1-аас XNUMX-р сарын XNUMX-ний хооронд болсон офлайн шатанд Mail.ru оффис руу урьсан.

Зорилго

Эх өгөгдөл нь хэрэглэгчийн ID (userId) болон шуудангийн ID (objectId)-ыг өгдөг. Хэрэв хэрэглэгчдэд нийтлэл үзүүлсэн бол өгөгдөл нь userId, objectId, энэ нийтлэлд өгсөн хэрэглэгчийн хариу үйлдэл (санал хүсэлт) болон зураг, текстийн янз бүрийн функцууд эсвэл холбоосуудыг агуулсан мөрийг агуулна.

хэрэглэгчийн ID объектын 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 дахин их мөр байсан бөгөөд үүнээс аль хэдийн олон байсан.

Асуудлын шийдэл

Би ажил дээрээ CV бичдэг болохоор энэ уралдаанд “Зураг” даалгавраар аяллаа эхэлсэн. Өгөгдсөн өгөгдөл нь userId, objectId, ownerId (нийтлэл нийтлэгдсэн бүлэг), нийтлэлийг үүсгэх, харуулах цагийн тэмдэг, мэдээжийн хэрэг, энэ нийтлэлийн зураг байв.
Хугацаа тэмдэглэгээнд суурилсан хэд хэдэн функцийг үүсгэсний дараа дараагийн санаа нь imagenet дээр урьдчилан бэлтгэгдсэн нейроны төгсгөлийн давхаргыг авч, эдгээр суулгацыг нэмэгдүүлэхэд илгээх явдал байв.

SNA Hackathon 2019

Үр дүн нь гайхалтай байсангүй. Imagenet нейроны суулгац нь хамааралгүй, би өөрөө автомат кодлогч хийх хэрэгтэй гэж бодлоо.

SNA Hackathon 2019

Энэ нь маш их цаг зарцуулсан бөгөөд үр дүн нь сайжрахгүй.

Онцлог үүсгэх

Зурагтай ажиллах нь маш их цаг хугацаа шаарддаг тул би илүү энгийн зүйл хийхээр шийдсэн.
Таны харж байгаагаар өгөгдлийн багцад хэд хэдэн ангиллын шинж чанарууд байдаг бөгөөд хэт их төвөг учруулахгүйн тулд би зүгээр л catboost авсан. Шийдэл нь маш сайн байсан, ямар ч тохиргоо хийлгүйгээр би тэргүүлэгчдийн самбарын эхний эгнээнд шууд орсон.

Маш их өгөгдөл байгаа бөгөөд үүнийг паркетан хэлбэрээр байрлуулсан тул би хоёр ч удаа бодолгүйгээр скала аваад бүх зүйлийг оч болгон бичиж эхлэв.

Зураг оруулахаас илүү өсөлтийг өгсөн хамгийн энгийн шинж чанарууд:

  • өгөгдлийн дотор objectId, userId болон ownerId хэдэн удаа гарч ирсэн (алдартай холбоотой байх ёстой);
  • userId нь ownerId-ээс хичнээн нийтлэл үзсэн бэ (хэрэглэгчийн групп дэх сонирхолтой хамааралтай байх ёстой);
  • Хэдэн өвөрмөц хэрэглэгчийн ID нь ownerId-ийн нийтлэлийг үзсэн (бүлгийн үзэгчдийн хэмжээг илэрхийлдэг).

Хугацаа тэмдэглэгээнээс хэрэглэгч сувгийг үзсэн өдрийн цагийг (өглөө/үд/орой/шөнө) авах боломжтой байсан. Эдгээр категориудыг нэгтгэснээр та функцуудыг үргэлжлүүлэн үүсгэж болно:

  • userId орой хэдэн удаа нэвтэрсэн;
  • Энэ бичлэгийг аль цагт ихэвчлэн харуулах вэ (objectId) гэх мэт.

Энэ бүхэн нь хэмжүүрүүдийг аажмаар сайжруулсан. Гэхдээ сургалтын өгөгдлийн багцын хэмжээ 20 сая орчим байдаг тул нэмэлт функцүүд нь сургалтыг ихээхэн удаашруулсан.

Би өгөгдлийг ашиглах арга барилаа дахин бодож үзсэн. Хэдийгээр өгөгдөл нь цаг хугацаанаас хамааралтай боловч "ирээдүйд" ямар нэгэн илэрхий мэдээлэл алдагдсаныг би хараагүй, гэсэн хэдий ч би үүнийг дараах байдлаар задлав.

SNA Hackathon 2019

Бидэнд өгсөн сургалтын багц (2, 2-р сарын XNUMX долоо хоног) XNUMX хэсэгт хуваагдсан.
Загварыг сүүлийн N өдрийн өгөгдөл дээр сургасан. Дээр дурдсан нэгтгэлүүд нь туршилтыг оруулаад бүх өгөгдөл дээр суурилагдсан. Үүний зэрэгцээ зорилтот хувьсагчийн янз бүрийн кодчилолуудыг бүтээх боломжтой өгөгдөл гарч ирэв. Хамгийн энгийн арга бол аль хэдийн шинэ боломжуудыг үүсгэж байгаа кодыг дахин ашиглах, зүгээр л сургагдаагүй өгөгдлийг тэжээх ба зорилтот = 1 юм.

Тиймээс бид ижил төстэй шинж чанаруудыг олж авсан:

  • userId групп эзэмшигчийн дугаарт нийтлэлийг хэдэн удаа харсан бэ;
  • userId групп эзэмшигчийн дугаар дээрх нийтлэлд хэдэн удаа таалагдсан бэ;
  • Хэрэглэгчийн ID-д таалагдсан нийтлэлүүдийн хувь.

Энэ нь тодорхой болсон гэсэн үг дундаж зорилтот кодчилол өгөгдлийн багцын хэсэг дээр ангилсан шинж чанаруудын янз бүрийн хослолууд. Зарчмын хувьд catboost нь зорилтот кодчилолыг бий болгодог бөгөөд энэ үүднээс авч үзвэл ямар ч ашиггүй боловч жишээлбэл, энэ бүлгийн нийтлэлд дуртай өвөрмөц хэрэглэгчдийн тоог тоолох боломжтой болсон. Үүний зэрэгцээ гол зорилгодоо хүрсэн - миний мэдээллийн багц хэд хэдэн удаа багасч, функцүүдийг үргэлжлүүлэн үүсгэх боломжтой болсон.

Хэдийгээр catboost нь зөвхөн таалагдсан хариу үйлдэл дээр тулгуурлан кодчилол үүсгэж чаддаг бол санал хүсэлт нь өөр хариу үйлдэлтэй байдаг: дахин хуваалцсан, таалагдаагүй, таалагдаагүй, дарсан, үл тоомсорлосон, кодчилолыг гараар хийж болно. Би бүх төрлийн агрегатуудыг дахин тооцоолж, өгөгдлийн багцыг хэтрүүлэхгүйн тулд ач холбогдол багатай функцуудыг хассан.

Тэр үед би маш их зөрүүтэй нэгдүгээрт бичигдэж байсан. Ганцхан будлиантай байсан зүйл бол зураг оруулахад бараг ямар ч өсөлт үзүүлээгүй явдал байв. Бүх зүйлээ catboost-д өгөх санаа гарч ирсэн. Бид Kmeans зургуудыг бөөгнөрүүлж, imageCat-ийн шинэ ангиллыг олж авдаг.

KMeans-аас авсан кластеруудыг гараар шүүж, нэгтгэсний дараах зарим ангиудыг энд оруулав.

SNA Hackathon 2019

imageCat дээр үндэслэн бид дараахь зүйлийг үүсгэдэг.

  • Шинэ ангиллын шинж чанарууд:
    • userId аль imageCat-ийг ихэвчлэн үздэг байсан;
    • Аль imageCat нь эзэмшигчийн дугаарыг ихэвчлэн харуулдаг;
    • UserId-д аль imageCat хамгийн их таалагдсан бэ;
  • Төрөл бүрийн тоолуур:
    • Хэдэн өвөрмөц imageCat userId-г харав;
    • Дээр тайлбарласны дагуу 15 орчим ижил төстэй шинж чанарууд болон зорилтот кодчилол.

Текстүүд

Зургийн уралдааны үр дүн надад тохирсон бөгөөд би текст дээр хүчээ сорихоор шийдсэн. Би өмнө нь бичвэрүүдтэй нэг их ажиллаж байгаагүй, тэнэг юм шиг tf-idf, svd дээр өдөр алчихсан. Дараа нь би doc2vec-ийн үндсэн шугамыг харсан бөгөөд энэ нь надад яг хэрэгтэй зүйл юм. doc2vec параметрүүдийг бага зэрэг тохируулсны дараа би текст оруулах боломжтой болсон.

Тэгээд дараа нь би зүгээр л зургийн кодыг дахин ашигласан бөгөөд үүний дотор зургийн оруулгыг текст шигтгээгээр сольсон. Үүний үр дүнд текстийн уралдаанд 2-р байр эзэлсэн.

Хамтарсан систем

Одоохондоо саваагаар "нухаж" амжаагүй нэг тэмцээн үлдсэн бөгөөд тэргүүлэгчдийн самбар дээрх AUC-аас харахад энэ тэмцээний үр дүн офлайн шатанд хамгийн их нөлөөлсөн байх ёстой.
Би эх өгөгдлийн бүх шинж чанаруудыг авч, ангилсан шинж чанаруудыг сонгож, зураг дээр суурилсан шинж чанаруудаас бусад зургуудтай ижил агрегатуудыг тооцоолсон. Үүнийг catboost-д оруулснаар л намайг 2-р байранд орууллаа.

Catboost оновчтой болгох эхний алхамууд

Нэг, хоёр хоёрдугаар байр надад таалагдсан ч би ямар нэг онцгой зүйл хийгээгүй гэсэн ойлголттой байсан, энэ нь би байр сууриа алдах болно гэсэн үг юм.

Тэмцээний зорилго нь хэрэглэгчийн доторх бичлэгүүдийг эрэмбэлэх бөгөөд энэ бүх хугацаанд би ангиллын асуудлыг шийдэж байсан, өөрөөр хэлбэл буруу хэмжигдэхүүнийг оновчтой болгох явдал юм.

Би танд энгийн жишээ хэлье:

хэрэглэгчийн ID объектын 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 объектын 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 долоо хоногийн турш ажиллахад хүргэсэн.

Үүнээс харахад Сергей мөн catboost ашигласан. Бид санал бодлоо солилцсон ба онцлог шинж чанаруудыг би мэдэж авсан Анна Вероника Дорогушийн илтгэл Энэ нь миний олон асуултын хариултыг агуулсан, тэр ч байтугай тэр үед хараахан авч амжаагүй байсан.

Тайланг үзэх нь бид бүх параметрүүдийг анхдагч утга руу нь буцаах, тохиргоог маш болгоомжтой хийх, зөвхөн олон функцийг зассаны дараа хийх хэрэгтэй гэсэн санааг надад хүргэв. Одоо нэг бэлтгэл нь 15 цаг орчим үргэлжилсэн боловч нэг загвар өмсөгч чуулгад олж авсан зэрэглэлээс илүү хурдыг авч чадсан.

Онцлог үүсгэх

Хамтын ажиллагааны системүүдийн уралдаанд олон тооны онцлог шинж чанаруудыг загварт чухал гэж үнэлдэг. Жишээлбэл, auditweights_spark_svd - хамгийн чухал тэмдэг, гэхдээ энэ нь юу гэсэн үг вэ гэсэн мэдээлэл алга байна. Чухал шинж чанарууд дээр үндэслэн янз бүрийн агрегатуудыг тоолох нь зүйтэй гэж би бодсон. Жишээлбэл, дундаж auditweights_spark_svd-г хэрэглэгч, бүлгээр, объектоор тооцно. Сургалт хийгдээгүй өгөгдлийг ашиглан ижил зүйлийг тооцоолж болно, зорилтот = 1, өөрөөр хэлбэл дундаж auditweights_spark_svd Хэрэглэгч өөрт таалагдсан объектоор. Үүнээс гадна чухал шинж тэмдгүүд auditweights_spark_svd, хэд хэдэн байсан. Тэдгээрийн заримыг энд харуулав.

  • auditweightsCtrGender
  • auditweightsCtrHigh
  • userOwnerCounterCreateLikes

Жишээлбэл, дундаж auditweightsCtrGender userId дагуу энэ нь дундаж утгатай адил чухал шинж чанар болж хувирсан userOwnerCounterCreateLikes userId+ownerId-ээр. Энэ нь таныг талбаруудын утгыг ойлгох хэрэгтэй гэж бодоход хүргэсэн байх ёстой.

Мөн чухал шинж чанарууд байсан auditweightsLikesCount и auditweightsShowsCount. Нэг нэгээр нь хуваах нь илүү чухал шинж чанарыг олж авсан.

Мэдээлэл алдагдсан

Өрсөлдөөн ба үйлдвэрлэлийн загварчлал нь тэс өөр ажил юм. Өгөгдөл бэлтгэхдээ бүх нарийн ширийн зүйлийг анхаарч үзэх нь маш хэцүү бөгөөд тест дэх зорилтот хувьсагчийн талаар өчүүхэн бус мэдээллийг дамжуулахгүй байх нь маш хэцүү байдаг. Хэрэв бид үйлдвэрлэлийн шийдлийг бий болгож байгаа бол загварыг сургахдаа өгөгдөл алдагдахаас зайлсхийхийг хичээх болно. Гэхдээ хэрэв бид өрсөлдөөнд ялахыг хүсч байвал өгөгдөл алдагдуулах нь хамгийн сайн боломж юм.

Өгөгдлийг судалсны дараа та үүнийг objectId утгын дагуу харж болно auditweightsLikesCount и auditweightsShowsCount өөрчлөлт, энэ нь эдгээр шинж чанаруудын хамгийн их утгын харьцаа нь харуулах үеийн харьцаатай харьцуулахад дараах хөрвүүлэлтийг илүү сайн тусгана гэсэн үг юм.

Бидний олж мэдсэн анхны гоожсон зүйл бол auditweightsLikesCountMax/auditweightsShowsCountMax.
Гэхдээ бид өгөгдлийг илүү нарийвчлан авч үзвэл яах вэ? Үзэсгэлэнгийн огноогоор нь ангилаад дараахийг авцгаая:

объектын ID хэрэглэгчийн ID auditweightsShowsCount auditweightsLikesCount зорилтот (таалагдаж байна)
1 1 12 3 үгүй байх
1 2 15 3 Магадгүй тийм
1 3 16 4

Ийм анхны жишээг олж хараад миний таамаг биелээгүй нь үнэхээр гайхширсан. Гэхдээ объектын доторх эдгээр шинж чанаруудын хамгийн их утга нэмэгдэж байгааг харгалзан бид залхуу биш байсан тул олохоор шийдсэн. auditweightsShowsCountNext и auditweightsLikesCountNext, өөрөөр хэлбэл, цаг хугацааны дараагийн агшин дахь үнэ цэнэ. Онцлог нэмэх замаар
(auditweightsShowsCount Next-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCount-Next) Бид хурдан огцом үсрэлт хийлээ.
Дараах утгыг олох замаар ижил төстэй алдагдлыг ашиглаж болно 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 vs. 0,725). QueryCrossEntropy-д найдвар байсаар байсан бөгөөд үүнийг эхлүүлэх боломжгүй байсан.

Офлайн үе шат

Офлайн үе шатанд өгөгдлийн бүтэц ижил хэвээр байсан боловч бага зэрэг өөрчлөлтүүд гарсан:

  • userId, objectId, ownerId таниулбаруудыг дахин санамсаргүй болгосон;
  • хэд хэдэн тэмдгийг арилгаж, хэд хэдэн нэрийг өөрчилсөн;
  • мэдээлэл ойролцоогоор 1,5 дахин нэмэгдсэн байна.

Бүртгэгдсэн бэрхшээлүүдээс гадна нэг том давуу тал байсан: багт RTX 2080TI бүхий том сервер хуваарилагдсан. Би удаан хугацааны турш htop-д дуртай байсан.
SNA Hackathon 2019

Зөвхөн нэг санаа байсан - аль хэдийн байгаа зүйлийг зүгээр л хуулбарлах. Сервер дээр орчинг тохируулахад хэдэн цаг зарцуулсны дараа бид үр дүнг дахин гаргах боломжтой эсэхийг аажмаар шалгаж эхлэв. Бидний тулгараад байгаа гол асуудал бол өгөгдлийн хэмжээг нэмэгдүүлэх явдал юм. Бид ачааллыг бага зэрэг бууруулж, catboost параметрийг ctr_complexity=1 болгохоор шийдсэн. Энэ нь хурдыг бага зэрэг бууруулдаг, гэхдээ миний загвар ажиллаж эхэлсэн, үр дүн нь сайн байсан - 0,733. Сергей надаас ялгаатай нь өгөгдлийг 2 хэсэгт хуваагаагүй бөгөөд бүх өгөгдөл дээр сургасан боловч энэ нь онлайн шатанд хамгийн сайн үр дүнг өгсөн ч офлайн шатанд олон бэрхшээл тулгарсан. Хэрэв бид өөрсдийн үүсгэсэн бүх боломжуудыг аваад catboost руу оруулахыг оролдвол онлайн шатанд юу ч ажиллахгүй. Сергей төрөл оновчлол хийсэн, жишээ нь float64 төрлийг float32 болгон хөрвүүлсэн. Энэ нийтлэлд, Та панда дотроос санах ойн оновчлолын талаарх мэдээллийг олж болно. Үүний үр дүнд Сергей бүх өгөгдлийг ашиглан CPU дээр бэлтгэл хийж, ойролцоогоор 0,735 авсан.

Эдгээр үр дүн нь хожиход хангалттай байсан ч бид жинхэнэ хурдаа нууж, бусад багууд ийм амжилт гаргахгүй байгаа гэдэгт итгэлтэй байж чадсангүй.

Эцсийн эцэст тэмц

Catboost тааруулах

Бидний шийдлийг бүрэн хуулбарласан, бид текст өгөгдөл, зургийн онцлогуудыг нэмсэн тул зөвхөн catboost параметрүүдийг тохируулах л үлдлээ. Сергей CPU дээр цөөн тооны давталттай, би 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 дээр ажиллуулахын тулд оновчтой болгож байсан. Хамгийн энгийн сонголт бол өгөгдлийн хэсгийг таслах боловч үүнийг хэд хэдэн аргаар хийж болно.

  • өгөгдлийн багц санах ойд багтаж эхлэх хүртэл хамгийн эртний өгөгдлийг (XNUMX-р сарын эхээр) аажмаар устгах;
  • хамгийн бага ач холбогдолтой функцуудыг устгах;
  • зөвхөн нэг оруулгатай хэрэглэгчийн ID-г устгах;
  • Зөвхөн тестэнд байгаа хэрэглэгчийн ID-г үлдээнэ үү.

Эцэст нь бүх сонголтоос нэг чуулга хий.

Сүүлийн чуулга

Сүүлчийн өдрийн орой гэхэд бид загвар өмсөгчдийнхээ чуулга гаргаж, 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-ийн ажилтан байсан тул шагнал авах хүсэлт гаргаагүй тул түүний зорилго нь хамгийн дээд хурдад хүрэх биш, харин хялбархан өргөжүүлэх боломжтой шийдлийг олж авах явдал байв.
  • Шүүгчдийн шагналыг хүртсэн багийн шийдвэрийг үндэслэн энэ нийтлэлийг фэйсбүүкээс авав, гар ажиллагаагүйгээр дүрсийг маш сайн кластер болгохыг зөвшөөрсөн.

дүгнэлт

Миний ой санамжинд хамгийн их үлдсэн зүйл:

  • Хэрэв өгөгдөлд ангилсан шинж чанарууд байгаа бөгөөд та зорилтот кодчилолыг хэрхэн зөв хийхийг мэддэг бол catboost-ийг туршиж үзэх нь дээр.
  • Хэрэв та тэмцээнд оролцож байгаа бол суралцах_хувь болон давталтаас бусад параметрүүдийг сонгоход цаг алдах ёсгүй. Илүү хурдан шийдэл бол хэд хэдэн загвараас бүрдсэн чуулга хийх явдал юм.
  • Өргөтгөл нь GPU дээр суралцах боломжтой. Catboost нь GPU дээр маш хурдан суралцах боломжтой боловч маш их санах ойг иддэг.
  • Санаа боловсруулах, турших явцад жижиг rsm~=0.2 (зөвхөн CPU) ба ctr_complexity=1-ийг тохируулах нь дээр.
  • Бусад багаас ялгаатай нь манай загвар өмсөгчдийн чуулга томоохон өсөлт үзүүлсэн. Бид зөвхөн санал бодлоо солилцож, өөр өөр хэлээр бичдэг байсан. Бид өгөгдлийг хуваах өөр арга барилтай байсан бөгөөд миний бодлоор тус бүр өөрийн гэсэн алдаатай байсан.
  • Яагаад зэрэглэлийн оновчлол нь ангиллын оновчлолоос муу ажилласан нь тодорхойгүй байна.
  • Би тексттэй ажиллах туршлага, зөвлөмж өгөх системийг хэрхэн хийдэг талаар ойлголттой болсон.

SNA Hackathon 2019

Хүлээн авсан сэтгэл хөдлөл, мэдлэг, шагналыг зохион байгуулагчдад баярлалаа.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх