天色グラフィティ

機械学習やプログラミングでいろいろ作って遊ぶブログ

SUUMOデータ分析ワークショップで優勝した。

f:id:ejinote:20180416082927p:plain

sankak.jp

SUUMOのデータ分析ワークショップに参加した。結論から書くと優勝した。文字通りの意味である。

コンペ形式でランキングがつくということなので、腕試しのためにラボの同期と一緒に応募した。(ちなみに同期は落ちたので品川の日本酒フェアみたいなやつに行った)

先日参加予定だったscouty主催のSAICONは運営がテストデータの正解を間違って配るというハプニングによって中止になってしまっていたので、大変失礼ながらリクルート住まいのレベル感はどんな感じなんだろう(にやにや)みたいなノリで登録した。

データについてとかはあまり詳しいことは書けないので、ざっくり説明するとkaggleのZillowコンペみたいな不動産価格予測。特徴量は予めかなり用意してくれているのでそれをそのまま使っても十分モデルは作れそうな感じだった。

眠い目をこすりながら山手線に乗り、リクルート住まい本社がある田町駅に到着。秋頃にビジネス職のインターンを受けていたときは東京だったような。

受付に行くとめちゃめちゃフレンドリーな感じで応対される。あと、椅子が面白い感じだった。

f:id:ejinote:20180416083224j:plain

前の方に体重をかけると前に倒れていく。前傾姿勢で作業しやすいように設計されている。

他の参加者の方々は全員社会人。エンジニア/機械学習は独学、という人が多いのが印象的。

リクルート住まいについての説明を受けた後に、ざっくりタスクについて説明を受ける。制限時間は6時間(昼食時間込み)だった。

僕の戦略としては

  • 眺める(1時間)
  • ごはん(30分)
  • 特徴量作成・検討(2時間)
  • ハイパーパラメータチューニング(1時間)
  • アンサンブル他黒魔術(1時間)

という想定をした。実際もだいたいこれに従って進めた。

スコアリングはサンカクの人が作ったスコアリングツールにcsvを投げつければスコアが算出される方式。 サブミット回数の制限はないので、とりあえずカテゴリカル変数をTarget EncodingしてLightGBMに食べさせただけのベースラインモデルを投げた。 暫定1位になった。

牛タン弁当がうまい。やっぱり実務のデータ分析はむずいよーみたいな話を聞く。他のLightGBM使いの人に抜かれたので作業に戻った。

午後

与えられた特徴量をこねくりまわして新しい特徴量を作ったり、外部データを引っ張ってきたりした。

外部データとしては地域の平均年収なんかを使った。スクレイピングはめんどくさいのでWebサイトからテキストエディタにコピペして、正規表現を使ってがりがり整形した。地域犯罪率なんかを考慮してもよかったかもしれない。

特徴量作成ではあまり面白いことが出来なかった。他の人たちは地域の坪単価を算出したりしていたらしい。近くにリクルート住まいの人が待機してくれていたのでもっと話を聞いてドメイン知識を得ればよかったと思った。

チューニングはhyperoptにひたすら投げた。コンペの性質上、private LBに該当するものは存在せず、スコアリングツールのスコアだけで最終順位が決定する。 なので、(リークであることは分かりながらも)スコアリングツールのスコアを見ながらチューニングした。

具体的にはサブプロセスでスコアリングツールを叩き、結果をpythonで取得。それをhyperoptの目的関数にした。完全にズルである。

アンサンブルはLightGBM、RandomForest、kNN、Ridgeの4種類のモデルを試した。 最終的にはLightGBMとRandomForestのSeed Averagingをして、それらの重み付き平均を取って提出。無事1位を取った。

ピザは自明にうまい。

f:id:ejinote:20180416083232j:plain

感想

あまり面白いことはできなかった。結局データをじっくり眺めることと、ドメイン知識を利用することが正義だった。

データを眺める方はじっくり腰を据えてできたが、ドメイン知識はもっと活用しても良かった。 実際に日々データを触っているリクルート住まいのエンジニアの方がいるという素晴らしい環境を活用できなかったのは残念。 できるだけ心の余裕を持って解析していたつもりだけど、やっぱり焦っていたのかもしれない。

一方で、システマティックに解析を進めることはできた。 最初からカリカリチューニングするのではなく、特徴量を大量に作って素LightGBMに投げてを繰り返した。 kaggleとかだとLBスコアを伸ばしたい欲望に駆られて序盤からhyperoptぶん回してしまったりするので、今後はもう少し落ちついてコンペに臨もうと思う。

Target Encodingにはscikit-learn-contrib/categorical-encodingを使った。癖もなく扱いやすいライブラリだと思った。

github.com

リークはズルなので、次回からはprivate LBに相当するものがあると良いかもしれない。スコアリングツールで -p するとprivateのスコアが出るとかにして、そのオプションの存在は隠しておくとか、csvをツールにかけるとサーバーに結果を送信するとかすれば実現できると思う。 ただ、限られた時間できちんとバリデーションする時間があるかと言われると……

最後に

1位の賞品です。

f:id:ejinote:20180416091854j:plain

毛……長くね……? ちなみにスーモはマリモじゃないらしいです。