こんにちは、ウェブアプリケーションエンジニアのid:syou6162です。今年の夏に社内機械学習ハッカソンを開催したので、その様子を紹介したいと思います。今回のハッカソンでは、機械学習のコンペサイトとして有名なKaggleをテーマに取り組みました。
なぜKaggleをやるのか?
はてなでは昨年の冬にも機械学習ハッカソンを開催しており、その際は主に社内データの活用をテーマにしていました。
今回のハッカソンではデータというより、普段試したことがない、あるいは業務で試してみたい手法をやってみようということでKaggleのデータを使いました。Kaggleは本来数ヶ月単位で行なわれるコンペが多いため1日の作業では上位に行くことは難しいですが、こういった自分が試してみたい手法を試す練習の場として活用することもできると思います。
個人や組織がKaggleに取り組むことについてのメリットについては以下のスライドがよくまとまっています。
事前準備
機械学習やKaggleに慣れていないメンバーもいたため、つまらないところではまらないようにハッカソン開催の前に事前準備を行ないました。機械学習に関して詳しいメンバーが集まっている機械学習サブ会という組織がはてなにはあるので、そのメンバーが中心になって準備しました。
- 初級編: サマーインターンで行なっている機械学習の講義の再演
- そもそも機械学習とは、どうやって学習するのか、特徴量を作るのか、評価はどうやって行なうのか、といったことを頭に入れてもらう
- Web開発におけるコンピュータサイエンス - 機械学習編1 - Hatena Developer Blog
- はてなサマーインターン2018の講義資料を公開しました。今年はGo言語&新カリキュラム! - Hatena Developer Blog
- 中級編: Jupyter notebookやGoogle Colabを使ったデータ分析実践編
- 座学だけでは足りないので、実データを使ってJupyter notebookでどういった分析、モデル構築を行なうかデモをしながら学んでもらう
- 簡単なベースラインモデルをまず作り、データ分析を元にこういった特徴量が効くのではないかという仮説を持ってモデルを精緻にしていくという過程を学んでもらう
- Jupyter notebookを使ったデータ分析は機械学習だけでなく普段の業務でのデータ分析にも役に立つので、そういったことも主眼に置いてレクチャー
取り組んだコンペ
id:syou6162 (TalkingData AdTracking Fraud Detection Challenge)
- 取り組んだコンペ
- どういう手法を使ったか、工夫したこと、苦労したこと
- 以前このコンペに取り組んだ際に、データセットが巨大で特徴量エンジニアリングやパラメータチューニングを十分にできなかったという経緯がありました
- リベンジマッチということで以下の2つをターゲットにして取り組みました
- Negative down samplingで負例をダウンサンプリングすることにより一回の学習を軽く
- Bayesian optimizationでハイパーパラメータのチューニングを賢くやる
- 詳細については個人ブログに書いています
- どれくらいのスコアだったか
- 0.9808で上位10%相当のスコアに到達!
id:alpicola (Toxic Comment Classification Challenge)
- 取り組んだコンペ
- Toxic Comment Classification Challenge | Kaggle
- 悪意のあるコメントの判別のようなタスクでニューラルなモデルのパフォーマンスを試してみたかった
- どういう手法を使ったか、工夫したこと、苦労したこと
- 事前にtf-idfとロジスティック回帰によるベースラインを作っておいた (スコアは0.9758)
- 当日作成したモデルはkerasによるbidirectional GRU + global pooling
- 単語埋め込みはfasttext (Common Crawl) を使った
- 最初GPU実装 (CuDNNGRU) を使うのを忘れていて、途中で切り替えたら1 epochの学習時間が1/3になった
- あまりハイパーパラメータ調整の勘がなかったが、やはり系列長やドロップアウトレートあたりは要調整
- とはいえ素朴にやってもベースラインから落ちることはなかったのでよかった
- どれくらいのスコアだったか
- 0.9836 (mean column-wise ROC AUC) で上位35%くらい
id:takuya-a (Titanic: Machine Learning from Disaster)
- 取り組んだコンペ
- Titanic: Machine Learning from Disaster | Kaggle
- LightGBM とベイズ最適化を試したかったので前処理は頑張らずにどのくらいの精度が出るかを試した
- どういう手法を使ったか、工夫したこと、苦労したこと
- Titanic Top 4% with ensemble modeling | Kaggle を見ながら簡単な EDA と前処理
Age
とEmbarked
の欠損値に中央値と最頻値を埋めた- カテゴリ変数(
Sex
Embarked
)を id 化 - DataFrame の明示的な型変換
- 文字列の特徴量は使わなかった(
Age
Fare
Pclass
Sex
SibSp
Parch
Embarked
のみ)
- アルゴリズムは LightGBM
- LightGBM に興味があったのでアルゴリズムは決め打ち
- LightGBM のハイパーパラメータの探索にベイズ最適化 (BO; Bayesian Optimization) を試した
- 最初から別の kernel(Applying LightGBM to Titanic dataset | Kaggle)の LightGBM のパラメータでやっていたので、そんなに効果はなかった
- Titanic Top 4% with ensemble modeling | Kaggle を見ながら簡単な EDA と前処理
- どれくらいのスコアだったか
- 0.77990(全体の50%くらい)
- 文字列の特徴量とか入れたり前処理がんばればもうちょっと上がるかも?
id:tanishiking24 (Spooky Author Identification)
- 取り組んだコンペ
- どういう手法を使ったか、工夫したこと、苦労したこと
- ちょうどトピックモデルについて勉強していたので Spooky NLP and Topic Modelling tutorial を見ながらLDAに対する理解を深めた
- 普通に前処理+Tfidf+NaiveBayesとGridSearchでパラメータチューニング等によって 0.40 (全体の上位50%くらい)
- 適当に特徴量エンジニアリングとアンサンブル学習をいくつか試したがあまりスコアは伸びなかった...
id:miki_bene (Titanic: Machine Learning from Disaster)
- 取り組んだコンペ
- Titanic
- 機械学習やデータ分析の勉強に良さそうと思ったため
- どういう手法を使ったか、工夫したこと、苦労したこと
- 手法としては決定木とランダムフォレストを試した
- あまり手法には凝らずに分析や特徴量エンジニアリングを通して有益な変数を見つける練習として取り組んだ
- 乗客の性別と客室の等級といった特徴で 0.75 くらいのスコアが出てしまい, そこから伸ばすのが難しかった
- 上位者のKernelを見ると外れ値を除去したり欠損値の扱いといった基本的なデータ分析のことが出来ていなかったので, 身に付いていない箇所がわかったのはよかった
- どれくらいのスコアだったか
- スコアは 0.77990 で, 全体の50%くらい
まとめ
今回のハッカソンをきっかけに様々なデータセットや手法を試してみることができました。開催後の懇親会では細かい特徴量エンジニアリングやパラメータチューニングのノウハウなどについて盛り上がりました。また、定時後にKaggleに取り組んで機械学習に関するノウハウやテクニックを共有するKaggleもくもく会という取り組みも始めています*1。
こうした経験を積んでくると社内の仕事でも「この間取り組んだコンペであの手法が効いたから、今回の仕事でも性能向上に寄与するのではないか」「このタスクでこれくらいの精度が出るのなら、社内でこんなことができるんじゃないか」ということも増えてくると思っています。はてなでは機械学習に関連する論文読み会も定期的に行なっていますが、こういったハッカソンも継続的に行なっていきたいと思います。
*1:開催中のコンペに関してはprivate sharingにならないようにしています