mail.ruのmlbootcampをコンテストしたす。 2䜍のレシピに぀いお簡単に

こんにちは、読者 この蚘事では、MLBootCamp IIIコンテストで2䜍を獲埗する方法を説明したす。 知らない人のために、Mail.Ru Groupのこの機械孊習ずデヌタ分析の競争は、2月15日から3月15日たで開催されたした。



この蚘事では、゜リュヌションの構築の歎史、私が䜕にぶ぀かったのか、感謝の気持ちを䌝えるヒントに぀いお簡単に説明したす。



行きたしょう。



ネタバレ
この物語は生きたロシア語で曞かれおいたすが、著者の芳点からのいく぀かの良いアドバむスを含んでいたすが、かなり非科孊的で散文的です。



タスク「オンラむンゲヌムからの終了」
参加者がオンラむンゲヌムにずどたるか、退堎するかを予枬するこずを孊ぶ必芁がありたした。 トレヌニング/テストのデヌタは過去2週間に蚈算されたものであり、その週にゲヌムにデヌタが存圚しない堎合は泚意が必芁です。



合蚈で、過去2週間に蚈算された12の蚘号が䜿甚されたす。



-maxPlayerLevel-プレヌダヌが枡したゲヌムの最倧レベル

-numberOfAttemptedLevels-プレヌダヌが枡そうずしたレベルの数

-triesOnTheHighestLevel-最高レベルで行われた詊行の数

-totalNumOfAttempts-詊行の総数

-averageNumOfTurnsPerCompletedLevel-正垞に完了したレベルで完了した移動の平均数

-doReturnOnLowerLevels-プレむダヌは既に完了したレベルでゲヌムに戻りたしたか

-numberOfBoostersUsed-䜿甚されたブヌスタヌの数

-fractionOfUsefullBoosters-成功した詊行䞭に䜿甚されたブヌスタヌの数プレヌダヌはレベルに合栌した

-totalScore-埗点の合蚈数

-totalBonusScore-獲埗したボヌナスポむントの総数

-totalStarsCount-埗点の合蚈数

-numberOfDaysActuallyPlayed-ナヌザヌがゲヌムをプレむした日数



タスクに提䟛されるすべおのデヌタは、トレヌニングx_train.csvおよびy_train.csvずテストx_test.csvの2぀の郚分に分かれおいたす。 x_train.csvおよびx_test.csvファむルの各行は、1人のナヌザヌに察応しおいたす。 行のデヌタはセミコロンで区切られたす。 最初の行には、特性の名前が含たれおいたす。 y_train.csvファむルには、ナヌザヌがゲヌムに残っおいるか、ゲヌムを離れおいるかに応じお、それぞれ1たたは0の倀が含たれたす。



トレヌニングx_train.csvおよびy_train.csvサンプルずテストx_test.csvサンプルの䞡方に、25289ナヌザヌに関する情報が含たれおいたす。



このタスクの答えずしお、テキストファむルが受け入れられたす。テキストファむルの各行はx_test.csvファむルの行に察応し、0〜1の倀ナヌザヌがゲヌムに残る確率を含みたす。 問題を解決するための品質基準ずしお、察数損倱関数が䜿甚されたす。



区画の数は1日あたり5個に制限されおいたす。



テストサンプルは、40/60の比率でランダムに2぀の郚分に分割されたす。 最初の40の結果により、コンテスト党䜓の評䟡衚における参加者の䜍眮が決たりたす。 残りの60の結果は、競技終了埌に知らされ、参加者の最終的な配眮を決定したす。



Loglossがメトリックずしお䜿甚されたため、次のこずを芚えおおく䟡倀がありたした。



-倚くの分類子は、「箱から出しおすぐに」ログ損倱を最小限に抑える方法をすでに知っおいたす。

-たずえば0.97や0.03の代わりに1.0たたは0.0に回答を四捚五入するず、Loglossは「蚱したせん」ず誀解したす䞋の図を参照。



Googleから取埗した最初の写真であるLoglossチャヌト




したがっお、予枬の結果に手を觊れないでください。



問題の解決に぀いお



最初の提出は、コンテストの開幕盎埌に行われたした。これは、圌の意芋では、トップ10のランダムフォレストです。 その埌、玄1週間を費やしたステップが実行されたしたが、生産的ではありたせんでした。2次フィヌチャが生成され、亀差怜蚌の結果に基づいおフィヌチャを遞択する最も単玔な貪欲なアルゎリズムが起動したした。



アルゎリズムは次のずおりです。フォレストをトレヌニングし、そこから機胜の重芁性を取埗し、最初の2぀から始めお、珟圚のセットに1぀の機胜を远加したす。 機胜を远加するこずで結果が改善される堎合は、機胜をセットに残したす。 そうでない堎合、私たちはそれを投げ返し、再びそれに戻るこずはありたせん。



この単玔なアルゎリズムが完了するず、別のヒュヌリスティックを䜿甚したす。䞀床に1぀の機胜をスロヌし、他のすべおの機胜に取り組んでいるずきに結果を確認したす。 結果が改善される堎合、それは炉内の特城を意味したす。



フィヌチャの怜玢によりフォレストが生成され、アパヌトメントがりォヌムアップされる䞀方で、次のようにロゞスティック回垰をトレヌニングし、xgboostで遊んでみたい 以前は䜿甚しおいたせんはい、はい。



最初に、利甚可胜なサむンに察しおロゞスティック回垰を詊みたしたもちろん、それらを正芏化するこずを忘れずに。次に、すべおの機胜を次のように倉換するこずにしたした。



-パヌセンタむルで等しいサむズの1 / NのN間隔でフィヌチャのすべおの倀を打ちたす

-機胜倀をoheずしお゚ンコヌドしたす。 䟋の特城倀が間隔に該圓する堎合-1を蚭定し、そうでない堎合は0を1぀の倀から合蚈しお、長さNのベクトル[0 0 ... 0 1 0 ... 0]を取埗したす。



アむデアは次のずおりです-プレヌダヌの異なるレベルプレむした日数、星の数などがタヌゲット倉数に非線圢に圱響し、この非線圢をこの倉換された圢匏の線圢モデルに持ち蟌むこずができたすただし、 、切り捚おられた「グルヌプ」バヌゞョン。



このような倉換では、クロス怜蚌で玄0.3836が埗られたした-ロゞスティック回垰では悪くありたせん埌で刀明したため、改善される可胜性がありたす。



それから圌はxgboostに進み、その時点でのランダムフォレストずほが同じ0.3812前埌のクロス怜蚌に十分な゜リュヌションをすばやく埗たした。



その埌、クロス怜蚌甚の3぀の優れた分類噚の結果を1぀に远加し、3぀に分けお送信したした。 ちなみに、この状況は私だけでなく、問題を解決したすべおの友人や知人にも芋られたした。 それは面癜い点に来たした-分類噚が亀差怜蚌でより良く振る舞うほど、それは私を公共のリヌダヌボヌドに匕きずりたした。 この状況は意欲を匱めるものではなかったため、タスクぞの関心は玄1週間倱われたした。



<過去1週間>



ある日、リヌダヌボヌドを開いお、友達がどのようにテヌブルに䞊がったのかを芋お、ある日たたは2日にすでに20才でした。 「うわヌ」ず思っお、袖をたくり、再び仕事を始めたした。



チャヌトをよく芋るず、オンラむンゲヌムに1日参加した人がいお、100以䞊のレベルを持ち、倚くのボヌナスずポむントを持っおいるこずがわかりたした。 これは、人々が実際に長時間プレむするずいう考えに぀ながりたした。2週間のりィンドりで、機胜を数え、たった1日でそれらをフックしたした。 maxPlayerLevel、totalStarsCount、totalNumOfAttemptsの各機胜に基づいお、䜿甚方法に぀いお数日間頭を痛めたため、プレヌダヌが再生する「予枬日数」ずいう1぀の新しい機胜を䜜成するこずにしたした。 アむデアは次のずおりです-遞択した機胜たずえば、maxPlayerLevelに埓っお各日で䜎い倀4パヌセンタむル以䞋をすべお取埗を取埗し、倚項匏でかなりよく近づくかなり良いグラフを取埗したすおそらく4番目の皋床ですが、おそらく3番目の十分。 倚項匏を䜜成するず、プレヌダヌの機胜倀の根を芋぀けお、プレヌダヌがプレむした日数の予枬にコストをかけるこずができたす。 次のようになりたす。



画像



x軞は日数を衚し、y軞は遞択されたフィヌチャの倀を衚したす。 壊れた曲線は4パヌセンタむル以䞋の同じ特城倀で、矎しい滑らかな曲線は近䌌倚項匏のグラフです。



倚項匏コヌドの近䌌
from numpy.polynomial import Polynomial as P class nlSolver(): def __init__(self): self.p=None def fit(self,f_x,f_y): self.p = P.fit(f_x, f_y, 4) return self def get_y_by_x(self,f_x): return self.p(f_x) def get_x_by_y(self,f_y,initial_x): res = max([r.real for r in (self.p - f_y).roots()]) return res
      
      







このようにしおさらに3぀の属性を取埗した埌、圌はそれぞれの新しい機胜の初期機胜プレヌダヌがゲヌムに費やした日数を陀くを正芏化したため、機胜の合蚈数は4倍に増加したした。 たずえば、次のような機胜を開発しお远加したした。



 ... X['positiviness'] = X.totalStarsCount*X.totalBonusScore*X.usefulBoosters X['winDesire'] = X.attemptsPerDay*X.numberOfBoostersUsed*X.attemptsOnTheHighestLevel X['positivinessPerWinDesire'] = X.positiviness/(X.winDesire+1) ...
      
      





さらに、蚘号の数の増加を考慮しお、圌は2次蚘号を生成せず、利甚可胜なものから最良の特城を遞択し、アンサンブルを蚓緎し、最終的には120䜍から䞊昇しお60䜍になりたした。



Sklearnのロゞスティック回垰は、vowpal wabbitの確率的実装に眮き換えられたした私自身の執筆のPythonラッパヌを䜿甚したしたが、それに぀いお、間隔に機胜゚ンコヌドを䜿甚するずいうアむデアを攟棄し、クロス怜蚌ログの結果をわずかに改善したしたここで盞互予枬の結果を埗るための束葉杖もほずんどありたせんでした。 なぜなら vwがすでに関䞎しおいるので、なぜそこからパヌセプトロンを䜿甚しないのか--nnフラグ-したがっお、別の分類子がアンサンブルに远加されたした。



さお、vwのパヌセプトロンが関係しおいたので、MLPClassifierを䜿甚しないのはなぜですか。



その埌、ランダムフォレストに基づく2぀の分類噚がアンサンブルに远加されたした。 それらのうちの1぀は、特城の倀すべおの䟋、1パヌセンタむル以䞋および99目以䞊が分類子のトレヌニングに参加しなかった特城の倀に埓っお毎日偏差が陀去されたサンプルでトレヌニングされたした。



合蚈で、競争の終わりたでに、アンサンブルは7぀の分類子で構成されおいたした。 これすべおのために通垞の盞互怜蚌スキヌムを䜜成し、倚くの苊劎をしない方法は 構築スキヌムは次のずおりです。





最埌の仕䞊げ
-サンプルは、同じ機胜セットを持぀サンプルを芋぀けたしたが、タヌゲット倉数の倀が異なりたす。 このようなサンプルの堎合、確率予枬は、正の䟋の数ず負の䟋の数の比ずしお蚈算されたしたこれにより、察数損倱が最小限に抑えられたす。玙に曞き留めお確認できたす。

-「すべおを远加しお分類子の数で陀算する」代わりに、各分類子の結果に独自の遞択された重みを远加し、重みの合蚈で陀算したす。 分類子の1぀の係数を倉曎する必芁はありたせん。この方法でスケヌルを修正し、盞互怜蚌の結果が枛少するたで残りの係数で「再生」したす。 0.0005-0.0007の改善は、手䜜業ですぐに芋぀かりたす手䜜業で行うこずはできたせんが、回垰によっお重量を拟いたす。



最終日



最終日、゜リュヌションが既に組み立おられお送信されたずき、私の最高の結果は37䜍で公開され、クロス怜蚌ではログロス0.37906093が埗られたした。 2䜍になったこずは、Skypeでの友人のメッセヌゞから孊んだ。 私はそれが冗談だず​​思ったが、サむトに行くず、それは本圓に真実だず確信した。



画像



圹に立぀ヒント



「有甚」ずいう蚀葉は意図的に匕甚笊で囲たれおいたす。 それらのほずんどは、機械孊習コンテストでの勝利に関するすべおのストヌリヌで耇数回発芋されおいたす。





謝蟞



Mail.ru、そしお玠晎らしいコンテストずギフトを提䟛しおくれたIlya Stytsenkoず圌のチヌムに感謝したす。 競争の䞭で私の友人やラむバルにそしおそれだけでなく圌らのサポヌト/話す/盞談し、意芋を共有する機䌚に深い感謝を衚明したす。 あなたの忍耐ず忍耐に再び感謝したす。



All Articles