Kaggle 【12/7】

 近況

以前から興味があったDjangoを調べ、アプリ開発のための環境をDockerで構築するための勉強をしていました・・・。使いこなせるようになるにはまだまだ時間がかかりそうです(汗) また、今週はAI業界には「過学習」「PFN、ChainerからPyTorchへ移行」など大きなニュースがありました。深層学習フレームワークの利用推移がどう変わるのか気になります。

今日やったこと

  • PUBG Finish Placement Predictionへの参加
  • バリデーション手法 (k-分割交差検証)
  • ハイパーパラメータ探索
PUBG Finish Placement Prediction

データ準備、欠損値処理、カテゴリ変数の処理、スケーリング、モデル構築、モデル評価、etc...。シンプルなテーブルコンペに必要な最低限の手法は身についたと思う。アンサンブル学習やスタッキングに手をつけるにはまだ早いので、最も重要な「EDA」と「特徴量生成」に移るため生のデータに近い、そしてデータを見るモチベーションが一番保てそうなゲームに関するコンペに参加しました。(PUBGは未経験ですが)

また、予測値を0から1に収めなければいけないということもこのコンペの大きな特徴だといえます。

k-分割交差検証

バリデーションは今まで「train_test_split」を使っていましたが、これだけでは過学習により汎化性能が上がりません。そこで訓練データをあらかじめ決めておいた数のレコードに分割する。各レコードを必ず1度だけ検証データとし、他のレコードを訓練データとすることで、モデルの汎化性能をあげることができます。図で見るとすぐ理解しやすい。

また、分類タスクでは目的変数がまとまっていることが原因でモデルの学習がうまくいかないことがあり、その対策法もすることができました。その場合、交差検証を行う際、ただシャッフルするだけでなく、目的変数の比率を同程度にして検証を行う「層化k分割交差検証」という方法で解決できるようです。

ハイパーパラメータ探索

モデルのパラメータをあらかじめ複数設定し、最も精度の高いパラメータを保持する"グリッドサーチ"。ランダムにパラメータを設定し、最良なパラメータを探す"ランダムサーチ"。PUBGコンペで初めて使ってみましたが、欲が深すぎてパラメータを設定しすぎた結果、メモリが足りず強制終了してしまいました。かなりの時間を使ってしまいましたが、kaggleのメモリ制限やパラメータ設定の優先度など、実感できたことも多くあったので良しとします。

困ったこと

  • 欠損値の見落とし
  • TerminatedWorkerError(GridSearchCVの記述ミス)
  • kernelの計算リソース

とりあえず必要な処理を施してモデルを構築すると「このデータには欠損値、もしくは無限大のデータがあります。」のようなエラーが出ました。いつものようにデータ全体(train+test)から欠損値の有無を確認しましたが、どのカラムもFalseになっていたので、欠損値はないものだと思い込んで他の原因を探っていました。しかし、原因は欠損値でした。目的変数を除いたうえで欠損値を確認していたため、目的変数の欠損値を見落としていました...。

また、グリッドサーチやバリーデーションのため計算量が膨大になったことで、メモリが圧迫され「The kernel appears to have died. It will restart automatically.」と、途中で強制終了したり、放っておいたらPCが落ちていて計算が中断されていたりするなど何時間も費やしてしまいました。メモリの節約方法などもあるようなので、新たな課題もたくさん見つかりました。

感想

いろいろなことにかなりの時間を費やしてしまいましたが、得られたこともありました。すんなりと簡単なモデルを作り提出できることが分かったので、次は先人たちのkernelを参考に「EDA」を深く知っていきたいと思います!!