u++の備忘録

「Sports Analyst Meetup #10」をオンラインで開催しました #spoana

「Sports Analyst Meetup #10」*1を、6月26日に開催しました。第7回以降はオンライン開催に切り替えて、今回で記念すべき第10回を迎えました。

togetter

togetter.com

発表内容

今回はロングトーク1本、LT4本という構成でした。イベント後には、オンライン以降初となる懇親会にも挑戦しました。

ロングトークでは、東京大学運動会ア式蹴球部の木下さんに、データ分析の具体的な事例をご共有いただきました。togetterでも驚きの声がいくつも確認できますが、私自身もかなり高度な取り組みの数に圧倒された発表でした。

LTで扱われた競技はサッカー・テニス・野球でした。1本目はサッカーのチーム守備評価を2つの行動からモデリングした研究の紹介で、チーム成績との相関など興味深い部分が多い内容でした。2本目はテニスの動画からプレイの開始時点を抽出するタスクに取り組んだ発表で、自力でのアノテーションも含めた試行錯誤が印象的でした。3本目の投球フォーム推定は披露してくださったライブデモの正確さに衝撃を受けました。4本目は野球での配球の分析に因果推論を駆使した内容で、因果推論の面白さと奥深さを感じる内容でした。

f:id:upura:20210628195510p:plain

懇親会は、Zoomのブレイクアウトルームを活用して実施しました。実施方法は運営一同、適切な方法を模索中ですが、今回はイベント本番から円滑に移行できるという利点を評価しZoomを選択しました。2020年末のアップデートで、共同ホストに設定しなくても参加者が自由にブレイクアウトルーム間を移動できる設定が追加されていたのも大きかったです。

アーカイブ

オンライン開催の利点を活かして、発表者の許諾が得られた内容については、YouTubeアーカイブを掲載していく予定です。

www.youtube.com

おわりに

今回も多くの方にご参加・ご発表いただき、誠にありがとうございました。 イベントの最後に告知しましたが、次回はデータ分析イベントの企画を進めています。詳細は準備ができ次第公開予定ですので、乞うご期待ください。

【書籍メモ】『教養としてのデータサイエンス』(講談社)

出版社のご厚意でお送りいただいた『教養としてのデータサイエンス』(講談社)を読みました。豪華な著者陣による「文理を問わず、すべての大学生に、数理・データサイエンス・AIを習得させることを目的として編纂された」書籍です*1

書籍情報

内容の概要や目次、著者概要などは以下で確認できます。

bookclub.kodansha.co.jp

所感

平易な文でサクサク読み進められました。カラーの図や、時おり挿入されるコラムも理解の助けとなります。つまみ食いしていける構成になっているので、ある程度この領域への知見があれば、1時間でサラッと読める感じの印象です。昨今のデータサイエンスにまつわるキーワードをどんどん拾っていけるので、今後学びを深めていく上での良い取っ掛かりとなると思います。個人的には第3章のデータや人工知能の取り扱う際の留意事項が特に勉強になりました。k匿名化やEUの一般データ保護規則(GDPR)など、近年議論を呼んでいる話題についてもまとめられています。本書では専門家である著者が、一般向けに可能な限り平易な表現でデータサイエンスの話題を解説しています。自分自身が誰かにデータサイエンスの概要を紹介するときに、参考にできる部分も多いと感じました。

【書籍メモ】『BERTによる自然言語処理入門 Transformersを使った実践プログラミング』(オーム社)

『BERTによる自然言語処理入門 Transformersを使った実践プログラミング』(オーム社)をサラッと読みました。近年の自然言語処理領域の飛躍的発展のきっかけとなった BERT について、理論と実践をバランス良く取り上げた良書だと感じました。

書籍情報

内容の概要や目次、サンプルのPDFは以下で確認できます。

www.ohmsha.co.jp

所感

書名に「実践プログラミング」とある通り、Google Colaboratory 上に用意されているソースコードで BERT を実践していく部分が肝になっている書籍ではありますが、理論的な面も図を駆使してある程度詳細に触れているのが好印象でした。第3章まで機械学習自然言語処理・BERTの一般的な説明をした後、第4章以降から具体的にライブラリを使っていく構成になっており、理論と実践を明瞭に切り分けている部分も親切だと感じます。実践の章でも、適宜 print で途中経過を表示しており、個別の処理の内容を丁寧に説明している印象を受けました。本書で利用している「Huggingface Transformers」は自然言語処理のさまざまな処理に対応するインターフェイスが豊富に用意されている故に、個人的には時にあまり頭を使わずサンプルコードをコピペしてしまいがちです。使ったことがある関数についても、改めて理解を深める良い機会となりました。

実践では、自然言語処理の題材としてイメージしやすい分類だけではなく固有表現抽出・校正・類似文検索の話題も扱っています。初学者の方にとっては、自然言語処理の応用例の幅広さを知るきっかけになりそうです。日本語のデータセットが使われているのも相まって、身近な事例への適用を考えやすくなると思います。サンプルコードも Google Colaboratory 上に用意されており、特別な環境構築も不要で流用しやすくなっています。文書分類などの章では「PyTorch Lightning」が使われています。個人的には最近使っているライブラリなので特に問題なくむしろ望ましいことでしたが、あまり PyTorch 自体や PyTorch Lightning に慣れていない方にとっては、自然言語処理に直接は関係ない部分で理解のための時間を費やしてしまうかもしれません。

自然言語処理の領域は、2018年末の BERT の登場以来、飛躍的な進歩を生み出しています。一方で発展の速さの影響があり、BERT やライブラリの使い方について体系的にまとまった日本語の書籍はあまりありませんでした。本記事の最後に、今回出版までこぎつけた筆者や出版社の方々のご尽力に、お礼申し上げます。

Kaggle「BirdCLEF 2021 - Birdcall Identification」参加録

Kaggle「BirdCLEF 2021 - Birdcall Identification」*1に参加し、102位でした*2。Kaggler の知人が何人か参加していたので興味を持ち、残り9日から参戦しました。

やったことは以下の通りです。音声を題材にしたコンペに初めて取り組みましたが、学習用データセットの構築や拡張に一手間かかる点や、画像変換後は多種多様な選択肢が広がる点など、やることが非常に多い印象を受けました。

  • kkiller さんが公開していたコード*3を軸に調整
  • 学習もいくつか試行錯誤したが、所要時間がかかることから最終的には不採用
  • 手元のデータに対する結果がよくなるような閾値や後処理を検討
  • 最終の推論 https://www.kaggle.com/sishihara/birdclef-2021-inference

*1:www.kaggle.com

*2:本コンペでは100位まで銅メダル

*3:www.kaggle.com

LightGBMの特徴量の順序変更が重要度に与える影響

同一の質問を何度か見かけたので、次回はリンクを貼って解決するためのメモです。

Q: 特徴量の順番を変えたら、重要度や精度が変わりましたが、なぜでしょうか?

A1: 学習時のハイパーパラメータ feature_fraction の影響かもしれません

LightGBMの学習時のハイパーパラメータの一つに feature_fraction があります。高速化や過学習の抑制を目的に、一部の特徴量を選択して学習するための機能です。デフォルトの値は 1.0 ですが、利用する特徴量の割合を 1 未満に設定している場合、選択が実行されます。順番を変えることで、選ばれる特徴量に影響が出る可能性があります。

lightgbm.readthedocs.io

A2: 2つの特徴量で得られる利得が同一の場合、インデックスの小さい特徴量が選ばれる仕様だからです

LightGBM のような決定木系のアルゴリズムでは、与えられたデータセットをより良く表現できるよう、さまざまな特徴量でのデータ分割方法を探索します。その探索において、2つの特徴量で得られる利得が同一の場合は、インデックスの小さい特徴量が選ばれる仕様になっています。順番を変えることで、選ばれる特徴量に影響が出る可能性があります。

github.com

Kaggle の Code Competitions で処理済ファイルやライブラリを使う

近年の Kaggle では、参加者が Kaggle の Code 環境上でソースコードを実行する「code competitions」形式でのコンペ開催が増えています。実行時間や処理内容など諸条件はコンペごとに異なります*1が、モデルの学習を事前に実施し、評価用データセットに対する推論コードのみを提出する形式が一般的です。不正対策などの要因で、インターネットの利用は禁じられている場合が多いです。本記事では、この形式のコンペで、処理済ファイルを使ったり、ライブラリをインストールしたりする方法を紹介します。

処理済ファイルの利用

推論部分のみのコードを提出する形式の場合、学習済モデルや前処理済ファイルなどは、Kaggle の datasets 機能を用いて notebook の input に追加できます。過去のコンペで公開されている notebook が参考になります。datasets には公開設定があるので、コンペ開催中は private に設定しておくと良いでしょう。

www.kaggle.com

ライブラリのインストール

Kaggle の Code 環境上 にはあらかじめ機械学習の処理で頻繁に使われるライブラリがインストールされています*2。コンペによってはインストールされていない特別なライブラリを使いたい場合がありますが、インターネットが使えない状況では notebook 上で pip install することができません。画像やテキストを題材にしたコンペでは、ニューラルネットワークのための事前学習済の重みを読み込みたい場合もあります。

このような時は、以下の投稿を参考にインストールに必要なファイルを含む datasets を input に追加し、notebook から直接実行します。有名なライブラリの場合は既に他の参加者が datasets として保存・公開している場合もあります。参加しているコンペや類似コンペの公開 notebook を確認すると良いでしょう。

www.kaggle.com

おわりに

本記事では、code competitions での datasets の利用方法を紹介しました。

*1:Overview の Code Requirements のページを確認しましょう

*2:github.com

Solafune「夜間光データから土地価格を予測」コンペ 6 位解法

衛星データに関するコンペティションプラットフォーム「Solafune」で開催されていた「夜間光データから土地価格を予測」コンペ*1で、 6 位になりました。終了直前の参加だったので、優勝した方が公開していた特徴量に少し足して、pseudo labeling で水増しした程度の解法です。後述しますが、ある程度の順位変動が予想できたので、あまり突き詰めることはなく放置してお祈りしていました。

コンペ概要

夜間光データを元に土地価格を予測するコンペでした。データセットで与えられている列は目的変数を含めて 5 つのみでした。土地価格を推定する回帰問題です。その他の詳細は、他の参加者の方が公開しているブログ記事*2を参照してください。

解法概要

コンペ用の GitHub リポジトリを公開したので、Commit ログを辿ると具体的な雰囲気が分かるかもしれません。

github.com

私がコンペに参戦したのが 3 月 30 日で、終了まで残り 1 週間足らずでした。その時点でも上位に相当するスコアが出るベースラインの記事*3が公開されていたので、こちらを軸に進めることに決めました。

具体的には、当該記事で紹介されていた特徴量を丸々流用しつつ、最終的に以下の 377 個の特徴量を生成しました。

  • 当該記事の特徴量
  • 元々の特徴量
  • カテゴリ変数をラベルに置換
  • カテゴリ変数を登場回数に置換
  • カテゴリ変数を軸にした集計

この特徴量を用いて、LightGBM および CatBoost のモデルを作成しました。2 つの出力を、検証用データセットに対する性能が最大化するように重み付き平均することで、最終的な予測値としています。

コンペでは、しばしば全ての予測値を定数倍することで順位表のスコアが良くなる場合があります。今回、予測値をそれぞれ 0.9、0.8 倍したところ、以下のような結果が得られました。0.9 倍の予測値を提出した時点で public の順位表で 10 位に入りました。データセットがそれほど大きくないコンペだったこともあり、今回は以下のような意思決定をしました。

  • 定数倍で順位を上げても private には反映されなさそう
  • public の順位表の上位がどれほど後処理を頑張っているのか読めないので、ある程度頑張ったらコンペを終了してお祈りすれば良さそう
public private
original 0.490048 0.494568
original * 0.9 0.483107 0.497904
original * 0.8 0.501885 0.526949

最終的には、少しでも private で使われているデータセットに強いモデルにしようと思い、評価用データセットに対して疑似ラベルを付与する「pseudo labeling」を実施したところでコンペを終了しました。最終提出は 2 つ選ぶことができたので、定数倍の有無で 2 種類を用意しました。

順位はある程度の想像通り定数倍をしていない提出が最良のスコアを取り、public の 14 位から private の 6 位になりました。5 位までが入賞圏内で少々残念ですが、自分のデータセットに対する勘所を確認できた点で有意義なコンペだったなと感じます。

運営・参加者の皆さまにお礼申し上げます。

f:id:upura:20210430234327p:plain