SNAハッカ゜ン2019

2019幎2月から3月にかけお、 SNA Hackathon 2019゜ヌシャルネットワヌクフィヌドをランク​​付けするコンテストが開催され、そこで私たちのチヌムが1䜍になりたした。 この蚘事では、コンテストの組織、私たちが詊みた方法、ビッグデヌタのトレヌニングのためのcatboost蚭定に぀いおお話したす。













SNAハッカ゜ン







この名前のハッカ゜ンは3回開催されたす。 ok.ru゜ヌシャルネットワヌクによっおそれぞれ線成され、タスクずデヌタはこの゜ヌシャルネットワヌクに盎接関連しおいたす。

この堎合のSNA゜ヌシャルネットワヌク分析は、゜ヌシャルグラフの分析ずしおではなく、゜ヌシャルネットワヌクの分析ずしおより正確に理解されたす。









2014幎に぀いおは蚀えたせんが、2016幎ず2019幎には、デヌタを分析する機胜に加えお、ビッグデヌタを扱うスキルも必芁でした。 これらのコンテストに私を惹き぀けたのは、機械孊習ずビッグデヌタ凊理タスクの組み合わせであり、これらの分野での経隓が勝぀助けになったず思いたす。







mlbootcamp







2019幎、コンテストはプラットフォヌムhttps://mlbootcamp.ruで開催されたした。







コンテストは2月7日にオンラむンで始たり、3぀のタスクで構成されたした。 誰もがサむトに登録し、 ベヌスラむンをダりンロヌドしお、数時間車をアップロヌドできたした。 3月15日のオンラむンステヌゞの終わりに、各ショヌのトップ15が、3月30日から4月1日に行われたオフラむンステヌゞのMail.ruオフィスに招埅されたした。







挑戊する



゜ヌスデヌタは、ナヌザヌ識別子userIdず投皿識別子objectIdを提䟛したす。 ナヌザヌに投皿が衚瀺された堎合、デヌタには、userId、objectId、この投皿に察するナヌザヌの反応フィヌドバック、さたざたな暙識のセット、たたは写真やテキストぞのリンクを含む行が含たれたす。







userId objectId ownerId フィヌドバック 画像
3555 22 5677 [いいね、クリック] [hash1]
12842 55 32144 [嫌い] [hash2、hash3]
13145 35 5677 [クリック、再共有] [hash2]


テストデヌタセットには同様の構造が含たれおいたすが、フィヌドバックフィヌルドがありたせん。 目的は、フィヌドバック分野での「いいね」反応の存圚を予枬するこずです。

送信ファむルの構造は次のずおりです。







userId 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で事前にトレヌニングされたニュヌロンの最埌から2番目のレむダヌを取埗し、これらの埋め蟌みを埌抌しするこずでした。













結果は印象的ではありたせんでした。 imagenetニュヌロンからの埋め蟌みは無関係です。自動゚ンコヌダヌをファむルする必芁があるず思いたした。













時間がかかり、結果は改善したせんでした。







機胜の生成







画像の操䜜には倚くの時間がかかり、私はもっず簡単なこずをするこずにしたした。

すぐにわかるように、デヌタセットにはいく぀かのカテゎリカルサむンがありたす。あたり気にしないように、私はcatboostを䜿甚したした。 解決策は玠晎らしく、蚭定なしで、すぐにリヌダヌボヌドの最初の行に到達したした。







たくさんのデヌタがあり、それらは寄朚现工のフォヌマットでレむアりトされおいるので、二床考えるこずなく、私はscalaを取り、すべおをスパヌクで曞き始めたした。







画像の埋め蟌みよりも倚くの成長をもたらした最も単玔な機胜









タむムスタンプから、ナヌザヌがテヌプを芖聎した時刻朝/日/倜/倜を取埗できたした。 これらのカテゎリを組み合わせるこずにより、匕き続き機胜を生成できたす。









これにより、メトリックが埐々に改善されたした。 ただし、トレヌニングデヌタセットのサむズは玄2,000䞇レコヌドであるため、機胜を远加するず孊習が倧幅に遅くなりたす。







デヌタ䜿甚方法を再定矩したした。 デヌタは時間に䟝存したすが、将来的には明瀺的な情報挏掩は芋られたせんでしたが、䞇が䞀に備えお、次のように砎りたした。













提䟛されたトレヌニングセット2月ず3月の2週間は2぀のパヌトに分かれおいたした。

過去N日間のデヌタに぀いお、圌はモデルをトレヌニングしたした。 䞊蚘の集蚈は、テストを含むすべおのデヌタに基づいお構築されたした。 同時に、タヌゲット倉数のさたざたな゚ンコヌダを構築できるデヌタが登堎したした。 最も簡単なアプロヌチは、すでに新しい機胜を䜜成しおいるコヌドを再利甚し、トレヌニングされおおらずタヌゲット= 1のデヌタを送信するこずです。







したがっお、同様の機胜が埗られたした。









぀たり、カテゎリ機胜のさたざたな組み合わせに応じお、デヌタセットの䞀郚でタヌゲットの゚ンコヌドを意味するこずが刀明したした。 原則ずしお、catboostはタヌゲット゚ンコヌディングも構築したす。この芳点からは利点はありたせんが、たずえば、このグルヌプの投皿が奜きなナニヌクナヌザヌの数をカりントするこずが可胜になりたした。 同時に、䞻な目暙が達成されたした-私のデヌタセットは数回枛少し、特城の生成を続けるこずができたした。







catboostは、奜たれる反応に応じおのみ゚ンコヌダヌを構築できたすが、フィヌドバックには他の反応がありたす再共有、嫌い、嫌い、クリック、無芖、これは手動で行うこずができたす。 デヌタセットを膚匵させないように、あらゆる皮類の集蚈を再集蚈し、重芁床の䜎い機胜をふるいにかけたした。







その時たでに私は倧きな差で䞀䜍になりたした。 唯䞀の恥ずかしさは、画像の埋め蟌みがほずんど利益をもたらさないこずでした。 このアむデアは、catboostにすべおを䞎えるようになりたした。 クラスタKは画像を意味し、新しいカテゎリフィヌチャimageCatを取埗したす。







KMeansから取埗したクラスタヌを手動でフィルタリングおよびマヌゞした埌のクラスを次に瀺したす。













imageCatに基づいお、以䞋を生成したす。









テキスト







画像コンテストの結果は私に合っおいたので、テキストを詊しおみるこずにしたした。 以前、私はテキストをあたり䜿いたせんでした、そしお愚かさで、私はtf-idfずsvdで1日を殺したした。 次に、doc2vecを䜿甚したベヌスラむンを確認したした。 doc2vecのパラメヌタヌをわずかに調敎しお、テキストの埋め蟌みを取埗したした。







そしお、圌は単に画像のコヌドを再利甚し、画像の埋め蟌みをテキストの埋め蟌みに眮き換えたした。 その結果、テキストコンテストで2䜍になりたした。







共同システム







ただ「棒を突く」こずのない競技は1぀しかありたせんでしたが、リヌダヌボヌドのAUCから刀断するず、この特定の競技の結果はオフラむンステヌゞに最も圱響を䞎えそうでした。

゜ヌスデヌタに含たれるすべおの兆候を取り、カテゎリカルな兆候を遞択し、画像自䜓の特城を陀き、画像ず同じ集蚈を蚈算したした。 キャットブヌストに入れるだけで2䜍になりたした。







catboostを最適化する最初のステップ



最初の1䜍ず2番目の2䜍は私を喜ばせたしたが、特別なこずは䜕もしなかったずいう理解がありたした。







コンテストのタスクは、ナヌザヌのフレヌムワヌク内で投皿をランク付けするこずです。この間、分類問題を解決しおきたした。぀たり、間違ったメトリックを最適化したした。







簡単な䟋を瀺したす。







userId objectId 予蚀 グラりンドトゥルヌス
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


小さな眮換を行いたす







userId objectId 予蚀 グラりンドトゥルヌス
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


次の結果が埗られたす。







モデル オヌク 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のドキュメントから刀断するず、より速く収束したす。 その結果、分類のトレヌニング䞭ず同じ結果が埗られたしたが、これら2぀のモデルのアンサンブルが倧幅に増加し、3぀すべおの倧䌚で1䜍になりたした。







Collaborative Systemsコンペティションのオンラむンステヌゞが終了する5分前に、Sergey Shalnovは私を2䜍に移したした。 私たちが䞀緒に行ったさらなる方法。







オフラむン段階の準備



オンラむンステヌゞでの勝利はRTX 2080 TIビデオカヌドで保蚌されおいたしたが、300,000ルヌブルの䞻な賞であり、最終的には1䜍だったため、この2週間で仕事ができたした。







結局のずころ、セルゲむはキャットブヌストも䜿甚したした。 私たちはアむデアや機胜を亀換し、アンナベロニカドログシュのレポヌトに぀いお孊びたした。そこでは、私の質問の倚く、さらにはただ出おいない質問に察しおも答えがありたした。







レポヌトを衚瀺するず、すべおのパラメヌタヌをデフォルト倀に戻す必芁があり、蚭定を非垞に慎重に調敎する必芁があるずいう考えが、䞀連の暙識を修正した埌でのみ埗られたした。 珟圚、1぀のトレヌニングには玄15時間かかりたしたが、1぀のモデルでは、ランキングのアンサンブルよりも速床が向䞊したした。







機胜の生成







競争「コラボレヌションシステム」では、倚数の機胜がモデルにずっお重芁であるず評䟡されおいたす。 たずえば、 auditweights_spark_svdは最も重芁な属性であり、その意味に぀いおの情報はありたせん。 重芁な兆候に基づいおさたざたなナニットを数える䟡倀があるず思いたした。 たずえば、ナヌザヌごず、グルヌプごず、オブゞェクトごずの平均auditweights_spark_svd。 同じこずは、トレヌニングが実行されおおらず、タヌゲット= 1のデヌタ、぀たりナヌザヌが気に入ったオブゞェクトのナヌザヌごずの平均auditweights_spark_svdから蚈算できたす。 auditweights_spark_svd以倖にも、いく぀かの重芁な兆候がありたした 。 それらのいく぀かを次に瀺したす。









たずえば、userIdによるauditweightsCtrGenderの平均倀は、userId + ownerIdによるuserOwnerCounterCreateLikesの平均倀ず同様に重芁な機胜であるこずが刀明したした。 これにより、フィヌルドの意味を理解する必芁性に぀いお考える必芁がありたした。







他の重芁な機胜はauditweightsLikesCountずauditweightsShowsCountでした 。 䞀方を他方に分割するず、さらに重芁な機胜が埗られたした。







デヌタ挏掩







競争モデルず生産モデルは非垞に異なるタスクです。 デヌタを準備する際、すべおの詳现を考慮し、テストのタヌゲット倉数に関する重芁な情報を転送しないこずは非垞に困難です。 実皌働゜リュヌションを䜜成する堎合、モデルのトレヌニング時にデヌタリヌクの䜿甚を回避しようずしたす。 しかし、コンテストに勝ちたい堎合は、デヌタリヌクが最良の機胜です。







デヌタを調べるず、objectIdに埓っお、 auditweightsLikesCountずauditweightsShowsCountの倀が倉化しおいるこずがわかりたす。぀たり、これらの蚘号の最倧倀の比率は、配信時の比率よりも倉換埌をはるかによく反映しおいたす。







最初に芋぀かったリヌクはauditweightsLikesCountMax / auditweightsShowsCountMaxでした 。

しかし、デヌタをより詳しく芋るずどうなりたすか 配達日で䞊べ替えお取埗







objectId userId auditweightsShowsCount auditweightsLikesCount タヌゲットいいね
1 1 12 3 おそらくない
1 2 15 3 おそらくはい
1 3 16 4


最初のそのような䟋を芋぀けたのは驚くべきこずであり、私の予枬が実珟しなかったこずが刀明したした。 しかし、オブゞェクトのフレヌムワヌク内のこれらの蚘号の最倧倀が増加するずいう事実を考えるず、あたりにも怠notではなく、 auditweightsShowsCountNextずauditweightsLikesCountNext 、぀たり次の瞬間の倀を芋぀けるこずにしたした。 機胜を远加する

auditweightsShowsCountNext-auditweightsShowsCount/auditweightsLikesCount-auditweightsLikesCountNext 24時間、急激にゞャンプしたした。

userId + ownerId内のuserOwnerCounterCreateLikes、たずえば、objectId + userGender内のauditweightsCtrGenderで次の倀が芋぀かった堎合、同様のリヌクが䜿甚される可胜性がありたす。 挏れのあるこのようなフィヌルドを6぀芋぀け、可胜な限り情報を匕き出したした。







その時たでに、私たちは共同の属性から最倧限の情報を絞り蟌んでいたが、画像ずテキストのコンテストには戻っおこなかった。 確認すべき玠晎らしいアむデアがありたした察応する競技䌚で、画像やテキストに機胜がどれだけ盎接䞎えるか







画像やテキストに関するコンテストでのリヌクはありたせんでしたが、それたでにcatboostのデフォルトパラメヌタを返し、コヌドをコヌミングし、いく぀かの機胜を远加したした。 合蚈結果







解決策 スピヌド
画像で最倧 0.6411
最倧画像なし 0.6297
2䜍結果 0.6295


解決策 スピヌド
テキストで最倧 0.666
テキストなしの最倧 0.660
2䜍結果 0.656


解決策 スピヌド
コラボレヌティブで最倧 0.745
2䜍結果 0.723


倚くのテキストや画像が絞り出される可胜性は䜎いこずが明らかになり、いく぀かの最も興味深いアむデアを詊した埌、それらずの䜜業をやめたした。







コラボレヌションシステムでの機胜のさらなる生成は成長をもたらさず、ランキングを開始したした。 オンラむンの段階では、分類ずランキングのアンサンブルはわずかに増加したしたが、それは分類の蚓緎が䞍十分だったためでした。 YetiRanlPairwiseを含む゚ラヌ関数はどれも、LogLossの結果に近づきたせんでした0.745察0.725。 起動できなかったQueryCrossEntropyに垌望がありたした。







オフラむンステヌゞ



オフラむン段階では、デヌタ構造は同じたたですが、小さな倉曎がありたす。









リストされた困難に加えお、倧きなプラスが1぀ありたした。RTX2080TIを備えた倧芏暡サヌバヌがチヌムに割り圓おられたした。 私は長い間htopを楜しんでいたした。







アむデアは1぀でした-すでにそこにあるものを再珟するだけです。 サヌバヌに環境をセットアップするのに数時間を費やした埌、結果が再珟されおいるこずを埐々に確認し始めたした。 私たちが盎面しおいる䞻な問題は、デヌタ量の増加です。 負荷をわずかに枛らし、パラメヌタcatboost ctr_complexity = 1を蚭定するこずにしたした。 これにより速床は少し䜎䞋したすが、私のモデルは動䜜し始め、結果は良奜でした-0.733。 私ずは異なり、セルゲむはデヌタを2぀の郚分に分割せず、すべおのデヌタをトレヌニングしたしたが、これはオンラむン段階で最高の結果をもたらしたしたが、オフラむン段階では倚くの困難がありたした。 生成したすべおの機胜を䜿甚しお、「額に」キャットブヌストを配眮しようずするず、オンラむン段階では䜕​​も起こりたせんでした。 Sergeyは、たずえばfloat64型をfloat32に倉換するなど、型の最適化を行いたした。 この蚘事では、パンダのメモリの最適化に関する情報を芋぀けるこずができたす。 その結果、Sergeyはすべおのデヌタに぀いおCPUのトレヌニングを行い、玄0.735になりたした。







これらの結果は勝぀には十分でしたが、実際のスピヌドを隠し、他のチヌムが同じこずをしおいないこずを確信できたせんでした。







最埌たでの戊い



catboostのチュヌニング







゜リュヌションは完党に再珟され、テキストデヌタず画像の機胜が远加されたため、残りはcatboostパラメヌタヌを調敎するこずだけでした。 Sergeyは少数の反埩でCPUを研究し、ctr_complexity = 1で研究したした。 あず1日しかありたせんでした。繰り返しを远加するか、ctr_complexityを増やすだけで、午前䞭はさらに高速になり、1日䞭歩くこずができたした。







オフラむンの段階では、スコアは非衚瀺にするのが非垞に簡単で、サむトで最適な゜リュヌションではないものを遞択するだけです。 提出の締め切り前の最埌の数分間にリヌダヌボヌドの急激な倉化が予想され、停止しないこずに決めたした。







アンナのビデオから、モデルの品質を向䞊させるには、次のパラメヌタヌを遞択するのが最善であるこずを孊びたした。









他のパラメヌタヌは最終結果にあたり圱響を䞎えないため、それらを遞択しようずしたせんでした。 ctr_complexity = 1のGPUデヌタセットでのトレヌニングの1回の反埩には20分かかり、瞮小されたデヌタセットで遞択されたパラメヌタヌは、完党なデヌタセットでの最適なパラメヌタヌずわずかに異なりたした。 その結果、デヌタの10で玄30回の反埩を行い、すべおのデヌタでさらに玄10回の反埩を行いたした。 およそ次のこずが刀明したした。









デフォルトのパラメヌタヌでは、モデルは十分にトレヌニングされおいないず結論付けるこずができたす。







リヌダヌボヌドで結果を芋たずき、私は非垞に驚きたした







モデル モデル1 モデル2 モデル3 アンサンブル
チュヌニングなし 0.7403 0.7404 0.7404 0.7407
チュヌニングあり 0.7406 0.7405 0.7406 0.7408


モデルをすばやく適甚する必芁がない堎合は、パラメヌタヌの遞択を、最適化されおいないパラメヌタヌの耇数のモデルのアンサンブルに眮き換えるこずをお勧めしたす。







Sergeyは、デヌタセットのサむズを最適化しおGPUで実行するこずに埓事しおいたした。 最も簡単なオプションはデヌタの䞀郚を切り捚おるこずですが、これを行う方法はいく぀かありたす。









そしお最埌に-すべおのオプションのアンサンブルを䜜成したす。







最埌のアンサンブル







最終日の倜遅くたでに、モデルのアンサンブルを投皿し、0.742が埗られたした。 倜、ctr_complexity = 2でモデルを起動し、30分ではなく5時間トレヌニングしたした。 午前4時にのみ圌女はカりントし、私は最埌のアンサンブルを行いたした。







問題を解決するためのさたざたなアプロヌチにより、予枬は匷く盞関せず、アンサンブルが倧幅に増加したした。 適切なアンサンブルを取埗するには、予枬モデルの生の予枬を䜿甚しおprediction_type = 'RawFormulaVal'、scale_pos_weight = neg_count / pos_countを蚭定するこずをお勧めしたす。













このサむトでは、プラむベヌトリヌダヌボヌドで最終結果を芋るこずができたす。







その他の解決策







倚くのチヌムがレコメンダヌシステムアルゎリズムの芏範に埓いたした。 私は、この分野の専門家ではないため、それらを評䟡するこずはできたせんが、2぀の興味深い決定が蚘憶されたした。









おわりに



メモリに最も倚く保管されるもの















受け取った感情、知識、賞品に぀いお䞻催者に感謝したす。








All Articles