u++の備忘録

Pythonを用いたKaggle入門書を2020年3月に講談社から出版します

このたびご縁があり、Pythonを用いたKaggle入門書を講談社から出版する運びとなりました*1。現在デザインや校正などを進めている段階で、発売開始は2020年3月17日を予定しています。

https://www.amazon.co.jp/dp/4065190061

同人誌ながら累計2500部以上を売り上げている『Kaggleのチュートリアル*2を執筆したカレーさんとの共著です。

私がQiitaに投稿した「Kaggleに登録したら次にやること ~ これだけやれば十分闘える!Titanicの先へ行く入門 10 Kernel ~」*3と、カレーさんの『Kaggleのチュートリアル』を基にした書籍です。この2つのコンテンツを土台に、さらなる内容も盛り込みながら「初学者向けのKaggle入門書の決定版」を目指して執筆を進めています。

f:id:upura:20191203164651p:plain

本書の前半では、初学者向けチュートリアルの「Titanic : Machine Learning from Disaster」コンペを題材にKaggleの基礎を学びます。本書でも随所で言及していますがTitanicは必ずしも初学者向けではない面があり、単にTitanicの実践方法を知るだけでなく、次なるコンペにご自身の力で取り組むために必要な知見の習得を意識しています。

後半では複数テーブル・画像データ・テキストデータの扱い方も簡単に解説します。本書を読み終えた後に必要となりそうな情報として、参加するコンペの選び方や初学者にお勧めの戦い方も紹介し、分析環境に関する情報などさらなる学びに向けた参考資料なども掲載予定です。

本書の特徴として、特に次の6つが挙げられます。

  1. Kaggle入門に特化した、チュートリアル形式の書籍である
  2. 章や節単位で具体的な話題が設定され、体系的かつ段階的に汎用的な知見を学ぶ構成になっている
  3. 次なるコンペに進むための道標として、複数テーブル・画像データ・テキストデータの扱い方も解説している
  4. 筆者二人ともに「Kaggle Master」の称号を持ち、賞金獲得経験がある
  5. 地の文での解説だけでなく筆者二人の対談も随所に盛り込み、多角的にKaggleの魅力を語っている
  6. プログラミングやPythonの初学者のために、サンプルコードも丁寧に解説している

本書は「実践Data Scienceシリーズ」の2作目の書籍となる予定です。

「基本をより実践的に!」を合言葉に、データサイエンスで用いられる各種手法の基本を、プログラミングの実装とともに解説していきます。 はじめて学ぶ大学生、大学院生、ソフトウェアエンジニアに向けた注目の新シリーズです。

本書では付録として、サンプルコードを詳細に解説しました。Python初学者を想定し、変数・リストなどのプログラミングの基礎的な内容も取り扱っています。「機械学習が分からない」「Pythonが分からない」「Kaggleの仕組みが理解できない」「英語で書かれていて取っつきにくい」など、初学者がKaggleに取り組む上で生じるさまざまな障壁に対応できる書籍を目指しています。『Kaggleで勝つデータ分析の技術』*4で前提とされている部分を補完するような内容になると思います。

本書の更新情報は、本ブログや講談社サイエンティフィクtwitter*5などで告知予定です。これからまだまだ作業は残っていますが、少しでも多くの皆さまの参考になるような書籍になるよう精進していきます。

【書籍メモ】『経済セミナー12・1月号』特集「機械学習は経済学を変えるのか」

Twitterで流れてきた『経済セミナー12・1月号』特集「機械学習は経済学を変えるのか」が面白そうだったので購入しました。簡単にメモしておきます。


所感

冒頭のPKSHA Technology代表取締役の上野山勝也さんと、イェール大学助教授の成田悠輔先生の対談は、示唆深い内容が多かったです。

前半は、機械学習を用いることで経済学で言うところの「回帰不連続デザイン」の状況を作り出せるという話など、機械学習と経済学の接点について議論が交わされます。両者の専門の立場から対談の土壌を擦り合わせている印象でした。経済学の問題に機械学習を利用する文脈で、優れた予測モデルが発表されると「その裏を取る」人々が出現して予測モデルの整合性が崩れるという話は、意外な視点で考えさせられました。

後半では、機械学習モデルの公平性の問題や、教師あり学習では目的などを人間が設計する必要がある点など、機械学習を社会問題に適用する際の問題点に関する議論が多かったです。選挙や宗教など、あまり機械学習や情報処理の文脈では出てきづらい話題も登場していて、個人的満足感も高かったです。

続く4つの寄稿は、いずれも対談で言及されたような経済学✕機械学習の話題でした。1本目は両者の強み・弱みを踏まえつつ因果を扱う観点で融合しつつある側面を事例と共に紹介しています。2本目は近年SNSでも時折話題になる公平性の話題で、信用履歴・再犯予測・オンライン広告などの背景・事例・今後の展望を概観しています。3本目は主に深層学習での特徴量抽出の性質を取り上げ、解釈に向けた研究や経済学的な利用が可能かを議論しています。4本目は対談にも登場した成田先生らによる原稿です。経済学におけるランダム化比較実験や回帰不連続デザインと解釈できるような特徴が機械学習から生み出されるという、経済学と機械学習の両者を橋渡しするような興味深い話でした。

  1. 経済分析のツールとしての機械学習
  2. 機械学習に潜む公平性の問題
  3. 機械学習はデータを解釈できるのか?
  4. 機械学習は自然実験を作り出す

購入方法

ご丁寧に公式アカウントにご教示いただきました。


おわりに

本記事では『経済セミナー12・1月号』特集「機械学習は経済学を変えるのか」を紹介しました。特に対談は、大学時代に講義でお話を聞いたことのある上野山さんと、先日集中講義*1を受講した成田先生で、「俺得」な対談だなあと感じました。

f:id:upura:20191201174823p:plain

「Sports Analyst Meetup」 #spoana を2019年に5回開催した話

「スポーツアナリティクス Advent Calendar 2019」*1の1日目の記事です。

はじめに

スポーツデータ分析を題材にした「Sports Analyst Meetup」*2というイベントの運営に関わっています。2019年2月に初開催し、ご好評もあり合計5回に渡って開催することができました。

スポーツアナリストおよびスポーツデータ分析に興味のある方に向けたコミュニティです。
本コミュニティはスポーツのジャンルを問わずスポーツアナリスト(を目指す人)にとって有益な情報共有の場になることを目的としています。

本記事では、全5回を振り返る形でSports Analyst Meetup、通称「spoana」を紹介します。

発足の背景

spoana発足のきっかけは、2018年の「Japan.R」というイベントでした。Japan.Rは年に一度開催されている統計処理ソフトウェア「R言語」に関する勉強会です。

このイベントでは多くの方がR言語を用いた分析結果などを発表しており、スポーツを分析対象にした発表が何件かありました。その流れで「スポーツに絞った勉強会を開催しても面白いのではないか」となり、分科する形で開催が計画されました。

詳細は発起人の tsuyupon さんがブログにまとめています*3

第1回(2月24日)

connpass, togetter, blog

第1回は報知新聞社さんに会場をご提供いただき、2月24日に開催しました。30分程度の「ロングトーク」+1人10分弱の「ライトニングトーク(LT)」という構成で、この構成は第5回まで継続しています。

ロングトークは自分が担当し、事業会社のデータ分析職の視点から「目標達成に導くデータ分析」と第して講演しました。

LTは初回にも関わらず多くのご応募をいただき、12件の発表がありました。競技はF1、サッカー、登山、自転車、野球、バスケ、ゴルフ、テニス、フィギュアスケートと多岐にわたっており、企画趣旨に沿ったイベントが実現できたと感じました。

イベントは「パ・リーグ インサイト」に取材を受けたり*4、発表者の方が個別の取材を受けたり*5、想像以上の反響となりました。多くの方々のご協力を得て、spoanaというイベントの可能性を感じた第1回となりました。

第2回(5月12日)

connpass, togetter, blog

第2回はデータスタジアムさんに会場をご提供いただき、5月12日に開催しました。

第1回の実績のおかげか、実務としてスポーツ分析に関わるお二方にロングトークをお願いすることができました。

小山浩之さんからは、自転車競技の適切なペース配分設定に遺伝的アルゴリズムを活用している話をお聞きしました。「山奥での開催もあり、計算資源との戦いもある」など、実際に現場で取り組む方ならではの意見が印象的でした。

加藤健太さんには、ブラインドサッカー日本代表のデータ分析の取り組みについて、ブラインドサッカーというスポーツの特性を捉え、適切な課題を設定し現場と合意し、分析に至るなどの過程も含めてご紹介いただきました。データ分析という文脈だとスポーツでも「モデリング以外の部分」が大切なんだなあという確認もでき、興味深いお話でした。

LTは10件で、バドミントン、相撲、セーリング、卓球、登山、サッカー、バスケットボール、部活動と幅広い応募を頂きました。

第3回(6月30日)

connpass, togetter, blog

第3回はダイナミックプラスさんに会場をご提供いただき、6月30日に開催しました。

ロングトークは萩元徹さんに「Jリーグ導入事例から見えてきた、ダイナミックプライシングの未来」という題目でご発表いただきました。近年多くのスポーツで導入が進むダイナミックプライシングの仕組みを開発する会社での事例をご紹介いただき、勝敗とは違った観点でのスポーツ分析の領域を知ることができました。スポーツの可能性の大きさを改めて実感しました。

LTは怒涛の18本でした。競技はバドミントン、フリスビー、テニス、ラグビー、野球、サッカーがあり、レーティングやオリンピックを題材にした発表もありました。また「e sports」の文脈で「Magic the Gathering」というカードゲームを紹介した方もいらっしゃいました。

現場でスポーツ分析に取り組む方から、普段はIT企業で開発している方など、多種多様な方々がスポーツデータ分析という文脈で集まってくださっているなあと感じています。

第4回(8月24日)

connpass, togetter, blog

第4回はSportipさんが入居しているNTTドコモベンチャーズさんに会場をご提供いただき、8月24日に開催しました。

ロングトークはSportipの高久侑也さんと、スポーツ分析業界で実際に働き始めたTKB84さんにお願いしました。

高久さんがCEOを務めるSportipは、競技者の動きや姿勢など個人のデータを収集・分析できるような仕組みを提供しています。プロ野球選手らに実際に提供しているアプリのデモも含めて、Sportipの取り組みやビジョンなどをご紹介いただきました。

TKB84さんは「スポーツ分析業界に飛び込んで半年で見えてきた、現状の概観と今後の展望」という題目での発表でした。ご自身の経歴や現状の分析、そして「今後どのような人材が求められるか」という展望などの生々しい話も含めて語っていただきました。

LTは12件、競技は器械体操、ボウリング、ダーツ、大相撲、トライアスロン、バスケットボール、ラグビー、野球、サッカーでした。以前のLT登壇の反響をご共有くださった方や、自分の第3回でのLTを追加検証してくださった方もいて、一定回数を重ねてきたことを実感した場面が多かったです。

第5回(11月2日)

connpass, togetter, blog

第5回はDeNAさんに会場をご提供いただき、11月2日に開催しました。

ロングトークはKaggle繋がりで以前から親交のあった大越拓実さんと、システム会社として野球界を支援しているライブリッツ株式会社の安田峻さんにお願いしました。

大越さんは『マネーボール』に代表される野球でのデータ活用について概説し、具体的な分析手法の事例をご紹介くださいました。第1回開催時から個人的にいつか発表してほしいと思っていた方で、遂に実現して本当に嬉しかったです。

安田さんは、データを活用して野球界をより良くする仕組みについての発表でした。データを横断的に共有できる基盤を作るのはスポーツ業界に限らず大切なことで、素晴らしい取り組みだなあと感じました。システムの費用対効果をどのように示すかはなかなか難しいなと考えさせられる面もあり、野球界へのIT支援の実情が垣間見えたお話でした。

LTは11件で、会場やロングトークの影響か、野球が4件と一番多かったです。その他に競技はゴルフ、バスケットボール、テニス、サッカーで、スポーツ文脈で確率分布を解説した方もいらっしゃいました。

おわりに

本記事では、全5回を振り返る形でSports Analyst Meetupを紹介しました。過去の発表資料はこちらにまとまっています。気になった発表があれば、ぜひご覧ください。

spoanaは、来年以降も定期的に開催予定です。特に来年2020年は東京五輪が開催され、スポーツがますます盛り上げっていくと期待しています。

スポーツ×データ分析に興味がある方がざっくばらんに交流できる場を目指しています。ぜひお気軽にご参加ください。

渋谷駅から横浜駅まで東横線を歩いてみた

何となく気分が乗ったので、渋谷駅から横浜駅まで東横線を歩いてみました。本ブログの定期シリーズの第4弾です。

  1. 山手線*1
  2. 東大本郷キャンパス〜柏キャンパス*2
  3. 千代田線*3

Tl;DR

  • 東横線の渋谷駅〜横浜駅は全長24.2 kmとハーフマラソンくらいの距離感*4
  • 終了直後のスカイスパ*5で即入浴&飲酒🍺は至高
  • 長距離徒歩に慣れてきて達成感が逓減してきた

出発:渋谷駅

f:id:upura:20191130171014p:plain

出発は渋谷駅。午前10時過ぎに移動を開始しました。iPhoneのマップアプリで調べたところ、徒歩では横浜駅まで5時間41分の道のりでした。

f:id:upura:20191130170937p:plain

渋谷駅〜日吉駅

大学1、2年次に住んでいた日吉駅を一つの目標としていました。全駅の写真は、次のtwitter投稿にぶら下げています。

13時には、無事に日吉駅に到着しました。学生時代によく行った安くて量が多いSガスト*6がまだ残っていて、ついつい入店してしまいました。

f:id:upura:20191130171552j:plain

日吉駅横浜駅

日吉駅から横浜駅までは、特に感慨もなく淡々と到着してしまった感があります。定期的に長距離徒歩をやり過ぎて、慣れてきてしまったのかもしれません。

f:id:upura:20191130172151p:plain

スカイスパ

ゴール直後に汗を洗い流し、一杯キメられるのは、最高です。


おわりに

本記事では、渋谷駅から横浜駅まで東横線を歩いてみた体験談をまとめました。東横線は一直線の道が多く、常にマップアプリを開かずとも次の駅が分かりやすい印象がありました。ゴール後の横浜駅のスカイスパは最高ですし、長距離徒歩入門には最適かもしれません(そんなジャンルは無い)。

「マイナビ × SIGNATE Student Cup 2019: 賃貸物件の家賃予測」まとめ

はじめに

マイナビ × SIGNATE Student Cup 2019: 賃貸物件の家賃予測」コンペ(マイナビコンペ)が11月上旬に終了しました。賃貸物件の家賃予測を題材とした学生限定のコンペです。私は学生ではないため参加できなかったのですが、SIGNATEのコンペには珍しく取り組みの共有が認められていたので、ざっと眺めてみました。

signate.jp

一覧

Rank Link
1~3, 11* https://signate.jp/competitions/182/summary
1 https://www.slideshare.net/ssuserf0844f/zozei
https://github.com/analokmaus/signate-studentcup2019
7 https://github.com/Anguschang582/Signate---Student-Cup-2019---7th-solution
10 https://github.com/OctopCat/SIGNATE_mynavi2019/blob/master/ApproachSummary.md
11* https://speakerdeck.com/shogonagano/expert-x-contibutor-mainabikonpe2019-aideashang-shou-shang-suraido
https://chizuchizu.com/2019/11/19/chizu_data/
12 https://mosamosa.hatenadiary.jp/entry/2019/11/12/191142
https://mosamosa.hatenadiary.jp/entry/2019/11/13/112939
20 https://kyouyap.hatenablog.com/entry/2019/11/13/145836
24 https://twitter.com/ykskks/status/1192680578367098880
29 https://www.acceluniverse.com/blog/developers/2019/11/3-814953-signate-23.html
34 https://tellmoogle.hatenablog.com/entry/signate_mynavicomp_losers_solution
88 https://masanori.hateblo.jp/entry/2019/11/08/175710
90 https://kutohonn.hatenablog.com/entry/2019/11/08/101512
https://github.com/kuto5046/signate

*イデア

コンペ概要

所在地・間取り・築年数などが与えられ、東京23区における賃貸物件の賃料を予測するコンペでした。

評価関数

評価関数は、RMSE(Root Mean Squared Error)でした。比較的外れ値の影響を受けやすい指標です*1

データ

データに関して特徴的な点は、次の2つだったようです*2

  1. trainとtestに同一の建物内の物件が存在する
  2. 外れ値となる高額物件が存在する

前者について、同一の建物内の物件は賃料も似ている、もしくは階に比例して変動するなど、比較的予想が容易になると考えられます。 これらの物件をどのように扱うかが勝負の鍵となったようです。

後者は、評価関数がRMSEであるため、本コンペでは重要な問題となりました。

目的変数の賃料の分布は次の通りです(画像は共に*3から引用)。trainの中に家賃50万円以上の物件は123件しかなかったそうです*4

f:id:upura:20191121191152p:plain f:id:upura:20191121191206p:plain

また外部データの利用も許可されており、緯度・経度などを多くのチームが活用していた模様です。

コンペ設計

コンペの参加者は724人で、チーム参加も可。一度でも投稿したのは302チームでした。

SIGNATEのコンペには珍しく参加者が公式に議論できる「フォーラム」*5も存在していました。ただし、さほど活発な議論は行われていないようでした。*6でも言及がありますが、KaggleやPropSpace*7など他のデータ分析プラットフォームとは異なり、SIGNATEには議論に対するポイントなどの動機づけがないことが理由の一つだと考えられます。

表彰

評価関数の優れている上位5チームには「予測精度賞」として表彰されます。モデルやデータ分析の創意工夫点を評価する「アイデア賞」も存在し、提出したレポート優れていた1チームが選出されました。

予測精度賞(1位解法)

最終順位は次の通りです。1位チームが1カ月近く首位を走り続けたらしく、最終スコアでも頭一つ抜けている印象があります。

f:id:upura:20191121192448p:plain

1位チームのモデル構成は次の通りです(画像はスライドから引用)。

f:id:upura:20191121193128p:plain

前処理・特徴量エンジニアリング

  • 住所・間取り・最寄り駅・路線などの表記揺れの修正と名寄せ
  • 緯度・経度
  • 公示地価情報
  • 最寄り駅の利用者数
  • 各物件の各区からの距離(の逆比)

建物IDの付与

trainとtestに同一の建物内の物件が存在するという特徴に対応すべく「建物ID」を定義していました。具体的には、住所の一部・建物構造・築年数・最上階数が一致するデータは、同一の建物に存在すると見なしたようです。

同一建物内での回帰モデル

同一の建物内の物件は比較的予想が容易という特徴を活かし、次のフローチャートに沿って線形回帰で予測したそうです(画像はスライドから引用)。同一建物内であっても面積と賃料に相関がない場合は対象としない工夫があり、データを丁寧に分析していると感じました。

f:id:upura:20191121194322p:plain

CatBoost

線形回帰の対象外となったデータについては、3種類のCatBoostで予測しています。このとき、目的変数を賃料ではなく「単位面積当たりの賃料」に変換したとのことです。この変換は、7位の方も試しており「アンサンブルに寄与した」とのコメントがあります。

CVは、建物IDを用いたGroupKFoldを使っていました。同一の建物内の物件については既に予測済であることを考えると、非常に妥当な選択だと考えられます。ここでGroupKFoldを使わない場合、ある種の「リーク」が発生してしまいCVスコアが不当に良く出てしまう可能性があります*8

Pseudo Labeling*9を使ったデータの水増しも行っていました。先述の線形回帰の予測値のうち正確だと思われる一部のデータを利用することで、trainを31470件から46290件まで増やしていたそうです。

特徴量の重要度を見ると、港区からの距離や公示地価情報など、特徴量エンジニアリングで追加した特徴量が上位に来ていました。

Stacking

データの特徴を考慮した2種類のStacking*10を実施していました。スライドでは、それぞれ「Stratified Stacking」「Adaptive Stacking」として紹介されていました。共に思考停止でアンサンブルするのではない工夫があり、素晴らしいと思いました。

Stratified Stacking

区ごとに異なる賃料の傾向を掴むため、全量を用いてCatBoostで学習した後、区ごとに束ねて、Ridge回帰でStackingしたそうです。

Adaptive Stacking

外れ値となる高額物件が存在する問題に対応するため、全量を用いてCatBoostで学習した後、特徴量を分析した結果外れ値を取りうる物件だと期待される群を抽出して、Ridge回帰でStackingしたそうです。

イデア

イデア賞は最終結果で11位だったチームが選ばれました。個人的に一番興味深かったアイデアを紹介しておきます。その他、「McCatRank」*11も特徴量エンジニアリングの選択肢として持っておきたいなと思いました。

賃料と合わせて緯度・経度も予測するMulti-modal NNを学習

賃料だけでなく緯度・経度も予測するNNを学習させていました。10月に開催された「Kaggle Days China*12」のオフラインコンペで優勝したtakuokoさんの解法を参考にしているそうです*13

複数の目的変数を設定することで性能を向上させるテクニックは近年いろいろな分野で採用されている印象はあります*14が、テーブルデータだけでなく周辺の地図の画像データも入力して扱っている点も含めて、面白いアプローチだなあと感じました。

おわりに

本記事では、マイナビコンペの解法をまとめました。やはり個々人が取り組みを共有できるコンペは良いなあと改めて感じました。

*1:門脇ら, Kaggleで勝つデータ分析の技術, 技術評論社, p. 63, 2019.

*2:

www.slideshare.net

*3:tellmoogle.hatenablog.com

*4:github.com

*5:https://signate.jp/competitions/182/discussions

*6:mosamosa.hatenadiary.jp

*7:prob.space

*8:門脇ら, Kaggleで勝つデータ分析の技術, 技術評論社, pp. 107-108 & 278-279, 2019.

*9:門脇ら, Kaggleで勝つデータ分析の技術, 技術評論社, pp. 266-267, 2019.

*10:門脇ら, Kaggleで勝つデータ分析の技術, 技術評論社, pp. 360-368, 2019.

*11:tech.preferred.jp

*12:kaggledays.com

*13:github.com

*14:data.gunosy.io

J2降格からJ1復帰にかかった年数をまとめた

諸事情*1でJ2降格に関する情報が気になっている今日このごろ、J2降格からJ1復帰にかかった年数をまとめてみました。降格・昇格チームの一覧*2を見ながら、手作業で処理しました。

f:id:upura:20191110141209p:plain

良い可視化方法が思いつかなかったので、一旦は表形式です。元データはGitHub*3に置いておきます。

「第二回全国統一プログラミング王決定戦予選」参加録

「第二回全国統一プログラミング王決定戦予選」に参加してA, Bの2完でした。約7カ月ぶりのRated参加だったこともあり、「あまりを計算し忘れる」という初歩的な見落としで爆死しました。。。

atcoder.jp

f:id:upura:20191109225056p:plain

A - Sum of Two Integers(100点)

  • 偶数と奇数で場合分け
N = int(input())
print((N-1)//2)

B - Counting of Trees(300点)

  • ノード1からの距離で分類して、距離0から1ずつ段階的に考える
    • 前の距離のノードがa個、今の距離のノードがb個ある場合、選択肢がa**b通り増える
    • 入力例3の場合は、1*1*(2**3)*(3**1)で24通りになる
  • いくつかコーナーケースがあるのに注意
    • 距離0のノードは1のみの1個でなければ不可能
    • [0 1 1 3]のように、距離の欠損があると不可能

f:id:upura:20191109225948p:plain

import collections


N = int(input())
D = list(map(int, input().split()))

c = collections.Counter(D)

max_D = max(D)
ans = 1
previous_leaf = 1

if D[0] != 0:
    ans = 0
elif c[0] != 1:
    ans = 0
else:
    for i in range(1, max_D+1):
        ans *= (previous_leaf ** c[i])
        ans %= 998244353
        previous_leaf = c[i]

print(ans)