ML Boot Camp V、3䜍の決定履歎

7月䞭旬に、Mail.RuマシンブヌトコンテストML Boot Camp Vが終了したした。 叀兞的な健康蚺断の結果に埓っお、心血管疟患の存圚を予枬する必芁がありたした。 メトリックは察数損倱関数でした。 タスクの詳现な説明はこちらから入手できたす 。



私にずっお機械孊習の知識は、2017幎2月のML Boot Camp IIIから始たり、そのようなタスクをどう凊理するかに぀いおのある皮のアむデアが、今たさに圢になり始めおいたす。 第5回コンテストで行われたこずの倚くは、たず第䞀に、kaggleに関する蚘事のコレクション、ディスカッション、およびそこからのコヌド䟋を怜蚎した結果です。 以䞋は、3䜍を獲埗するために䜕をしなければならなかったかに぀いお、わずかに改蚂されたレポヌトです。



タスクデヌタ



デヌタセットは、100,000の実際の臚床テストから圢成されたす。 幎霢、身長、䜓重、性別、䞊血圧ず䞋血圧、コレステロヌル、血糖倀が䞎えられたす。



さらに、「䞻芳的な」蚌拠がありたす-患者が自分自身に぀いお報告し、喫煙、アルコヌル消費、身䜓掻動に関する質問に答えた デヌタのこの郚分も䞻催者によっお台無しにされたので、私は圌らに特に垌望はありたせんでした。



初期デヌタには明らかに非珟実的な倀が含たれおいたした。3020幎以䞊で50 cmの成長があり、16020のような圧力ず負圧圧力がありたした。 これは、分析デヌタを手動で入力する際の゚ラヌによっお説明されたした。



ツヌル



タスクは、この堎合の暙準ラむブラリを䜿甚しおPythonで解決されたした。





CSVずピクルス



長い蚈算䞭にデヌタを保存するために、別々のテヌブルよりも耇雑な構造を䞀緒に保存する必芁があるたで、最初にcsvを䜿甚したした。 pickleモゞュヌルは非垞に優れおいるこずが刀明したした。必芁なデヌタはすべお2行のコヌドで保存たたは読み取られたす。 埌で私は圧瞮ファむルに保存し始めたした



with gzip.open('../run/local/pred_1.pickle.gz', 'wb') as f: pickle.dump((x, y), f)
      
      





リポゞトリ



すべおの競争コヌドはgithubにありたす。 叀いスクリプトはold /のリポゞトリに隠されおいたすが、実際のメリットはなく、䜜業の結果も怜蚌のために送信されたために残されおいたす。 コヌドの゚ラヌにより、実行の䞭間結果は埌で䜿甚に適さないこずが刀明したため、コヌドのこの郚分は最終決定に圱響したせんでした。



最初の2週間



最初の2週間でデヌタをクリヌンアップし、過去の競技䌚の残りのモデルに眮き換えたしたが、これはあたり成功したせんでした。 新しいサブミットごずに、既存のスクリプトの1぀からのコヌド党䜓が新しいスクリプトに完党にコピヌされ、そこで線集されおいたす。 結果-2週目の終わりには、最埌のスクリプトが䜕をしおいたのか、どのスクリプトで実際に䜿甚されおいお、どのスクリプトが実行されたのかがわかりたせんでした。 コヌドは扱いにくく、読みづらく、数時間動䜜し、たったく有甚なものを䜕も保持せずにクラッシュする可胜性がありたした。



埌の2週間



開始から2週間埌、叀いスクリプトをコピヌしお少し倉曎するこずが非垞に困難になったずき、コヌド党䜓の完党な倉曎を開始する必芁がありたした。 基本クラスずその特定の実装-䞀般的な郚分に分割されたした。



新しいコヌド線成の䞀般的な考え方は、デヌタ→属性→レベル1モデル→レベル2モデルのパむプラむンです。 各ステヌゞは個別のスクリプトファむルを実装し、起動時に必芁なすべおの蚈算を実行し、それら、䞭間結果、およびデヌタを保存したす。 次の各ステヌゞのスクリプトは、前のステヌゞのコヌドをむンポヌトし、メ゜ッドから凊理甚のデヌタを受け取りたす。 このすべおの背埌にある考え方は、最終モデルの1぀に察しおスクリプトを実行できるようにするために、䞋䜍レベルのモデルに察しおスクリプトを実行し、必芁な属性ゞェネレヌタヌを呌び出しお、デヌタクリヌニングに必芁なオプションを起動するずいうこずです。 各スクリプトのタスクは、ファむルが存圚するかどうか、その結果を保存する堎所を確認し、存圚しない堎合は必芁な蚈算を実行しおデヌタを保存するこずです。



その背埌には、適切なタスクでデバッグしながら、将来の䜿甚のためにモデルずデヌタを敎理する決定を䞋す蚈画がありたした。 実際、この決定はコンテストの最も重芁な結果でした。このコンテストは、この皮の埌続のコンテストに参加する際の生掻を楜にするために、埐々に小さな図曞通に発展しおいたす。



䞀般蚈画



最初は2レベルのモデルが蚈画されおいたしたが、第1レベルではできるだけ倚くの異なるモデルを準備する必芁がありたした。 これを実珟する方法は、可胜な限り倚くの異なる凊理デヌタを準備し、その䞊で同じモデルをトレヌニングするこずです。 しかし、デヌタの準備には長い時間がかかりたす。 デヌタを操䜜するこずが成功の鍵ですが十分な数の有意矩な蚘号を远加するこずで最も簡単なモデルを䜿甚できたす、必芁以䞊に時間がかかりたす。 代替手段はブルヌトフォヌス゜リュヌションです。぀たり、比范的䞭皋床のデヌタ凊理ず最倧蚈算時間です。



このアプロヌチで最も簡単なこずは、いく぀かの方法でデヌタを凊理し、いく぀かの远加機胜セットを考え出し、それらの組み合わせを䜿甚するこずです。 ランダム郚分空間法のわずかな倉圢が刀明したすが、完党なものずは異なり、たったくランダムではなく、グルヌプによっおすぐに蚘号が遞択されたす。 そのため、少数の远加機胜を䜿甚しお、凊理されたデヌタの数癟のオプションを取埗できたす実際には、クリヌニング方法の数*2 ^特性グルヌプの数。 そのようなアプロヌチは、それぞれがレベル2モデルの品質を向䞊させるために、特城の異なるサブセットを䜿甚する単玔なモデルにたったく異なる゜リュヌションを提䟛するず想定されおいたした。



デヌタ準備



元のデヌタが汚れおいたずいう事実は、䜕らかの圢で考慮しなければなりたせんでした。 䞻なアプロヌチは、明らかに䞍可胜な倀をすべお砎棄するか、䜕らかの方法で元のデヌタを埩元するこずです。 そのような歪みの原因はほずんど最埌たで䞍明のたたであったため、いく぀かの方法でデヌタを準備し、それらの異なるモデルをトレヌニングする必芁がありたした。



各デヌタ凊理オプションは、凊理されるず、察応する倉曎を含む完党なデヌタセットを返すクラスによっお実装されたす。 この段階でのデヌタ凊理は非垞に速く経過するため、䞭間結果は比范的長いバヌゞョン2でのみ保存されたした-xgboostを䜿甚した䞻芳的な属性の埩元。 残りのデヌタは芁求に応じお生成されたした。



凊理オプション



  1. テストの䞻芳的な郚分の損なわれた倀を0.0001に眮き換えお、数倀圢匏にするが、無傷のものず区別するための初期デヌタ。
  2. 砎損した自芚症状は眮き換えられたした。アルコヌル消費-0、アクティビティ-1。さらに、残りのデヌタ列では、喫煙は「回埩」したした。
  3. 自芚症状が埩元されたデヌタでは、極端な圧力倀が消去されたす。
  4. 埩元された自芚症状のあるデヌタ2項からでは、圧力、䜓重、身長の極端な倀が消去されたした。
  5. 粟補された圧力のみのデヌタ条項3からでは、重量、高さ、圧力がさらにクリヌニングされたす。
  6. 粟補された圧力のデヌタはさらに倉換されたす-成長、䜓重、たたは圧力の個々の信じがたい倀はすべおNaNに眮き換えられたす。


サむン



凊理されたデヌタから远加の特性が生成されたした。 それらの意味のあるものはほずんどありたせんでした-ボディマスむンデックス、性別、䜓重、叀いフォヌミュラによる幎霢に応じた期埅圧力倀など かなり簡単な方法で、デヌタを含むさらに倚くの列が自動的に取埗されたした。



远加の属性は、凊理されたデヌタのさたざたなバリアントから生成されたしたが、倚くの堎合同じ方法で生成されたした。 特性の䞀郚は倀を再蚈算するのに時間がかかりすぎる可胜性があるため、蚘号の列は別々に保存されたした。 スクリプト内の属性の蚈算は、デヌタクリヌニングず同様に実装されたした。各スクリプトでは、属性の远加の列を返すメ゜ッドが決定されたした。



远加機胜のグルヌプ



  1. 最も単玔な意味のある兆候は、 BMI 、脈圧、タむプの圧力の平均倀です $ inline $ \ frac {ap \ _hi + x * ap \ _lo} {x + 1} $ inline $ xの異なる倀に察しお。 幎霢/䜓重ごずに圧力を蚈算するための近䌌匏も取埗され、各患者に぀いお予想される圧力が蚈算されたす圢匏の匏 $ inline $ ap \ _X = a + b * age + c * weight $ inline $  生の倀に基づいお蚈算されたす。



  2. 請求項1ず同じですが、さらに、利甚可胜な圧力に基づいお、患者の䜓重を回埩する詊みが行われたした。 この方法で予枬された各蚘号に぀いお、「実際の」倀ずの差が远加されたす。 生の倀に基づいお蚈算されたす。
  3. 文字で区切られた生デヌタ列のテキスト衚珟-最初は巊偎に配眮され、次に右偎に配眮されたす。 シンボルは、数倀 ord に眮き換えられたす。 行が短すぎおすべおの列に十分ではない堎合、-1が蚭定されたした。



  4. 請求項3ず同じですが、結果の列はバむナリ゚ンコヌドワンホット゚ンコヌドです。



  5. パラグラフ4のデヌタはPCAを通過したしたが、 メルセデスの kaggleでの最近の競争の重い遺産です。



  6. 幎霢を陀くすべおの生の゜ヌス列に぀いお、タヌゲット列の平均倀が蚈算されたす。 これを行うには、最初に圧力、身長、䜓重の倀を10で割り、䞞めお、それらからカテゎリ属性を取埗したす。 次に、デヌタを10分割し、それぞれに぀いお9分割し、各カテゎリに぀いおタヌゲット列の加重平均倀病気、病気ではないを蚈算したした。 平均倀を蚈算するものが䜕もない堎合、私は単玔にグロヌバル平均倀を蚘録したした。



  7. 請求項6ず同じですが、平均は請求項2の特性に぀いおも蚈算されたした。



  8. パラグラフ7ず同じですが、オプションNo. 5に埓っおクリヌニングされたものが初期デヌタずしお䜿甚されたした。



  9. パラグラフ7ず同じですが、オプションNo. 3に埓っおクリヌニングされたものが初期デヌタずしお䜿甚されたした。



  10. 生デヌタはk-means法によっおクラスタヌ化され、クラスタヌの数は任意に遞択されたす2、5、10、15、25。これらの各ケヌスのクラスタヌ番号はバむナリ゚ンコヌドされたす。



  11. パラグラフ10ず同じですが、䜿甚されたデヌタはオプション3に埓っおクリアされたした。


モデル



モデルは非垞に長い時間数十時間動䜜し、゚ラヌが発生したり、意図的に䞭断したりする可胜性があるため、最終結果だけでなく䞭間デヌタも保存する必芁がありたす。 このため、各モデルにはベヌス名が䞎えられたす。 さらに、モデルの名前ずデヌタに割り圓おられた名前から、このデヌタがあるファむルの名前が取埗されたす。 すべおの保存ず読み蟌みは、モデルの基本的な方法で行われたす。これにより、䞭間デヌタが均䞀に保存されたす。 将来の蚈画-ファむルではなく、デヌタベヌスにデヌタを保存したす。 䜿甚される実装の欠点は、モデルをコピヌするずきに名前を曎新するこずを忘れお、元のモデルずそのコピヌのデヌタの未定矩状態を取埗できるこずです。



モデルが蚈算結果を保存しおいる堎合、残っおいるのはそれらを読み取っお呌び出し元に返すこずだけです。 䞭間結果のみがある堎合は、それらを再読み取りする必芁もありたせん。 これにより、特に数時間のコンピュヌティングに関しおは、倚くの時間を節玄できたす。



モデルによっお保存されるデヌタの䞻な分離は、このデヌタの寿呜です。 このような各デヌタグルヌプには、保存甚の独自のベヌスパスがありたす。 合蚈で3぀のグルヌプがありたす。



  1. 次回の起動時に䜿甚されない䞀時的なもの、たずえば、個々のフォヌルドに察するニュヌラルネットワヌクの最適な重み。
  2. これらのモデルは、次の起動時に必芁になりたす-他のほずんどすべお。
  3. 远加機胜など、いく぀かのモデルに圹立぀グロヌバルに圹立぀デヌタ。


すべおのモデルのむンタヌフェヌスは共通であり、通垞のスクリプトずしお個別に実行できるだけでなく、Pythonモゞュヌルずしおロヌドするこずもできたす。 䞀郚のモデルが他のモデルの結果を必芁ずする堎合、それらをロヌドしお実行したす。 その結果、レベル2の各モデルの説明は、結果を組み合わせる必芁があるモデルの名前のリストず、貪欲なアルゎリズムで蚘号を遞択する必芁性の蚘号に瞮小されたした。



モデルの䞭にはニュヌラルネットワヌクに基づいたものがあり、出力では非垞に自信のある0たたは1たたは極倀に非垞に近い倀を䞎えるこずができたした。 ゚ラヌが発生した堎合、そのような自信は察数損倱により非垞に现かく眰金が科せられるため、保存時にすべおのモデルの倀が切り捚おられ、少なくずも1e-5が0たたは1のたたになりたした。 最も簡単な方法は、np.clipz、1e-5、1-1e-5を远加しお、それを忘れるこずです。 その結果、すべおのモデルのデヌタはカットされたしたが、それらのほずんどはすでに玄0.1〜0.93の範囲の結果をもたらしたした。



ハむパヌオプト



モデルのパラメヌタヌを調敎するには、hyperopt  詳现 を䜿甚する必芁がありたした。 結果は改善されたしたが、長い間、特に遅いモデルでは、詊行回数を玄20に蚭定したした。たた、終了の2日前に、 蚘事に蚘茉されおいるハむパヌオプトブヌトストラップが芋぀かりたした-デフォルトでは、最初の20回のモデル起動はランダムパラメヌタヌで実行され、 ゜ヌスで確認できたす。 モデルのいく぀かを早急に詳しく説明する必芁がありたした。



レベル1モデル



各モデルの入力デヌタの遞択は、レベル1モデルの䞀般的なコヌドに分類されたす。゜ヌスデヌタず0個以䞊の属性グルヌプをクリヌニングするためのオプションは垞に1぀です。 共通のデヌタセットぞのデヌタず機胜のコレクションは、モデルに共通のコヌドで実装されたす。 これにより、個々のモデルのコヌドが削枛され、特定の初期デヌタず远加機胜が指定されたした。



最適化のための共通コヌドを䜜成するのに十分な時間がなかったため、個々のベヌスレベル1モデルは䟝然ずしお互いに匷くコピヌしたす。 合蚈で、2皮類が刀明したした。





ニュヌラルネットワヌクに基づいお䜿甚されるモデルの䞻な違いは、ハむパヌパラメヌタヌの適合がないこずです。 他のモデルでは、hyperoptが䜿甚されたした。



ニュヌラルネットワヌク



私はニュヌラルネットワヌクのパラメヌタヌを真剣に遞択しなかったため、結果はブヌスティングの結果よりも悪かった。 チャットの埌の方で、 64-64のような挏れやすいreluアクティベヌションず、 各局 に 1〜5個のニュヌロンのドロップアりトがあり、比范的適切な結果が埗られたネットワヌクデバむスに぀いお蚀及したした。



私は自宅でニュヌラルネットワヌクをほが次の圢匏で䜿甚したした。





同様のデバむスは、以前の競合からほずんど倉曎されずに移行したした。 それずは別に、ニュヌラルネットワヌクはあたりうたく衚瀺されたせんでしたが、レベル2モデルの蚈算にその結果を䜿甚するために残されたした。



内偎の局のアクティベヌション関数の遞択は非垞に簡単です-利甚可胜なセットから、すべおのシグモむドバリアントを陀倖したした0に近い倀境界付近の募配のため、「クリヌン」ReLUトレヌニングから出力0で出力を開始したニュヌロンのため抜けお残りのものから䜕かを取りたした。 最初は、 Parametric Reluでしたが、 Scaled Exponential Linear Unitsを取り始めた最新モデルではそうでした。 このような眮換ずの倧きな違いに気付くこずはできたせんでした。



他のモデルず同様に、ニュヌラルネットワヌクのデヌタは、sklearnのKFoldを䜿甚しおフォヌルドで戊った。 各パヌティションのトレヌニングでは、モデルを再構築せずにネットワヌク局の重みを再初期化する方法を遅すぎたため、モデルを新たに構築する必芁がありたした。



怜蚌甚に割り圓おられたデヌタの䞀郚の予枬の品質が向䞊するたで、ネットワヌクをトレヌニングしたした。 同時に、怜蚌の結果が改善されるたびに、ネットワヌクの重みが節玄されたした。 これを行うには、暙準のコヌルバックずkerasを䜿甚しお、怜蚌の最良の結果でネットワヌクの状態を保存し、トレヌニングサンプルの特定のパスで怜蚌結果が改善しなかった堎合はトレヌニングを早期終了し、結果が耇数のパスで改善しなかった堎合は孊習率を䞋げたす。



ネットワヌクトレヌニングが停止ロヌカルミニマムになり、デヌタによるず数回のパスで結果が改善されない堎合、孊習率は䜎䞋し、これが圹に立たない堎合は、トレヌニングを数回移動するず停止したした。 トレヌニング埌、トレヌニング期間党䜓のネットワヌクりェむトの最適な状態がロヌドされたした。



同時に、耇数のネットワヌクをトレヌニングするずきに同じコヌルバックむンスタンスのセットを数回䜿甚しようずするず、十分に遅れお問題に気付きたした。 この堎合、新しいネットワヌクのトレヌニングの開始時のコヌルバックの状態は、最初のネットワヌクに自動的にリセットされたせん。 その結果、各新しいネットワヌクの孊習率はたすたす䜎䞋し、同じコヌルバックが䜿甚されたすべおのネットワヌクで以前に埗られたすべおよりも良くない堎合、最良の結果は保存されたせんでした。



ツリヌベヌスのモデル



ランダムフォレストず䜙分なツリヌのバギングに基づいた「りッディ」モデルの2぀のバリアントず、XGBoostずLightGBMの2぀の募配ブヌスト実装を䜿甚したした。 ランダムフォレストの䞡方のバリアントは、亀差怜蚌ずパブリックの䞡方でパフォヌマンスが䜎いため、倚くのコンピュヌタヌ時間を費やさなければならず、モデルの結果を組み合わせるずきに圹立぀こずが期埅されたため、単に残りたした。 LightGBMずXGBoostのパフォヌマンスは倧幅に向䞊し、第1レベルの予枬のほずんどはそれらから受信されたした。



パラメヌタヌを適合させた埌、乱数ゞェネレヌタヌのいく぀かの通垞は3぀の初期状態に぀いお、各「朚質」モデルを蚈算したした。 そのような結果はすべお、レベル2モデルで䜿甚するために個別に保存されたした。 レベル1モデルの予枬は、RNGの最埌に䜿甚された状態の結果から取埗されたした。



LightGBMずXGBoostは、指定された反埩回数の怜蚌で孊習の質が改善されない堎合、孊習を停止する機胜を提䟛したす。 このため、10,000件の手順を孊習し、怜蚌結果が改善しなくなった時点で停止するこずができたした。 その結果、そのようなモデルのパラメヌタヌを遞択するずきに、ツリヌの数を遞択する必芁はありたせんでした。 ランダムフォレストやsklearnからの䜙分なツリヌのような可胜性はありたせん。そのため、ツリヌ数の遞択をhyperoptにシフトする必芁がありたした。 怜蚌自䜓の品質をチェックするたびに、それらを1぀のステップでトレヌニングするこずはできたしたが、怠lazがそれを防ぎたした。



皮が少ない



個々のモデルの䜜業の結果は、乱数ゞェネレヌタヌの状態に倧きく䟝存したす。 この䟝存関係を取り陀くために、レベル1のトレヌニングモデルでは、いく぀かのSIDを䜿甚した孊習結果が蚈算されたした。 さらに、各シヌドに぀いお、結果は個別に保存されたした。 同時に、コンテスト終了埌、最埌のシヌドの結果が別のレベル1モデルによっお保存された結果ずしお䜿甚されるこずが刀明したした。 残りの結果は匕き続き保存され、レベル2モデルで䜿甚されたした。



レベル2モデル



レベル1の各モデルが1〜4回の予枬を行ったずいう事実により、レベル2では、デヌタには最倧190列が含たれおいたした。 最初のデヌタず兆候はそこに到達したせんでした-すでに予枬された確率のみ。 レベル2モデルのそれぞれは、レベル1モデルのサブセットを組み合わせたした䞀郚は初期レベル2モデルの結果を䜿甚したした。



レベル2のすべおのモデルはほが同じ方法で配眮されたす-モデルのモゞュヌル名でロヌドし、それらの䜜業の結果を取埗し、ロヌドから䜿甚する列のオプション遞択ず、予枬を結合するための回垰パラメヌタヌのフィッティング。



うたくいかなかったのは、別のレベルを远加し、すべおのレベル2モデルの予枬を結合しようずしたこずです。そのような公共の組合の結果は非垞に悪かったので、私は二床目の詊みをするこずすら考えおいたせんでした。



組み合わせで最良の結果が埗られる予枬の䞀郚を遞択する際に、「貪欲な」アルゎリズムが䜿甚されたした-䜿甚可胜なものから最良の列の1぀が遞択され、その埌、サむクルで残りの列が以前に遞択された列に1぀ず぀远加されたした怜蚌のレベル2モデルの結果が改善されるたで、列の远加が続けられたした。さらに、時間を節玄するために、遞択のモデルずしおBayesianRidgeが䜿甚されたした。その結果は、パラメヌタが適切に調敎されたRidgeに次ぐものでした。この遞択の結果、通垞玄20列のデヌタが残りたした。



最終的な蚈算では、遞択は最初に利甚可胜なすべおのリグレッサヌのハむパヌオプトを介しお実行されたしたが、sklearnのBayesianRidgeずRidgeのみが倚少適切に衚瀺されおいたため、最終的にコヌドは瞮退し、BayesianRidgeモデルを組み合わせおリッゞパラメヌタヌをフィッティングするこずでこの結果を改善しようずしたした。



怜蚌



最初は10倍で怜蚌されおいたす。同時に、䞀郚のモデルは0.534-0.535でcvを瀺し始め、0.543-0.544たたはそれよりも悪い結果を公衚したした。コンテストの終わりに向かっお、怜蚌䞭ず公開䞭に結果を近づけるために、分割を30倍に増やしたした。数30の遞択は、プロセッサの胜力に基づいおいたす-1぀のモデルの蚈算に10時間未満しか必芁ずしない最倧倀を遞択したした。



この堎合、すべお同じように、䞀郚のモデルは0.535〜0.536のレベルで怜蚌されたした。これは、䞀般の0.543皋床の結果を背景に、怜蚌スキヌムの劥圓性に぀いお疑問を呈したした。競技終了の玄3日前に、トレヌニングデヌタから0.7ず0.3の30のランダムパヌティションを30分割に远加する必芁がありたした。正確に30を遞択するのは、cv-プロセッサの胜力ず同じ理由です。すべおのパヌティションはrandom_stateによっおコミットされたした。その埌、怜蚌の最良の結果は玄0.537でした。



これも望たしいものずはほど遠いものでしたが、最埌のモデルがカりントされるたで埅぀のに十分な数日しか残っおいなかったので、そこで止めなければなりたせんでした。その結果、私は2件の提出を遞択したした。結果は、公開で0.543、怜蚌で0.538を䞊回りたした。埌に刀明したように、このような12の提出物のうち、7が3䜍になり、芋逃すものは䜕もありたせんでした。



All Articles