Kaggle PetFinderコンペで優勝しました
Kaggleで開催されていた「PetFinder.my Adoption Prediction」コンペ*1で優勝しました*2。
素晴らしいチームメイトに恵まれた思い出深いコンペです。開催から1年近く経過した今でもチーム「Wodori」のSlackでは活発に議論が交わされており、常に互いに刺激を受けながら切磋琢磨できていると感じます。
Wodoriのチームメイトの皆さまには、私が3月に出版するKaggle入門書*3の技術観点でのレビューも快く引き受けていただきました。Kaggle GrandmasterやKaggle Masterの称号を持っている方々に深く議論に参加していただき、より良い書籍に仕上げられたことを大変嬉しく思っています。
本記事の締め括りとして、本コンペの取り組みに関する公開済の情報を下記にまとめておきます。
Kaggle Discussion
Kaggle Notebook
takuoko's GitHub
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']
『効果検証入門』をPythonで
年末年始に『効果検証入門 ~正しい比較のための因果推論/計量経済学の基礎』(技術評論社)*2を読みました。具体例多めで、良くあるハマりどころが解説されている良本だと思います。内容は根本のランダム化比較実験から始まり、回帰分析・傾向スコア・差分の差分法・回帰不連続デザインまでを扱っています。
勉強のため、Rで実装されているサンプルコード*3をPythonで書き換えながら手を動かしてみました。一度通読しただけでは理解が浅かった箇所など気になった部分のみですが、GitHubでコードも公開しています*4。
その中で、RData形式で公開されているデータセットを扱う場面がありました。少し調べてみたところ、rdata
というパッケージが使いやすかったです。pipでのインストールが可能で、ドキュメントはありませんでしたがGitHubのtestコード*5からコードを流用しました。
おわりに
本記事では、『効果検証入門』のサンプルコードをPythonで実装する際に必要になったRData形式のデータセットをPythonで読み込む方法を紹介しました。なお同書のPython実装については、Qiitaにて @nekoumei さんが公開してくださっています*6。
移設した銀座線・渋谷駅から浅草駅まで歩いてみた
2020年初挑戦として、恒例の徒歩企画です。今回は、本日移設した銀座線・渋谷駅*1から、終点の浅草駅まで歩いてみました。
全長は約14kmで、iPhoneの地図アプリでは直線距離で徒歩にて2時間50分の道のりでした。
渋谷
表参道
外苑前
新橋
銀座
京橋
神田
上野
おわりに
3時間くらいでの到着になりました。2020年もボチボチやっていきたいと思います。目指すは、全路線制覇です。
銀座線、渋谷から浅草・浅草寺への初詣⛩🚶♂️ pic.twitter.com/lwgSEfTkf7
— u++ (@upura0) January 3, 2020
2019年をザッと振り返る
2019年をサクッと振り返ります。2018年の振り返り記事を見ると、次のような目標を書いていました*1。まだまだ力不足な面ばかりですが、ご縁に恵まれて昨年末には考えられない経験がいくつもできた一年だったと感じています。
引き続き「地道にコツコツ取り組む」のが目標です。2019年末に振り返った際に、「現時点の自分が想像できないような自分」がそこに居たら嬉しいなと思っています。
Kaggle
4月に結果が公開された「PetFinder.my Adoption Prediction」コンペ*2にて、準優勝できました。その後、6月の「LANL Earthquake Prediction」コンペ*3にて銀メダルを獲得し、Kaggle Masterの称号を得ることもできました。
Competitionsだけではなく、KernelsやDiscussionでも称号を獲得できました。
Kaggleのプロフィール*4から(2019年12月30日時点)
12月には「Kaggle Days Tokyo」*5も開催され、大いにKaggleで盛り上がった一年となりました。
AtCoder
競技プログラミングのAtCoderにて、3月に水色になることができました。
今後とも精進します(2完速解き……) pic.twitter.com/43RnlGHGvd
— u++ (@upura0) March 30, 2019
Sports Analyst Meetup
2月に第1回を開催した「Sports Analyst Meetup」の運営に関わりました。多くの方々のご協力を得て、1年で5回も開催できました。
対外発表
次の場で発表する機会を頂きました。
- 「172+192+372=2019」, 第75回R勉強会@東京 (#TokyoR), 2019年1月20日.
- 「機械学習を⽤いた⽇経電⼦版Proのユーザ分析」, Data Driven Developer Meetup #4, 2019年1月22日.
- 「目標達成に導くデータ分析 スポーツ分析チュートリアル」, Sports Analyst Meetup #1, 2019年2月24日.
- 「技術アウトプットを支える技術」, 白金鉱業 Meetup Vol.6, 2019年3月4日.
- 「29組のデータアナリストに同じデータセットと同じ質問を与えても、分析結果がバラバラだったという研究」, Data Driven Developer Meetup 【番外編 好きな論文について語る会】 #1, 2019年4月22日.
- 「社外で探る自分のキャリア」, 【ESTYLE AI LOUNGE】データアナリスト・機械学習エンジニアの実情とAIキャリアの築き方, 2019年6月27日.
- 「PK戦の先攻有利は「ABBA方式」で変わるか?」, Sports Analyst Meetup #3, 2019年6月30日.
- 「PetFinder 2nd Place Solution」, Kaggle Tokyo Meetup #6, 2019年7月13日.
- 「機械学習を用いた大相撲千秋楽の勝敗予想」, Sports Analyst Meetup #4, 2019年8月24日.
- 「なんでデータサイエンティストやってるの?」, なんでデータサイエンティストやってるの? 〜 思い描いていた自分を思い出すために。 vol.4, 2019年9月6日.
- 「技術力で世界と戦う機械学習コンペティション「Kaggle」の魅力」, AIchi勉強会, 2019年9月7日.
- 「Kaggle Grandmasterに聞く!-トップデータサイエンティストの過去・現在・未来-」, 一般社団法人データサイエンティスト協会 6thシンポジウム 〜実務者が集うデータサイエンスの最前線〜, 2019年10月17日.
- 「KaggleとRコンペの紹介」, Japan.R 2019, 2019年12月7日.
書籍
10〜11月は、2020年3月に講談社から出版する『Pythonではじめる Kaggleスタートブック』の執筆に捧げる時間が多かったです。
徒歩
本ブログの定期シリーズの徒歩企画では、次の4ルートを歩きました。東大キャンパス企画で始まり、東大キャンパス企画で終わった一年でした。
ボルダリングも年末に始めました。運動はボチボチと続けていきたいと思います。
今日はボルダリングデビューしてきた!誤差逆伝播が大切だとニューラルネットワークに教えてもらったので、めちゃくちゃ挑戦してめちゃくちゃ失敗した😘腕がぷるぷる。 pic.twitter.com/yLV2DevmOR
— u++ (@upura0) December 20, 2019
はてなブログ
今年も年間100本の記事を執筆できました。読者は昨年末の約170人から300人以上増えて、現時点で500人弱となっています。
「Weekly Kaggle News」と冠したニューズレターも始めてみました。
おわりに
2019年はいろんな出会いがあり、多くの人に支えられて楽しい時間を過ごすことができました。2020年(からと言わず明日大晦日)も、引き続き地道にコツコツ取り組んでいきたいなと思います。
東大の駒場キャンパスから本郷キャンパスまで歩いてみた
2019年の暮れの挑戦として、東大の駒場キャンパスから本郷キャンパスまで歩いてみました。2019年頭では東大の本郷キャンパスから柏キャンパスまで歩いた*1ので、対としての挑戦になります。
懐かしい場所に来た pic.twitter.com/aQy1Kf1hVF
— u++ (@upura0) December 28, 2019
11kmの道のりで、サクッと歩けました。iPhoneでは2時間半の予想でしたが、実際は1時間半くらいで到着しました。
この徒歩の間に、来年の登壇2本の内容を大まかに考えることができました。ずっと机に座っていてもアイディアがまとまる訳ではないので、たまに歩くのは良いなあと思います。
来年もボチボチと頑張っていきたいです。
ニューズレター「Weekly Kaggle News」創刊
ProbSpace給与推定コンペまとめ
「ProbSpace」というプラットフォームで開催された「給与推定」コンペが23日に終了しました。私は途中で まぐちさん とチームを組み、最終順位は7位でした。
PublicとPrivateが分かれていないのは残念でしたが、恐らく独自に作成したデータセットを用いた、初学者でも取り組みやすい程よい難易度に設定されたコンペだったと思います。discussionシステムも存在していました。
本記事では、上位陣が公開した解法をまとめます。
一覧
1位
https://prob.space/competitions/salary-prediction/discussions/senkin13-Post46bdfde9468e3d01f4e7
1位の方は、5段階の処理を経て最終的な予測値を算出していました。
- LightGBMで152の特徴量を用いて予測
- LightGBMの残差が120未満のデータのみをダウンサンプリングして、Neural Networkで予測
- Neural Networkの残差が129未満のデータのみをダウンサンプリングして、Neural Networkの残差を新しいtargetにして、LightGBMで予測
- LightGBMの残差が129未満のデータのみをダウンサンプリングして、LightGBMで予測
- trainのtargetの値でtestを埋める後処理(trainとtestが似ている2件のみ)
残差を取りながらの多段推論がここまで効果を発揮するとは驚きでした。このアイディアはKaggle「Predicting Molecular Properties」コンペのCPMPさんの7位解法*1を参考にしたそうです*2。
2位
2位の方は、480個のNeural Networkのアンサンブルでした。「Feature Encoding」と呼んでいる手法で特徴量自体を480通りに変換しているそうで、とてもユニークな取組だと感じました。
「Feature Encoding」というのは私が勝手につけた名前で、本当は別の名前があるかもしれません。
— 武田敦志 (@atushiTAKEDA) December 22, 2019
給与コンペの場合、12個の特徴量(1個は手動作成)から16次元の連続値ベクトルに変換(Encode)していました。この変換のパターンを480種類作り、これらの出力ベクトルをNNの入力値としていました。
4位
4位の方は、Neural NetworkのSeed値を変えながらのアンサンブルのようです。活性化関数の利用回数を意図的に減らすなどで、過学習への対策をしていました。
6位
6位の方もNeural Networkのアンサンブルで、10個を混ぜたそうです。
給与コンペ、上位2名とも NN 使ってますね。僕も NN 10個のアンサンブルで6位でした。カテゴリ変数を NN でエンコーディングするのが効くコンペだったみたいです。
— maruyama (@rntrnaru) December 23, 2019
7位
最終的なベストスコアは、Neural NetworkとLightGBMの重み付き和でした。チームマージ時点で、まぐちさんがNeural Network、私がLightGBMを進めていました。私の具体的な取り組みについては、discussionに投稿済です。
10位
特徴量エンジニアリング+LightGBMという、テーブルデータコンペの王道の取り組みでした。個人的に興味深かったのは次のデータ水増しです。今回は恐らく独自に作成したデータセットなので、特に効果を発揮する可能性があったと思います。
EDAからsexとtargetだけに注目すると2変数間に関係がなさそうだったので、試しにtrainのsexだけを反転させたデータを元のtrainにくっつけてデータ量を2倍にして学習しました。
おわりに
本記事では、ProbSpaceで開催された給与推定コンペの上位陣解法をまとめました。
*2: Hi,CPMP, my using residuals idea is from your solution of Predicting Molecular Properties,that help improved a lot,then I found using more stages, and different features at every stage can improve much more,thanks a lot.