u++の備忘録

Kaggle PetFinderコンペで優勝しました

Kaggleで開催されていた「PetFinder.my Adoption Prediction」コンペ*1で優勝しました*2

f:id:upura:20200111165805p:plain

素晴らしいチームメイトに恵まれた思い出深いコンペです。開催から1年近く経過した今でもチーム「Wodori」のSlackでは活発に議論が交わされており、常に互いに刺激を受けながら切磋琢磨できていると感じます。

Wodoriのチームメイトの皆さまには、私が3月に出版するKaggle入門書*3の技術観点でのレビューも快く引き受けていただきました。Kaggle GrandmasterやKaggle Masterの称号を持っている方々に深く議論に参加していただき、より良い書籍に仕上げられたことを大変嬉しく思っています。

本記事の締め括りとして、本コンペの取り組みに関する公開済の情報を下記にまとめておきます。

Kaggle Notebook

www.kaggle.com

takuoko's GitHub

github.com

Presentation Slides

RData形式のデータセットをPythonで読み込む

Tl;DR

rdataパッケージ*1を用いて、次のようにRData形式のデータセットを読み込める。

import rdata


parsed = rdata.parser.parse_file('../data/vouchers.rda')
converted = rdata.conversion.convert(parsed)
vouchers = converted['vouchers']

f:id:upura:20200106124807p:plain

『効果検証入門』をPython

年末年始に『効果検証入門 ~正しい比較のための因果推論/計量経済学の基礎』(技術評論社*2を読みました。具体例多めで、良くあるハマりどころが解説されている良本だと思います。内容は根本のランダム化比較実験から始まり、回帰分析・傾向スコア・差分の差分法・回帰不連続デザインまでを扱っています。

勉強のため、Rで実装されているサンプルコード*3Pythonで書き換えながら手を動かしてみました。一度通読しただけでは理解が浅かった箇所など気になった部分のみですが、GitHubでコードも公開しています*4

その中で、RData形式で公開されているデータセットを扱う場面がありました。少し調べてみたところ、rdataというパッケージが使いやすかったです。pipでのインストールが可能で、ドキュメントはありませんでしたがGitHubのtestコード*5からコードを流用しました。

おわりに

本記事では、『効果検証入門』のサンプルコードをPythonで実装する際に必要になったRData形式のデータセットPythonで読み込む方法を紹介しました。なお同書のPython実装については、Qiitaにて @nekoumei さんが公開してくださっています*6

移設した銀座線・渋谷駅から浅草駅まで歩いてみた

2020年初挑戦として、恒例の徒歩企画です。今回は、本日移設した銀座線・渋谷駅*1から、終点の浅草駅まで歩いてみました。

全長は約14kmで、iPhoneの地図アプリでは直線距離で徒歩にて2時間50分の道のりでした。

f:id:upura:20200103212531p:plain

渋谷

f:id:upura:20200103212535j:plain

表参道

f:id:upura:20200103212653j:plain

外苑前

f:id:upura:20200103212700j:plain

新橋

f:id:upura:20200103212746j:plain

銀座

f:id:upura:20200103212754j:plain

京橋

f:id:upura:20200103212801j:plain

神田

f:id:upura:20200103212823j:plain

上野

f:id:upura:20200103212902j:plain

浅草

f:id:upura:20200103212936j:plain

浅草寺で初詣も行きました。

f:id:upura:20200103212928j:plain

おわりに

3時間くらいでの到着になりました。2020年もボチボチやっていきたいと思います。目指すは、全路線制覇です。

2019年をザッと振り返る

2019年をサクッと振り返ります。2018年の振り返り記事を見ると、次のような目標を書いていました*1。まだまだ力不足な面ばかりですが、ご縁に恵まれて昨年末には考えられない経験がいくつもできた一年だったと感じています。

引き続き「地道にコツコツ取り組む」のが目標です。2019年末に振り返った際に、「現時点の自分が想像できないような自分」がそこに居たら嬉しいなと思っています。

Kaggle

4月に結果が公開された「PetFinder.my Adoption Prediction」コンペ*2にて、準優勝できました。その後、6月の「LANL Earthquake Prediction」コンペ*3にて銀メダルを獲得し、Kaggle Masterの称号を得ることもできました。

upura.hatenablog.com

upura.hatenablog.com

Competitionsだけではなく、KernelsやDiscussionでも称号を獲得できました。

f:id:upura:20191229184944p:plain Kaggleのプロフィール*4から(2019年12月30日時点)

12月には「Kaggle Days Tokyo」*5も開催され、大いにKaggleで盛り上がった一年となりました。

upura.hatenablog.com

AtCoder

競技プログラミングAtCoderにて、3月に水色になることができました。

Sports Analyst Meetup

2月に第1回を開催した「Sports Analyst Meetup」の運営に関わりました。多くの方々のご協力を得て、1年で5回も開催できました。

upura.hatenablog.com

対外発表

次の場で発表する機会を頂きました。

書籍

10〜11月は、2020年3月に講談社から出版する『Pythonではじめる Kaggleスタートブック』の執筆に捧げる時間が多かったです。

upura.hatenablog.com

徒歩

本ブログの定期シリーズの徒歩企画では、次の4ルートを歩きました。東大キャンパス企画で始まり、東大キャンパス企画で終わった一年でした。

upura.hatenablog.com

upura.hatenablog.com

upura.hatenablog.com

upura.hatenablog.com

ボルダリングも年末に始めました。運動はボチボチと続けていきたいと思います。

はてなブログ

今年も年間100本の記事を執筆できました。読者は昨年末の約170人から300人以上増えて、現時点で500人弱となっています。

f:id:upura:20191229193914p:plain

「Weekly Kaggle News」と冠したニューズレターも始めてみました。

upura.hatenablog.com

おわりに

2019年はいろんな出会いがあり、多くの人に支えられて楽しい時間を過ごすことができました。2020年(からと言わず明日大晦日)も、引き続き地道にコツコツ取り組んでいきたいなと思います。

東大の駒場キャンパスから本郷キャンパスまで歩いてみた

2019年の暮れの挑戦として、東大の駒場キャンパスから本郷キャンパスまで歩いてみました。2019年頭では東大の本郷キャンパスから柏キャンパスまで歩いた*1ので、対としての挑戦になります。

11kmの道のりで、サクッと歩けました。iPhoneでは2時間半の予想でしたが、実際は1時間半くらいで到着しました。

f:id:upura:20191229025054p:plain

この徒歩の間に、来年の登壇2本の内容を大まかに考えることができました。ずっと机に座っていてもアイディアがまとまる訳ではないので、たまに歩くのは良いなあと思います。

来年もボチボチと頑張っていきたいです。

ニューズレター「Weekly Kaggle News」創刊

「Weekly Kaggle News」と冠したニューズレター*1を始めてみました。

www.getrevue.co

日本語で、Kaggleをはじめとするデータ分析コンペティションに関する話題を取り扱う予定です。週次で、毎週金〜日ごろの更新を予定しています。

f:id:upura:20191228134316p:plain

個人的に、SNSが存分に普及した現代だからこそのニューズレターの価値が少し気になりました。いつまで続けるか未定ですが、のんびり続けてみたいと思います。

ProbSpace給与推定コンペまとめ

「ProbSpace」というプラットフォームで開催された「給与推定」コンペが23日に終了しました。私は途中で まぐちさん とチームを組み、最終順位は7位でした。

prob.space

PublicとPrivateが分かれていないのは残念でしたが、恐らく独自に作成したデータセットを用いた、初学者でも取り組みやすい程よい難易度に設定されたコンペだったと思います。discussionシステムも存在していました。

本記事では、上位陣が公開した解法をまとめます。

一覧

Rank Link
1 https://prob.space/competitions/salary-prediction/discussions/senkin13-Post46bdfde9468e3d01f4e7
2 https://twitter.com/atushiTAKEDA/status/1208773041682956288?s=20
https://prob.space/competitions/salary-prediction/discussions/takedarts-Post6725a11b22813a3997d7
4 https://prob.space/competitions/salary-prediction/discussions/Yuhei0320-Post4766b7be57ac41cd505b
6 https://twitter.com/rntrnaru/status/1208901691518533637?s=20
https://prob.space/competitions/salary-prediction/discussions/maruyama-Post521eef51a86df217de38
7 https://prob.space/competitions/salary-prediction/discussions/upura-Post29db854982f9d802bb7b
10 https://prob.space/competitions/salary-prediction/discussions/physyuki-Post5fc459a996222908d0bd

1位

f:id:upura:20191223163329p:plain https://prob.space/competitions/salary-prediction/discussions/senkin13-Post46bdfde9468e3d01f4e7

1位の方は、5段階の処理を経て最終的な予測値を算出していました。

  1. LightGBMで152の特徴量を用いて予測
  2. LightGBMの残差が120未満のデータのみをダウンサンプリングして、Neural Networkで予測
  3. Neural Networkの残差が129未満のデータのみをダウンサンプリングして、Neural Networkの残差を新しいtargetにして、LightGBMで予測
  4. LightGBMの残差が129未満のデータのみをダウンサンプリングして、LightGBMで予測
  5. trainのtargetの値でtestを埋める後処理(trainとtestが似ている2件のみ)

残差を取りながらの多段推論がここまで効果を発揮するとは驚きでした。このアイディアはKaggle「Predicting Molecular Properties」コンペのCPMPさんの7位解法*1を参考にしたそうです*2

githubでコードも公開してくださっています*3

2位

2位の方は、480個のNeural Networkのアンサンブルでした。「Feature Encoding」と呼んでいる手法で特徴量自体を480通りに変換しているそうで、とてもユニークな取組だと感じました。

4位

4位の方は、Neural NetworkのSeed値を変えながらのアンサンブルのようです。活性化関数の利用回数を意図的に減らすなどで、過学習への対策をしていました。

6位

6位の方もNeural Networkのアンサンブルで、10個を混ぜたそうです。

7位

最終的なベストスコアは、Neural NetworkとLightGBMの重み付き和でした。チームマージ時点で、まぐちさんがNeural Network、私がLightGBMを進めていました。私の具体的な取り組みについては、discussionに投稿済です。

10位

特徴量エンジニアリング+LightGBMという、テーブルデータコンペの王道の取り組みでした。個人的に興味深かったのは次のデータ水増しです。今回は恐らく独自に作成したデータセットなので、特に効果を発揮する可能性があったと思います。

EDAからsexとtargetだけに注目すると2変数間に関係がなさそうだったので、試しにtrainのsexだけを反転させたデータを元のtrainにくっつけてデータ量を2倍にして学習しました。

おわりに

本記事では、ProbSpaceで開催された給与推定コンペの上位陣解法をまとめました。

*1:www.kaggle.com

*2:

*3:github.com