見出し画像

Kaggleで上位1.1%になった軌跡


経歴

新卒1年目フロントエンドの勉強を半年間していたが急遽データエンジニアを目指すことに。
大学では物理現象のシミュレーションを行う研究室に在籍していてその際にPythonでコードを書いていた。
数学は得意な方で統計学は大学で少し学んでいた。

経緯

データエンジニアを目指すことに決まってからすぐにKaggleというコンペ形式の大会があることを知る。
初めは$10000以上の賞金が出る大会というフレーズに魅力を感じて早速やってみようと思った。
ただ賞金が出るコンペを見てみると所要時間に3ヶ月ほどかかりとてつもない労力が必要なことがわかった。自分の知識のアウトプットと腕試しを兼ねて挑戦するにはハードルが高すぎる。
それでもなにかに出てみたかったので初心者向けのコンペが1ヶ月ごとに行われているのを知り出てみることにした。

内容

コンペ内容は8個の物理的測定値からアワビの年齢を予測するというもの。

  • ID:各アワビのユニークな識別子

  • Sex:アワビの性別(I: 稚魚, M: 男性, F: 女性またはOther)

  • Length:殻の長さ

  • Diameter:殻の直径

  • Height:殻の高さ

  • Whole weight:アワビの全体の重さ

  • Shucked weight:身の重さ

  • Viscera weight:内臓の重さ

  • Shell weight:殻の重さ

  • Rings:年齢

手法選択

まず分析をするにあたってアルゴリズムの手法を選ぶ必要がある。
元から興味のあったニューラルネットワークを使って分析をすることに決めた。

特徴量エンジニアリング

一ヶ月を通してこのフェーズに一番苦労した。
8個の特徴量から他の特徴量を生成し厳選する際の、意味のある特徴量の増やし方や厳選する手法の選択がスコアの向上に大きく左右した。
初めの10日ほどで行っていた手法はAutoFeatで特徴量を自動生成するものを使った。精度があまりよくなく、自動生成であるためこれ以上改善のしようがないといった理由から自分で生成する手法に変えた。
多項式特徴量を生成し、線形回帰モデルとRFEを使用して特徴量選択したのち特徴量の重要度を取得し、さらに特徴量を絞り込む手法にした。

ニューラルネットワーク

ニューラルネットワークはXGBoost、LightGBM、CatBoost、Kerasの全てを使ってみてそれぞれの利点がわかってきたので、今回は最終的にKerasを採用した。
Scikit-learnのKFoldを使用してデータセットを複数の分割に分け、モデルを訓練。
KerasのSequential APIを使って、全結合層を積み重ねたニューラルネットワークを定義。
活性化関数は最初の2つの隠れ層にReLUを使用し、次の2つの隠れ層にELUを使用した。初期層でReLUを使用することで、モデルの訓練を迅速に進め、深い層にELUを使用することでモデルの表現力を高め、デッドニューロン問題への対策も行なった。
モデルのコンパイルの最適化アルゴリズムにはadamを、損失関数にはrmsle(ルート平均対数誤差)を使用。
コールバックとしてEarlyStopping(早期停止)とReduceLROnPlateau(学習率の減少)を適用。
バッチサイズは64
これらを微調整することでスコアを上げていった。

工夫点

コンペが始まって2週間ほど経過するまではスコアは少しずつ伸びていき全体の40%ほどだった。
しかしそこから全くスコアが上がらなくなってしまった。
自分のなかでは特徴量エンジニアリングは問題がないと思っていたので、ニューラルネットワークに問題があるとしてフレームワークを変えたり、層の数や活性化関数を微調整したりしていた。
しかしうまくいかず、どのモデルを試してみても過学習している傾向があることがわかった。
そこで特徴量エンジニアリングを再度見直すことにした。
特徴量を生成する段階で高次元の特徴量を扱っていた為、ニューラルネットワークを用いる前の段階で過学習が起きていることに気づいた。
まさに典型的な"次元の呪い"ってやつだった…


結果

2606チーム中30位
途中自信のある出力を得て、提出して16位と表示された時の興奮はすごかった。
最終日になるにつれて順位は落ちていき65位となってしまいたが、最後も特徴量エンジニアリングにこだわって少し順位を上げて30位で終えることができた。


展望

Kaggleは、仮説を立て検証し微調整を繰り返しより良い結果を求めるところが大学時代の研究と似ていてある程度元々コツを掴めていたのだと思う。
学びも多く楽しめたのでこれからも趣味としてやってみたいなと思えた。

今回のKaggleではGoogleColabを用いた開発環境であったが、今後はAWSやGCPを用いてビッグデータをを扱うようなデータエンジニアリングを行いたい。

具体的には、AWS Glueを使ってデータ収集とETLプロセスを自動化、大きなデータの取り扱いを効率化する。
Amazon EMRやAWS Lambdaを使って、大規模データの処理と分析パイプラインの作成。
Amazon Redshiftを使ってデータウェアハウスを実装、クエリの高速化をする。
BigQueryを使ったSQLでの大規模データの高速処理。

Columns

実際にニューラルネットワークに使った特徴量の散布図


kaggleのデータをBigQueryに入れてLooker studioを用いて可視化する分析も行なった

この記事が気に入ったらサポートをしてみませんか?