Kaggleに初参戦してみたのでその感想をのこします。
#経緯
- (2018/10) DeepLearningをやってみたくて統計解析や機械学習を書籍やYoutubeで勉強。
- (2019/01) 仕事でPythonに初めて触れ、言語仕様を一気に覚えた。
- (2019/10) JDLA G検定 2019#3合格。さいよいよ実践だ。
- (2019/11) Kaggleのtutorial(Titanic)で練習。
- (2019/12) 2019 Data Science Bowlにエントリ。Webを見てると、Kaggleはすぐにでも参戦したほうが良いとの勧めが多かったので、簡単そうなTableコンペに初エントリ。
#感想
- 最初はいろんな人のコードが見れて感動。例えばランダムフォレストで特徴量の重要度を測定し、重要度の低い特徴量を削減する手法なんかはすごいなと。(でも、あとで一般的な手法なんだと本で知りました
- Kaggleが無償の実行環境(カーネル)を提供してて感激。またGCP使っている人も多いみたいで、クラウドの時代なんだなと実感。
- いろんな手法があるようだがだが、このコンペではXGBoostに絞って使いかたを覚えることに。他の手法はまた次のコンペで。
- ハイパーパラメータのチューニングでは最初はグリッドサーチを使っていたが、BayesianOptimizationが人気のようだったのでこちらを使用。
- KFoldではStratifiedKFoldなるものがあることを知り、こちらを使用
- 今回は正解率グループ(1~4)を予想するコンペで、最初はXGBoostのクラス分類で予想していたが、Discussion見てると回帰で予測し、適当な閾値により正解率グループに変換したほうが良いとのこと。やってみると確かにテストデータによる正解率は上昇。ちなみに閾値きめにはsp.optimizeの'nelder-mead'を使用。ここは達人コードを流用させてもらいました。
- 入力データは自分なりに工夫して選定したのだが、結果は全くダメ。公開されてる達人のコードを見ると、どうやら多数の入力データをやみくもに与えて、あとは決定木に頑張らせるという戦法の様子。無駄に見える入力を減らしたら成績が落ちるとのコメントが上がっていたが、そこは達人もなぜだがよくわからないとのこと。なるほど、下手に人間が考えるよりもコンピュータのほうが賢いということね。
- やり始めるうちにハイパーパラメータのチューニングにはまってしまう。常時カーネルを実行していないと損した気分に。カーネルの制限で1時間でセッションが切れてしまうのだが、コミットの場合は8時間まで実行可能なので、毎日就寝前と、会社行く前はコミット(ハイパーパラメータ探索実行)。寝不足が続き日中はまぶたが頻繁に痙攣する始末。知らないうちにKaggle中毒になってました。参加目的(=機械学習を楽しむ)を思い出すことで中毒から逃れることができました。
- 終了時はものすごい解放感でした
#学んだこと
- 以下のステップの手戻りを少なくしないといくら時間があっても足りなくなってしまう。今回は何度も手戻りしてしまった
- 入力の決定
- 訓練データの評価方法の決定
- チューニングするハイパーパラメータの決定
- ハイパーパラメータの範囲決定→徐々に範囲を絞っていく→決定
- 評価方法は非常に重要。物差しがくるってるとどうにもなりません。実際PrivateScoreとPublicScoreには結構差が出てました。PublicScoreでTopだったチームもPrivateScoreでは大きく順位を落としており、PublicScoreに最適化してしまっていたんでしょうね。
#次の目標
- 特徴量エンジニアリングをちゃんと勉強する(OneHotEncodingとか..)
- 他手法(DeepLearningとかCNNとか)を実践してみる
- 画像認識、自然言語処理、時系列データのコンペに参加する(機械学習を一通りできるようになるため)
- メダルを取る
#これからKaggleを始める人へのメッセージ
- やっぱり実践するのは楽しい!
- 理論的な知識がなくても十分楽しめます
- Discussionとかコードとか学びが非常に多い
- 実行環境はKaggleが無償で提供してくれるのでWebブラウザさえあれば参加可能。環境構築にはまることがない!
- チューニング作業は泥臭くて心が折れそうになるのでけど、順位が出たり、皆のDiscussionを見てるとモチベーションを保ちやすい
- Kaggle中毒には気を付けて!私は苦しかったです。