
* 農場 -(英語の農業から)-特定の目的(経験の獲得、リソースの取得など)のための特定のゲームアクションの長く退屈な繰り返し。
はじめに
最近(10月1日)、 優れたDS / MLコースの新しいセッションが開始されました(現在の呼び名であるように、DSを初期コースとして「入力」したい人を強くお勧めします)。 そして、いつものように、コースを修了した後、卒業生には疑問があります-まだ生の理論的知識を統合するために、どこで実際の経験を得るべきか。 プロフィールフォーラムでこの質問をすると、答えはおそらく1つになります。Kaggleを解決してください。 Kaggleはイエスですが、どこから始めて、実用的なスキルを得るためにこのプラットフォームを最も効果的に使用するか? この記事では、著者は自分の経験でこれらの質問に答えるとともに、競争力のあるDSの分野での主なレーキの位置を説明して、ポンピングプロセスを高速化し、ファンを獲得します。
作成者からのコースに関するいくつかの言葉:
mlcourse.aiコースは、OpenDataScienceコミュニティの大規模なアクティビティの1つです。 @yorkoと会社(〜60人)は、クールなスキルが大学の外で、さらには完全に無料で得られることを実証しています。 コースの主なアイデアは、理論と実践の最適な組み合わせです。 一方で、基本的な概念の提示は数学なしでは行われませんが、一方で、宿題の多く、Kaggle Inclassのコンテストやプロジェクトは、エネルギーの一定の投資で、優れた機械学習スキルを提供します。 コースの競争的性質に注意することは不可能です-学生の一般的な評価が実施されており、それが強く動機付けられています。 このコースは、本当に活気のあるコミュニティで行われるという点でも異なります。
コースの一環として、2つのKaggle Inclassコンテストがあります。 どちらも非常に興味深いもので、標識の作成に適しています。 最初は訪問されたサイトの系列によるユーザ識別です。 2つ目は、メディア上の記事の人気の予測です 。 主な利点は、2つの宿題から得られることです。そこでは、賢く、これらの競技会のベースラインを破る必要があります。
コースとその作成者に敬意を表して、私たちは物語を続けます...
私は1年半前に自分自身を覚えています。 アンドリューNgからのコース(まだ最初のバージョン)が完了し、モスクワ物理学技術研究所からの専門化が完了し 、書籍の山が読まれました-理論の頭は知識に満ちていますが、基本的な戦闘タスクを解決しようとすると、st迷が生じます。 いいえ、問題を解決する方法-適用するアルゴリズムは明らかです-も理解できますが、sklearn / pandasヘルプが毎分アクセスするなど、コードを書くのは非常に困難です その理由-パイプラインが蓄積されておらず、「指先で」コードの感覚があります。
これは機能しないと著者は考え、Kaggleに行きました。 戦闘競技からすぐに始めるのは怖かったです。そして、入門競技「 ハウス価格:高度な回帰技術 」が最初の兆候となり、この記事で説明されている効果的なポンピングへのアプローチを形成しました。
後で説明するものでは、ノウハウはなく、すべての手法、方法、および手法は明白で予測可能ですが、これはそれらの有効性を損なうものではありません。 少なくとも、彼らに続いて、著者はKaggleコンペティションマスターを6か月間、ソロモードで3つのコンペティションで死ぬことに成功し、この記事の執筆時点で、Kaggleワールドレーティングのトップ200に入りました。 ところで、これは著者がこの種の記事を書く勇気さえ自分に与えた理由についての質問に答えます。
一言で言えば、Kaggleとは

Kaggleは、データサイエンスのコンテストを開催するための最も有名なプラットフォームの1つです。各コンテストでは、主催者が問題の説明、この問題を解決するためのデータ、ソリューションの評価基準、および期限と賞品をアップロードします。 参加者には、1日あたり3〜5回(主催者の意向により)の「送信」(独自のソリューションの送信)が試みられます。
データは、トレーニングサンプル(トレーニング)とテスト(テスト)に分けられます。 トレーニング部分では、ターゲット変数の値は既知ですが、テスト部分では不明です。 参加者のタスクは、データのトレーニング部分でトレーニングされ、テストで最大の結果をもたらすモデルを作成することです。
各参加者はテストサンプルの予測を行い、結果をKaggleに送信します。その後、ロボット(テストのターゲット変数を知っている)は送信された結果を評価し、リーダーボードに表示されます。
しかし、すべてがそれほど単純ではありません。テストデータは、特定の割合でパブリック(パブリック)とプライベート(プライベート)の部分に分割されます。 競技中、主催者が設定した指標に従って、送信された決定がデータの公開部分で評価され、リーダーボード(いわゆる公開リーダーボード)にレイアウトされます。これにより、参加者はモデルの品質を評価できます。 最終決定(通常は2-参加者の選択による)は、テストデータの非公開部分で評価され、結果は非公開リーダーボードに表示されます。これは、競技の終了後にのみ利用でき、実際には最終結果が評価され、賞品、バンズ、メダルが配布されます
したがって、競技中、参加者はテストデータの公開部分でモデルがどのように振る舞うのか(結果はすぐにわかりました)、情報のみが利用できます。 真空中の球形の馬の場合、データの私的部分の分布と統計が公衆と一致する場合-そうでない場合はすべてがうまくいきます-公の場でうまく機能したモデルは、私的部分で機能しない可能性があります、つまり、オーバーフィックス(再トレーニング)です。 そして、ここでは、専門用語で「フライング」と呼ばれるものが発生します。これは、選択したモデルが再訓練され、必要な精度を与えることができなかったために、公共の10新しいデータ。

これを避ける方法は? このためには、まず、正しい検証スキームを構築する必要があります。これは、ほとんどすべてのDSコースの最初のレッスンで教えられています。 なぜなら モデルがこれまでに見たことのないデータの正しい予測を行うことができない場合-どんな複雑なニューラルネットワークを構築する場合でも、使用する高度な技術に関係なく-生産では、そのようなモデルは生産できません その結果は価値がありません。
Kaggleの各コンペティションごとに、メトリックの説明(および私たちにとって最も興味深い)のフォーラムとカーネルを含むデータのセクションがある個別のページが作成されます。
彼とKaggleフォーラムのフォーラムでは、人々がアイデアを書き、議論し、共有しています。 しかし、カーネルはすでにより興味深いものです。 実際、これは、Kaggleクラウドの競合データ(Amazonian AWS、GoogleのGCEなど)に直接アクセスする独自のコードを実行する機能です。限られたリソースが各カーネルに割り当てられるため、データが少ない場合は、それらを使用すると、Kaggle Webサイトのブラウザーから直接、コードを記述して実行し、結果を送信できます。 2年前に、KaggleはGoogleに買収されたため、この機能がGoogle Cloud Engineを「内部」で使用することは驚くことではありません。
さらに、いくつかのコンペティション(最近-Mercari )がありました。そこでは一般にカーネルを介してのみデータを操作できました。 非常に興味深い形式で、参加者間のハードウェアの違いを平準化し、コードとアプローチの最適化のために脳をオンにすることを強制します。これは、当然のことながら、その時点でカーネルは4コア/ 16 GB RAM / 60分間の厳しいリソース制限があったため/ 1 GBのスクラッチと出力ディスクスペース。 この競争に取り組んでいる間、著者は理論的なコースよりもニューラルネットワークの最適化について多くを学びました。 金だけでは十分ではなく、23日にソロを終えたが、かなりの経験と喜びを得た...
この機会に、 ods.aiの同僚であるアーサーステパネンコ(アーサー) 、 コンスタンチンロプキン(コスティア) 、 セルゲイフィロノフ(セルゲイフ)に、このコンテストでのアドバイスとサポートに感謝します。 一般に、 PawełJankiewiczで 1位になったKonstantin Lopukhin(kostia)は、多くの興味深い点があり、チャットルームで「 75行の標準的な屈辱 」と呼ばれるものをレイアウトしました。リーダーボードのゴールデンゾーンに結果を出力する75行のコードのカーネルです。 これは、もちろん見なければなりません:)
さて、気が散るなど、人々はコードを書き、カーネルにソリューション、興味深いアイデアなどを配置します。 通常、各競争では、数週間後に、データセット、統計、特性などの詳細な説明とともに、1つまたは2つの優れたカーネルEDA(探索的データ分析)が表示されます。 もちろん、リーダーボードに最良の結果を表示しないベースライン(基本ソリューション)がいくつかありますが、独自のソリューションを作成するための出発点として使用できます。
なぜKaggleなのか?

実際、どのプラットフォームでプレイする場合でも、Kaggleは最初で最も宣伝されたものの1つであり、優れたコミュニティと非常に快適な環境を備えています(安定性とパフォーマンスのためにカーネルを改良することを望みます。そうでなければ、多くの人がMercari )しかし、一般的に、プラットフォームは非常に便利で自給自足であり、そのサイコロはまだ高く評価されています。
競争力のあるDSのトピックに関する一般的な小さな余談。 非常に多くの場合、記事、会話、その他のコミュニケーションでは、考えはこれはすべてでたらめであり、競技の経験は実際のタスクとは無関係であり、そこの人々は狂気と離婚している小数点第5位の調整に従事しています現実。 この問題をもう少し詳しく見てみましょう。
学問や科学とは異なり、DSスペシャリストの実践として、私たちの仕事では、ビジネス上の問題を解決しなければなりません。 それは(ここにCRISP-DMへの参照があります)タスクを解決するために必要です:
- ビジネス上の課題を理解する
- このビジネスタスクへの答えが隠されているかもしれないかどうか、主題に関するデータを評価する
- 存在するだけでは答えが得られない場合、追加のデータを収集する
- ビジネス目標に最も近いメトリックを選択します
- その後、モデルを選択してから、選択したモデルにデータを変換し、「hgbustaを排出」します。 (C)
このリストの最初の4つのポイントはどこにも教えられていません(そのようなコースが表示された場合は修正してください-ためらうことなく登録します)。ここでは、この業界で働く同僚の経験からしか学ぶことができません。 しかし、最後のポイント-モデルの選択から始めて、競技会に参加することができます。
どのコンテストでも、私たちの仕事のほとんどは主催者によって行われました。 説明したビジネス目標があり、近似メトリックが選択され、データが収集されました。そして、私たちのタスクは、このすべてのレゴから作業パイプラインを構築することです。 そして、ここではスキルが強化されます-パスの操作方法、ニューラルネットワークとツリーのデータの準備方法(およびニューラルネットワークが特別なアプローチを必要とする理由)、検証を正しく構築する方法、再訓練しない方法、ハイパーパラメーターの選択方法、方法.......十数個の「どのように」、その有能なパフォーマンスは、私たちの職業を通り抜ける人々から優秀な専門家を区別します。
Kaggleで「農場」できること

基本的に、これは合理的であり、すべての新参者がKaggleに来て実践的な経験を獲得しますが、これに加えて少なくとも2つの目標があることを忘れないでください:
- 農場のメダルとサイコロ
- Kaggleコミュニティでの農場の評判
覚えておくべき主なことは、これらの3つの目標は完全に異なり、それらを達成するために異なるアプローチが必要であり、特に初期段階でそれらを混同しないでください!
ポンピングの際に「初期段階」で強調されるのは何の理由でもありません-これら3つの目標は1つに統合され、並行して解決されますが、開始している間は、 それらを混ぜないでください ! このようにして、この不公平な世界での痛み、失望、resみを避けることができます。
ボトムアップで目標を簡単に見てみましょう。
- 評判 -フォーラムに良い投稿(およびコメント)を書いて、有用なカーネルを作成することで盛り上がりました。 たとえば、EDAカーネル(上記を参照)、非標準の手法を説明する投稿など。
- メダルは非常に物議を醸し、嫌いなトピックですが、まあまあです。 パブリックカーネル(*)をブレンドし、経験に偏りのあるチームに参加し、独自のトップパイプラインを作成することで強化されます。
- 経験 -意思決定の分析を通じて汲み上げられ、エラーに取り組みます。
(*) パブリックカーネルカーネルブレンディングは、パブリックリーダーボードで最大速度でレイアウトされたカーネルが選択され、その予測が平均化(ブレンド)され、結果が提出されるファームメダルテクニックです。 通常、この方法では、ハードオーバーフィット(トレーニングへの再トレーニング)およびプライベート飛行が行われますが、場合によっては、ほぼ銀色の服従を得ることができます。 著者は、初期段階では、同様のアプローチを推奨していません(ベルトとパンツについては以下をお読みください)。
最初の目標は、「経験」を選択し、同時に2つまたは3つの目標に取り組む準備ができたと感じる瞬間までそれを順守することです。
言及する価値のあるもう2つのポイントがあります(ウラジミール・イグロヴィコフ(テルナウス) -リマインダーをありがとう)。
1つ目は、Kaggleに投資した取り組みを、新しい、より興味深い、および/または高給の仕事場に転換することです。 Kaggleのサイコロをどのように平らにしたとしても、人々を理解するために、Kaggleコンペティションマスターの履歴書やその他の成果には価値があります。
この点を説明するために、同僚のセルゲイ・ムシンスキー(cepera_ang)とアレクサンダー・ブスラエフ(albu)との2つのインタビュー( 1、2 )を引用できます。
また、 Valery Babushkin ( venheads)の意見:
Valery Babushkin-X5 Retail Groupのデータサイエンスヘッド(現在のスタッフ数は30人+ 2019年から20人の空席)
Yandex Advisor分析グループの責任者
Kaggle Competition Masterは、将来のチームメンバーを評価するための優れたプロキシメトリックです。 もちろん、30人のチームと変装されていない機関車の形での最新のイベントに関連して、以前よりも少し徹底的なプロファイルの調査が必要ですが、これはまだ数分です。 高い確率でマスターの称号を獲得した人は、少なくとも中程度の品質のコードを書く方法を知っており、機械学習にかなり精通しており、データをクリーンアップし、安定したソリューションを構築する方法を知っています。 それでもマスターの舌を自慢できないなら、参加の事実もプラスです。少なくとも候補者はKaglの存在を知っており、怠けすぎず、マスターするのに時間を費やしていません。 そして、公開カーネル以外のものが起動され、結果のソリューションがその結果を超えた場合(検証は非常に簡単です)、これは技術的な詳細に関する詳細な議論の機会であり、古典的な理論の質問よりもはるかに優れており、興味深い答えです人が将来どのように仕事をするかについての理解が少ない。 DSの仕事はKaglのようなもので、根本的に間違っていると考える人がいるということを、私が恐れなければならない唯一のことです。 さらに多くの人がDS = MLと考えていますが、これも間違いです
2番目のポイントは、多くの問題の解決策をプレプリントまたは記事の形で組み立てることができることです。これにより、一方で、集団の心が競争中に生まれたという知識がフォーラムの荒野で死なないようにし、他方で著者のポートフォリオに別の行を追加します可視性への+1。いずれの場合も、キャリアと引用指数の両方にプラスの効果があります。
たとえば、いくつかのコンテストの結果に続く同僚の作品のリスト著者(アルファベット順):
アンドレイ・O.、イリヤ、アルブ、アレクサルト、alex.radionov、almln、alxndrkalinin、cepera_ang、dautovri、davydov、fartuk、golovanov、ikibardin、kes、mpavlov、mvakhrushev、n01z3、rakhlin、rauf、resutut、sitator、sitator、sitator、sitator snikolenko、ternaus、twoleggedeye、vs、vicident、zfturbo
メダルを失う痛みを避ける方法

得点する!
説明します。 ほぼすべての競争において、その終わりに近づき、リーダーボード全体を上にシフトするソリューションを備えたカーネルが公開されていますが、あなたにとっては、それに応じて決定を下します。 そして、フォーラムが痛みを始めるたびに! 銀について決定したのはどうしてですか、そして今は青銅さえ引っ張っていません。 元気?
覚えておいてください-Kaggleは競争力のあるDSです。 あなたがいるリーダーボード上の場所はあなた次第です。 カーネルをレイアウトした人からではなく、星が集まったかどうかではなく、ソリューションにどれだけの労力を費やしたか、そしてそれを改善するためにあらゆる方法を使用したかどうかだけから。
公開カーネルがリーダーボード上のあなたの場所からあなたをノックアウトした場合-これはあなたの場所ではありません。
世界の不正から痛みを注ぐ代わりに、この男に感謝します。 真剣に、あなたよりも優れたソリューションを備えた公開カーネルは、パイプラインで何かを見逃したことを意味します。 正確に何を見つけ、パイプラインを改善し、同じ速度でハムスターの群衆を一周します。 覚えておいて、あなたの場所に戻るには、この一般の人より少しだけ良くなる必要があるだけです。
最初の大会では、この瞬間がどれほど動揺したか、私の手が落ちたのと同じくらい、ここであなたは銀色になりました-そしてあなたは...リーダーボードの下部にいます。 何も、あなたはただ集まって、どこで何を逃したかを理解する必要があります-あなたの決定をやり直して-場所に戻る。
さらに、この瞬間は、競争プロセスの初期段階にのみ存在します。 経験を積むほど、配置されたカーネルや星の影響を受けにくくなります。 最後の競争の1つ( トーキングデータ 、私たちのチームが8位になった )で、彼らもそのようなカーネルを投稿しましたが、彼はPavel Pleskov(ppleskov)からのチームチャットで1行だけを受け取りました 。 悪化しただけです 。 捨ててください 。」 つまり、このカーネルがデータからプルした有用な信号はすべて、すでにモデルによって引き出されています。
そして、メダルについて-覚えておいてください:
「装備のないベルトはズボンを維持するためにのみ必要です」(C)
どこで、何を、どのようにコードを書くか。

ここでの推奨事項は、 ubuntuの下のjupyterノートブックでのPython 3.6です。 Pythonは長い間DSのデファクトスタンダードになりました。膨大な数のライブラリとコミュニティを考えると 、特にjupyter_contrib_nbextensionsを使用したjupyterは、ラピッドプロトタイピング、分析、データ処理に非常に便利であり、 ubuntuは単独で便利であり、さらにデータ処理の一部は簡単に実行できる場合がありますbashで :)
jupyter_contrib_nbextensionsを設定したら、すぐに有効にすることをお勧めします。
- 折りたたみ可能な見出し(コードブロックの整理に非常に役立ちます)
- コードの折りたたみ(同じ)
- セルを分割します(まれですが、何かを並行してデバッグする必要がある場合に便利です)
そして、あなたの人生はずっと楽になり、もっと楽しくなります。
パイプラインが多少安定したら、すぐにコードを別のモジュールに配置することをお勧めします。 私を信じて-あなたはそれを2回、または5回ではなく、複数回書き換えます。 しかし-これは正常です。
参加者がjupyterノートブックをできる限り使用せず、必要な場合にのみ、スクリプトを使用してパイプラインをすぐに作成しようとする場合、反対のアプローチがあります。 (このオプションの支持者は、たとえば(Vladimir Iglovikov(ternaus) )
そして、 pypyterを何らかの種類のIDE( pycharmなど)と組み合わせようとしている人がいます。
それぞれのアプローチには命に対する権利があり、それぞれの長所と短所があり、「すべてのマーカーの味と色は異なる」と言われています。 快適なものを選択してください。
しかし、任意のオプションで、原則としてそれを取る
送信された各submit / OOFのコードを保存します(以下を参照) 。
(*) OOF-out of folds 、クロス検証を使用してデータセットのトレーニング部分のモデル予測を取得する手法。 アンサンブルで複数のソリューションをさらに組み立てるために不可欠です。 それはコースで再び教えられるか、簡単にグーグルです。
どうやって? さて、少なくとも3つのオプションがあります。
- 各コンペティションごとに、 githubまたはbitbucketに個別のリポジトリが作成され、各送信のコードが、受信した速度、モデルパラメーターなどを含むコメントとともにリポジトリにコミットされます。
- 各サブミットのコードは、サブミットのすべてのメタ情報が示されているファイルの名前(同じ速度、パラメータなど)を持つ個別のアーカイブに収集されます
- DS / ML専用に強化されたバージョン管理システムが使用されます。 たとえば、 https://dvc.org 。
一般に、コミュニティでは、3番目のオプションに徐々に切り替える傾向があります。 1つ目と2つ目は欠点がありますが、シンプルで信頼性が高く、Kaggleにとっては十分です。

はい、プログラマーでない人のためのpythonの詳細-それを恐れないでください。 あなたの仕事は、他の人のカーネルを理解してライブラリを書くために、コードの基本構造と言語の基本的な本質を理解することです。 Webには初心者向けの優れたコースがたくさんあります。おそらく、彼らが正確にどこにいるかを教えてくれるコメントがあります。 ( ) , .
,

. , Kaggle — . , , - ResNet/VGG , — , .
, . Camera Identification , , , [ ods.ai ] , Kaggle , , — . , 46- , , , — , 300 , .
— .
( jupyter notebooks + ) :
- EDA (exploratory data analysis) . — Kaggle :), EDA . - , , - , .. . , .
- Data Cleaning — , . , , ..
- Data preparation — , . :
- Models
- Linear models
- Tree models
- Neural Networks
- Exotic (FM/FFM)
- Feature selection
- Hyperparameters search
- Ensemble
, , ( ). .
— , - .
CSV, feather/pickle/hdf — .
, TalkingData, , memmap , lgb.
— hdf/feather, - ( ) — CSV . — , , .

Getting started ( , House Prices: Advanced Regression Techniques ), . , , , , .. など , — , .
— — .
, 100% :
- EDA . ( , , , ...)
- Data Cleaning. ( fillna, , )
- Data preparation
- ( — label/ohe/frequency, , , )
- ( )
- Models
- Linear models ( — ridge/logistic)
- Tree models (lgb)
- Feature selection
- Ensemble

… :)
— !!!
— — ! , . — , , , — . , .
, - , — ?
!
:
!
- 4, (EDA/ Preparation/ Model/ Ensemble/ Feature selection/ Hyperparameters search/ ...)
- , , , .
:
.
, . , . あなたが決めます。
フォーラムで質問できるので、なぜ5日間待ってすぐに読んでいないのですか?この段階では(私の意見では)、すでに形成されたスレッドを解決策の議論、あなたが持っているかもしれない質問で読むことをお勧めします-誰かがすでに尋ねているか、まったく尋ねずに自分で答えを探す方が良いです)
なぜこれすべてがそうするのですか? さて、もう一度-この段階のタスクは、ソリューション、方法、アプローチのデータベースを開発することです。 戦闘基地。 次の競争で時間を無駄にしないように、すぐに言ってください- ターゲットエンコードが入ってくることを意味します。ちなみに、フォールド内のフォールドを介してこのための正しいコードがあります。 またはああ! アンサンブルがscipy.optimizeを通過したことを覚えています。 ところで 、コードはすでに準備ができています。
そのようなもの...
作業モードに移動します

このモードでは、いくつかの競合を解決します。 シート上のレコードが少なくなり、モジュール内のコードが増えていることに気付くたびに。 次第に、分析のタスクは、ソリューションの説明を読むだけの事実にまで削減されます。 そして、貯金箱に1つまたは2つの新しい呪文やアプローチを追加します。
その後、モードはエラー処理モードに変わります。 ベースは準備ができているので、正しく適用する必要があります。 各コンペティションの後、ソリューションの説明を読んで、見てください-あなたがやらなかったこと、より良くできること、見逃したこと、またはどこに行きましたか、私がToxicでしたように。 彼は非常によく歩き、金の下で歩き、個人的には1,500のポジションを飛びました。 涙を流すのは残念ですが...落ち着いて、間違いを見つけ、ゆったりとした投稿を書いて、教訓を学びました。
動作モードへの最後の出口の兆候は、最上位ソリューションの説明の1つがニックネームから書き込まれるという事実です。
この段階の終わりまでに、パイプラインにおおよそ何をすべきか:
- 前処理および数値的特徴の作成のためのあらゆる種類のオプション-投影、関係、
- カテゴリを操作するさまざまな方法-正しいバージョン、頻度、ラベル/ oheでの平均ターゲットエンコーディング、
- テキスト上のさまざまな埋め込みスキーム(Glove、Word2Vec、Fasttext)
- さまざまなテキストベクトル化スキーム(カウント、TF-IDF、ハッシュ)
- いくつかの検証スキーム(グループごとの時間ベースの標準的な相互検証ではN * M)
- ベイズ最適化/ hyperopt /ハイパーパラメーターを選択するための他の何か
- シャッフル/ターゲットの順列/ Boruta / RFE-機能を選択するため
- 線形モデル-1つのデータセットで同じスタイル
- LGB / XGB / Catboost-1つのデータセットで同じスタイル
著者は、線形モデルとツリーベースモデルのメタクラスを個別に作成し、単一の外部インターフェイスを使用して、異なるモデルのAPIの違いを平準化しました。 ただし、1つのキーで1行で実行できるようになりました。たとえば、1つの処理済みデータセットに対してLGBまたはXGBを実行できます。
- あらゆる状況に対応したいくつかのニューラルネットワーク(これまでのところ写真は撮りません)-テキストの埋め込み/ CNN / RNN、シーケンスのRNN、その他すべてのフィードフォワード。 オートエンコーダーを理解し、できるようになることは良いことです。
- lgb /回帰/ scipyに基づくアンサンブル-回帰および分類タスク用
- すでに遺伝的アルゴリズムができるのは良いことです。時にはうまくいくこともあります
まとめると
あらゆるスポーツ、そして競争力のあるDSもスポーツであり、多くの汗と多くの仕事です。 これは良いことでも悪いことでもありません。事実です。 競技への参加(プロセスに正しくアプローチした場合)は、技術的なスキルを非常に上手く発揮します。さらに、実際に何かをしたくないときにスポーツ精神を多少揺らし、直接すべてを壊します-しかし、あなたはラップトップに立ち上がって、モデルをやり直し、計算を開始しますこの不幸な小数点第5位をかじってください。
農場体験、メダル、ファン-Kaggleを決めましょう!
著者のパイプラインに関するいくつかの言葉

このセクションでは、1年半にわたって収集されたパイプラインとモジュールの主なアイデアを説明しようとします。 繰り返しますが、このアプローチは普遍的またはユニークであると主張していませんが、突然誰かが助けるでしょう。
- 平均ターゲットエンコーディングを除くすべての機能エンジニアリングコードは、関数の形式で別のモジュールに取り出されます。 オブジェクトを介して収集しようとしましたが、面倒であることが判明しました。この場合も必要ありません。
- 機能エンジニアリングのすべての機能は同じスタイルで作成され、呼び出しと戻りの署名が1つだけです。
def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): # do something return _data, new_attrs
入力には、データセット、作業用の属性、新しい属性のプレフィックス、および追加のパラメーターを渡します。 出力で、新しい属性とこれらの属性のリストを持つ新しいデータセットを取得します。 さらに、この新しいデータセットは別のピクルス/フェザーに保存されます。
これにより、事前に生成されたキューブからトレーニング用のデータセットをすばやく組み立てることができます。 たとえば、カテゴリの場合、一度に3つの処理を行います-ラベルエンコーディング/ OHE /頻度、3つの別々のフェザーに保存し、モデリングの段階でこれらのブロックを再生し、1つのエレガントな動きでさまざまなトレーニングデータセットを作成します。
pickle_list = [ 'attrs_base', 'cat67_ohe', # 'cat67_freq', ] short_prefix = 'base_ohe' _attrs, use_columns, data = load_attrs_from_pickle(pickle_list) cat_columns = []
別のデータセットを構築する必要がある場合は、 pickle_list
変更して再起動し、新しいデータセットを操作します。
表形式データ(実およびカテゴリ)の主要な関数セットには、カテゴリのさまざまなコーディング、カテゴリの数値属性の投影、およびさまざまな変換が含まれます。
def do_cat_le(data, attrs, params=None, prefix='le_'): def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): def do_cat_cnt(data, attrs, params=None, prefix='cnt_'): def do_cat_fact(data, attrs, params=None, prefix='bin_'): def do_cat_comb(data, attrs_op, params=None, prefix='cat_'): def do_proj_num_2cat(data, attrs_op, params=None, prefix='prj_'):
ソース属性のリストと変換関数のリストを転送する属性を結合するための汎用スイスナイフ。通常どおり、データセットと新しい属性のリストを取得します。
def do_iter_num(data, attrs_op, params=None, prefix='comb_'):
さらに、さまざまな追加の特定のコンバーター。
テキストデータを処理するために、前処理、トークン化、見出し語化/ステミング、頻度表への変換などのさまざまな方法を含む個別のモジュールが使用されます。 など sklearn 、 nltk 、 kerasを使用したすべてが標準です。
時系列は、通常のタスク(回帰/分類)とシーケンス間で両方の元のデータセットを変換する機能を備えた別のモジュールによっても処理されます。 ケラスを仕上げてくれたFrançoisCholletに感謝します。これにより、seq-2-seqモデルの構築が悪魔を呼ぶブードゥー教の儀式に似てしまうことはありません。
ちなみに、同じモジュールには、シリーズの通常の統計分析の機能もあります-定常性のチェック、STL分解など。これは、シリーズを「感じて」、それがどのようなものかを見るために分析の初期段階で大いに役立ちます。
_fpreproc = fpr_target_enc _fpreproc_params = fpr_target_enc_params _fpreproc_params.update(**{ 'use_columns' : cat_columns, })
- モデル化のために、モデルの概念を一般化するメタクラスが作成されました。抽象メソッド:fit / predict / set_params /など。 特定のライブラリ(LGB、XGB、Catboost、SKLearn、RGFなど)ごとに、このメタクラスの実装が作成されています。
つまり、LGBと連携するために、モデルを作成します
model_to_use = 'lgb' model = KudsonLGB(task='classification')
XGBの場合:
model_to_use = 'xgb' metric_name= 'auc' task='classification' model = KudsonXGB(task=task, metric_name=metric_name)
そして、すべての機能はさらにmodel
動作しmodel
。
検証のために、クロス検証中に複数のシードの予測とOOFの両方をすぐに計算するいくつかの関数と、train_test_splitを介した通常の検証のための別の関数が作成されました。 すべての検証関数は、モデルに依存しないコードを提供し、他のライブラリのパイプラインへの接続を容易にするメタモデルメソッドを使用して動作します。
res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
XX_train [use_columns]、yy_train、XX_Kaggle [use_columns]、折り目、得点=スコアラー、METRIC_NAME = METRIC_NAME、fpreproc = _fpreproc、fpreproc_params = _fpreproc_params、model_seed = model_seed、沈黙=真 res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
機能の選択について-面白くなく、標準のRFEであり、あらゆる方法で私のお気に入りのシャッフル順列。
ハイパーパラメーターを検索するために、ベイズ最適化が主に使用されます。これも統合された形式であり、任意のモデルの検索を実行できます(クロス検証モジュールを使用)。 このユニットは、シミュレーションと同じラップトップに住んでいます。
いくつかの機能がアンサンブル用に作成され、Ridge / Logreg、LGB、ニューラルネットワーク、および私のお気に入りのscipy.optimizeに基づいて回帰および分類タスク用に統合されました。
簡単な説明-パイプラインの各モデルは、テストの予測とトレインのOOF予測であるsub_xxxとoof_xxxの 2つのファイルを結果として提供します。 次に、指定されたディレクトリのアンサンブルモジュールで、すべてのモデルからの予測のペアを2つのデータフレームdf_sub / df_oofにアップロードします。 それでは、相関関係を見て、最適なものを選択してから、 df_oofでレベル2モデルを構築し、 df_subに適用します 。
モデルの最適なサブセットを検索するには、 遺伝的アルゴリズムによる検索が適している場合があります(著者はこのライブラリを使用します )。 最も単純なケースでは、標準回帰とscipy.optimizeがうまく機能します。
ニューラルネットワークは別のモジュールに存在します。著者は機能スタイルでkerasを使用しています 。はい、 pytorchほど柔軟ではありませんが、今のところ十分です。 繰り返しになりますが、ネットワークのタイプに不変な普遍的なトレーニング関数が書かれています。
このパイプラインは、 Home Creditとの最近の競争でもう一度テストされました。すべてのブロックとモジュールを慎重かつ正確に使用することで、94位になりました。
作者は一般に、表形式のデータと通常作成されるパイプラインについては、コンテストでの最終提出物がトップ100のリーダーボードに入るべきだという平穏な考えを表現する準備ができています。 当然、例外もありますが、一般的にこの声明は真実のようです。
チームワークについて

Kaggleがチームかソロかを決めるのはそれほど簡単ではありません-それは人(およびチーム)に大きく依存しますが、始めたばかりの人への私のアドバイスはソロを始めようとすることです。 なんで? 私の視点を説明しよう:
- まず、自分の長所を理解し、弱点を確認し、一般に、DSプラクティスとしての可能性を評価できるようになります。
- 第二に、チームで作業している場合でも(役割が分離された確立されたチームでない限り)、彼らはあなたからの既製の完全なソリューションを待っています-つまり、すでに作業パイプラインがあるはずです。 (「 送信するかどうか 」)(C)
- そして第三に、チームのプレイヤーのレベルがほぼ同じ(そして非常に高い)場合に最適です。そして、あなたは本当に高レベルの有用なものを学ぶことができます)弱いチームでは(軽rogはありません、私はKaggleでのトレーニングと経験のレベルについて話しています)何かを学ぶことは非常に困難です。フォーラムとカーネルを噛むほうが良いです。 はい、メダルを養うことができますが、目標とパンツを維持するためのベルトについては上記を参照してください)
証拠と約束されたレーキカードに関するキャプテンからの有用なヒント:)

これらのヒントは著者の経験を反映したものであり、教義ではなく、独自の実験によって検証することができます(および検証する必要があります)
常に有能な検証を構築することから始めます-何もありません;他のすべての努力は炉に飛び込みます。 メルセデスのリーダーボードをもう一度見てください。
著者は、このコンペティションで安定したクロス検証スキーム(3x10倍)を構築し、スピードを維持し、正当な42位になったことに本当に満足しています)
適切な検証が構築されている場合は、常に検証結果を信頼してください 。 モデルの速度が検証では向上するが、公開では悪化する場合-検証を信頼する方が合理的です。 分析するときは、パブリックリーダーボードが別のフォールドと見なされるデータを単に読んでください。 モデルを1倍にしたくないですか?
モデルとスキームで許可されている場合、 常にOOF予測を行い、モデルの近くにそれらを保持します。 アンサンブルの段階では、何が撮影されるかわかりません。
常に結果の隣に/ OOFコードを保持して受信します。 github、ローカル、どこでも問題ありません。 2回、アンサンブルで最適なモデルは2週間前に箱から出して作成されたものであり、コードは保存されていないことが判明しました。 痛み
クロスバリデーションのための「正しい」SIDの選択にハンマーをかけ、彼自身が最初に罪を犯しました。 任意の3つを選択し、3xNの相互検証を実行することをお勧めします。 結果は、より安定して簡単になります。
アンサンブル内のモデルの数を追いかけないでください -少ないほうが良いですが、より多様です-モデル、前処理、データセットでより多様です。 最悪の場合、パラメータに応じて、たとえば、厳密な正則化を持つ1つの深いツリーと、1つの浅いツリーがあります。
shuffle / boruta / RFEを使用して機能を選択します 。さまざまなツリーベースのモデルでの機能の重要性は、おがくず袋のオウムの指標であることに注意してください 。
著者の個人的な意見(読者の意見と一致しない場合があります) ベイズ最適化 >ランダム検索> ハイパーパラメーターを選択するためのハイパーオプト 。 ( ">" ==良い)
パブリックカーネルに配置されたティアリングリーダーボードは 、次のように最適に処理されます。
- 時間があります-私たちは新しいものを見て、自分で作ります
- 短い時間-検証のためにやり直し、OOFを実行し、アンサンブルに固定します
- まったく時間がありません-私たちは最高のソリューションと愚かにブレンドし、高速に見えます。
2つの最終提出物を選択する方法 -もちろん、直観による。 しかし、真剣に、そして通常誰もが次のアプローチを実践します:
- 保守的な提出(持続可能なモデル)/リスクのある提出。
- OOFのベスト/パブリックリーダーボード
覚えておいてください-すべてが数字であり、その処理の可能性はあなたの想像力にのみ依存します。 回帰の代わりに分類を使用し、シーケンスを画像として扱うなど。
そして最後に:
便利なリンク

全般
http://ods.ai/-最高のDSコミュニティに参加したい人向け:)
https://mlcourse.ai/-ods.aiコースWebサイト
https://www.Kaggle.com/general/68205-Kaggleのコースに関する投稿
一般に、この記事で説明されているのと同じモードで、mltrainingsのビデオサイクルをご覧になることを強くお勧めします。興味深いアプローチとテクニックがたくさんあります。
映像
コース
専門分野の2年目の「 データサイエンスコンペティションに勝つ方法:トップカグラーから学ぶ 」から、Kaggleで問題を解決する方法とアプローチについて詳しく知ることができます。
課外リーディング:
おわりに

一般的なデータサイエンスのトピック、特に競合するデータサイエンスのトピックは、アトム(C)と同じように無尽蔵です。 この記事では、著者は競争力のあるプラットフォームを使用して実用的なスキルを向上させるトピックを少しだけ明らかにしました。 それが面白くなったら-接続し、見回し、経験を蓄積し-あなたの記事を書いてください。 より良いコンテンツがあればあるほど、私たち全員にとって良いことです!
質問を予想して-いいえ、著者のパイプラインとライブラリはまだ自由に利用可能にされていません。
ods.aiの同僚に感謝します: Vladimir Iglovikov(ternaus) 、 Yuri Kashnitsky(yorko) 、 Valery Babushkin ( venheads) 、 Alexei Pronkin(pronkin_alexey) 、 Dmitry Petrov(dmitry_petrov) 、 Arthur Kuzin(n01z3) 、またみんな編集およびレビュー用の公開前の記事。
最終校正をしてくれたNikita Zavgorodnoy(njz)に感謝します。
ご清聴ありがとうございました。この記事が誰かに役立つことを願っています。
Kaggle / ods.aiでの私のニックネーム: kruegger