For Your ISHIO Blog

データ分析や機械学習やスクラムや組織とか、色々つぶやくブログです。

ShakeDownを食らったMicrosoft Malwareコンペを振り返る

KaggleのMicrosoft Malware Predictionが終了しました。参加した皆さん大変お疲れ様でした。 これまでもつまみ食いはしつつも、今回初めてKaggleコンペに本格的に参加しました。少し期待していたのですが、Publicでソロ銅圏(150位)からPrivateで840位と大幅なShake Downを食らい悲しいし恥ずかしい。 一方で、Kaggleコンペに参加したことで多くの学び・教訓を得ることができました。失敗や経験を次につなげるためにも、本コンペを通じて学んだことを振り返っておきたいと思います。

技術的な学び

今回のコンペの特徴は下記であったと考えます。

  1. 大規模なデータ
  2. 訓練データとテストデータの分布が異なる
  3. (結果的に)テストのPublicデータとPrivateデータの分布が異なる

こういった特徴の中で出会った学びについて書いていきます。

メモリ載らない問題

大規模データであることから、私の環境ではDataFrameがメモリ上に載らない事案が発生し、メモリ節約の必要性が出てきました。そこら辺に関しては、自身もブログに記したほか、えちさんのブログで知ったreduce_mem_usage()関数でデータ型を最適化する等により対処をすることができました。

ishitonton.hatenablog.com

amalog.hateblo.jp

仮説検証サイクル遅くなる問題

Kaggleに限らず、いかに仮説検証を効率的に高速に回せるかが非常に重要だと思います。 今回のコンペが大規模データセットであることから、仮説検証サイクルが遅くなることに遭遇しました。より高速にサイクルを回すために、Feather形式での特徴量管理やデータの入出力する等のアイデアをもらい試しました。

amalog.hateblo.jp

訓練データとテストデータの分布違う問題

訓練/テストデータの分布が違う点に関しては、ディスカッションにも出ていましたが、私はAdversarial Varidationを試しました。訓練データとテストデータを判別する95%くらいの精度の2値判別モデルを構築。そのモデルを訓練データを対象に推論し、テストデータのProbavility Scoreを生成しました。テストデータの確度が高いと判別された訓練データを検証データとして、モデルの学習を行いました。

ただし、結果的に大幅なShakeDownを食らったことをみると、Adversarial Varidationのプロセスに何かしら問題があったか、テストデータの中でもPrivate/Publicデータの分布が想像以上に異なりPublicに過学習していたのか。いずれにしても自分の勉強不足以外のナニモノでもないですが、上位者の解法が出てきたらヒントを得たいと思います。 なお、Adversarial Varidationやそのほかvalidationの重要性については、u++さんのブログで勉強させていただきました。

upura.hatenablog.com

upura.hatenablog.com

特徴量生成について

今回自分は3つのモデルを組み合わせて最終的なsubmissionを生成していました。Non Tree Based Modelが1つとTree based Modelが2つです。これらのモデルのタイプに応じて、特徴量生成のケアや前処理方法は異なるため、改めて整理することが出来ました。前処理についてはCourseraのKaggleコースで勉強し、その内容の一部をアウトプットしました。

ishitonton.hatenablog.com

www.coursera.org

特徴量選択について

特徴量選択についてはかなり勉強不足で、今回の敗因の大きなウェイトを占めている気がします。 u++さんがブログに記載してくれたコルモゴロフ-スミルノフ検定を利用した特徴量選択とかを試したりしたが、私のモデルではモデル説明力が失われたように見え、残念ながら有意義な仮説検証に至りませんでした。

今後は『機械学習のための特徴量エンジニアリング』読んで勉強したいと思います。Adversarial ValidationでFeature Importanceがものすごく高い特徴量が何個かあったのだが、それ抜いたらスコア上がっただろうか。

upura.hatenablog.com

技術面以外の自身の内省

どこで満足するか

今回、自分は締切り1週間前の段階でソロ銀の状態にいました。その段階でかなり満足している自分がいたことを認識しています。その結果ラスト一週間でのsubmissionはかなり惰性的なものであり、全く進捗なく締め切りを迎えました。

一方で、トップ層では日本のKagglerの皆さんが最後までさらにスコアを挙げようと邁進していたことを横目で見ており、自身の精神面での未熟さを痛感しました。 どこで自身が満足するかは、Kaggleに限らず人生のあらゆる局面で自身に課せられる問いであり、仕事においてもプライベートにおいてもKaggleにおいても、この未熟さを改善したいと感じた次第です

学び多し犠牲もあり

KaggleのKernelやDiscussionを理解することで、多くの学びを得ることができました。結果よりこの学びの方が、自分の仕事にもポジティブな影響を与えてくれるかもしれない。 一方で、自分の性格上Kaggleを頑張ると他の様々な学びの機会を犠牲にしていることも理解しました。感覚的には、一時期ビットコインを購入して一攫千金を狙ったことがあるが、夜中も推移が気になり寝れなかった感覚に似ている。時に自身のライフサイクルを逸脱し、知的好奇心が一極集中。

その傾向を認識した上で、今後も参加したい!!

最後に

改めてDiscussionを見てみると、同じく大幅なShakeDownを食らっているolivierさんが、Conglatulationsというスレッドを立て上位者を祝福している。素晴らしい。自分も、自分がダメでも周りを称え、コミュニティに貢献できるスキルとマインドと懐の広さを持ちたいと思う次第です。

f:id:ishitonton:20190314191403p:plain
https://www.kaggle.com/c/microsoft-malware-prediction/discussion/83990

以上です。