俵言

しがない社会人が書く、勉強とかのこと。最近は機械学習や kaggle 関連がメイン。

感想文:Pythonトリック ~真に効果的なPythonプログラミング手法~

最近全くブログを書いてないのでリハビリとして読書感想文を書くことにしました。よくよく考えると本をちゃんと全部読み切ったのもかなり久々かも。

最近まで「Kaggle!」「機械学習!」みたいなテンションを続けていたのに少し疲れてしまった感があり、こう、すぐ役立つかわからないけど興味本位で基礎的な知識を入れるという行為をしたくなったんだと思います*1

読んだ本

Pythonトリック

Pythonトリック

  • 作者:Dan Bader
  • 発売日: 2020/04/15
  • メディア: 単行本(ソフトカバー)

去年の4月に発売された本です。その少し前に出た 自走プログラマー ~Pythonの先輩が教えるプロジェクト開発のベストプラクティス120 と一緒に買ったのですが、気づけば積んだまま一年経ってました😇

あらゆる場面で活躍するプログラミング言語Python。 本書はそんなPythonをマスターし、日々のプログラミングに活用したい熱心な方々のための1冊です。

入門書を一通り終えた駆け出しプログラマには、Pythonの機能や特徴をより深く、 また他言語から新たにPython習得を目論むベテランには、コードの書き方の差異を、 リスト内包や文字列フォーマットなど、さまざまなサンプルを元に教授してくれます。

著者のDan Baderは、Twitterでのアウトプットに端を発する、いわゆるTips紹介の延長線上で、この本を執筆しました。 そのため、各種Tipsに対するさまざまなフィードバックと、よりよく伝えるためのアイデアが盛り込まれ、 結果、Pythonをより深く知り、より良いコードを書くための知識が集積された書籍となりました。

つまり本書は、もっとすごいPython開発者になりたいあなたを、 強力にサポートする1冊です。

雑に内容紹介すると、細かいけど知っておくと役に立つ tips や、Python 上級者たちが使いこなしているであろう強力な機能、仕様に一歩踏み込んだ Python 知識を集めた本です。長年 Python を使っている割に使いこなしている気になれない僕にはちょうど良い本だったのかなと思います。

対象読者

本文中でも明言されているのですが、この本は Python をある程度使っている Pythonista がレベルアップするための本という位置づけです。初心者がいきなりこの本を読むのはかなりハードルが高く、その場合は別の本を読んだ方が良いと思います。

一方で、以下の目次を読んだときに「人のコードで見たことあるけど使い方はよく知らないな」「使ったことあるけど仕組みをよくわかってないな」ってなる人にはかなりお勧めしたい本です*2

CHAPTER 1 はじめに

1.1 Pythonトリックとは何か

1.2 本書はどのように役立つか

1.3 本書の読み方

 

CHAPTER 2 よりクリーンなPythonのためのパターン

2.1 アサーションによる安全対策

2.2 無頓着なコンマの配置

2.3 コンテキストマネージャーとwith文

2.4 アンダースコアとダンダー

2.5 文字列のフォーマットに関する衝撃の事実

2.6 「The Zen of Python」の隠しコマンド

 

CHAPTER 3 効果的な関数

3.1 Pythonの関数はファーストクラスオブジェクト

3.2 ラムダは単一式の関数

3.3 デコレータの威力

3.4 *argsと**kwargs

3.5 引数のアンパック

3.6 ここから返すものは何もない

 

CHAPTER 4 クラスとオブジェクト指向プログラミング

4.1 オブジェクトの比較:”is”と”==”

4.2 文字列変換:すべてのクラスにreprが必要

4.3 カスタム例外クラスを定義する

4.4 趣味と実益を兼ねたクローンオブジェクトの作成

4.5 抽象基底クラスは継承に待ったをかける

4.6 名前付きタプルは何に役立つか

4.7 クラス変数とインスタンス変数の落とし穴

4.8 インスタンスメソッド、クラスメソッド、静的メソッドの謎を解く

 

CHAPTER 5 Pythonの一般的なデータ構造

5.1 ディクショナリ、マップ、ハッシュテーブル

5.2 配列

5.3 レコード、構造体、DTO

5.4 セットとマルチセット

5.5 スタック(LIFO

5.6 キュー(FIFO

5.7 優先度付きキュー

 

CHAPTER 6 ループとイテレーション

6.1 パイソニックなループの書き方

6.2 内包を理解する

6.3 リストのスライスとすし演算子

6.4 美しいイテレータ

6.5 ジェネレータは単純化されたイテレータ

6.6 ジェネレータ式

6.7 イテレータチェーン

 

CHAPTER 7 ディクショナリのトリック

7.1 ディクショナリのデフォルト値

7.2 趣味と実益を兼ねたディクショナリのソート

7.3 ディクショナリを使ってswitch/case文をエミュレートする

7.4 型破りなディクショナリ式

7.5 ディクショナリのいろいろなマージ法

7.6 ディクショナリの出力を整える

 

CHAPTER 8 パイソニックな生産性向上テクニック

8.1 Pythonのモジュールとオブジェクトを調べる

8.2 仮想環境を使ってプロジェクトの依存関係を分離する

8.3 バイトコードの裏側を覗く

 

CHAPTER 9 最後に

9.1 Python開発者のためのメールマガジン

9.2 PythonistaCafe:Python開発者のコミュニティ

おすすめポイント

個人的にとてもありがたかったのは コンテキストマネージャー、デコレータ、yield 文 が解説されていたことでした。これらは僕の中の「見たことあるけど使いこなせてない Python の機能ランキング」top10 に間違いなく入る機能達*3ですが、この本を読んだことで初めて使い方を理解できた気がします。

Python の基礎知識を深める内容としては、関数がファーストクラスオブジェクトである点、クラスの一歩踏み込んだ理解、データ構造の比較 あたりもおすすめです。ここら辺の内容は結構知っている部分も多かったのですが、改めてまとまった説明を読むと再発見があって楽しく読めました。

Tips としては アンダースコアの意味、引数のアンパックあたりが意外と知られてないことがある気がします。また、個人的にはイテレータチェーンでパイプラインを作る話がとても衝撃的で、イテレータへの理解が深まった気がします。

全体としては、各項目について簡単な例でわかりやすく説明していることと、ユースケースや著者のベストプラクティスが記載されているのが良い点だと思っています。機能を沢山紹介されるとどれを使っていいのか迷いがちなんですが、そこに関してもアドバイスがあるのはとてもありがたいです。

おわりに

書きすぎると本の中身をそのまま紹介しそうなのでここらへんで筆を置きます。

僕のように目次の中に「見たことあるけど使いこなせていない機能」がある方は是非とも読んでいただきたいです。ページ数も200ページとそんなに多くなく、Python をある程度使える人がステップアップする取っ掛かりとしてはとても良い本なんじゃないでしょうか。

僕もこの本を読んだことで Python の知識を深めたい欲が増してきたので、次は積んでいる Fluent Python をちょっとづつ切り崩していきたいです。目指せ 玄人 Pythonista !

Fluent Python ―Pythonicな思考とコーディング手法

Fluent Python ―Pythonicな思考とコーディング手法

  • 作者:Luciano Ramalho
  • 発売日: 2017/10/07
  • メディア: 単行本(ソフトカバー)

*1:「いや機械学習Python 使ってますやん」という突っ込みは脇に置いておく

*2:僕は「見たことあるけどよくわかってないな」と感じる項目があったのでとても役に立ちました

*3:Twitter 等でアンケート取っても上位に来る気がします

黒魔術への招待:Neural Network Stacking の探求

この記事は Kaggle Advent Calendar 2020 の16日目の記事です。去年ネタ記事*1を書いたので今年は真面目なやつにしました。

はじめに

 Kaggler はコンペにおいてあらゆる手段を用いて評価指標の改善を目指します。特徴量エンジニアリング、モデルや学習手法の試行錯誤、特殊な前処理・後処理の考案、はたまた Leakage の利用に至るまで、ルールを破らない範囲であれば何でもする*2のが Kaggler です。今挙げた例はそのコンペ固有の性質(データの生成過程・分布、評価指標、... etc.)に着目することで大きな効果をもたらす場合が多いのですが、一方でいずれのコンペにおいても一定の効果が得られる手法があります。それは複数のモデルの予測結果を統合して予測を行う Ensemble です。Ensemble は統合するモデルに多様性があるほど性能が向上すると一般に知られており、(別々のやり方で)競い合っていたライバル達とチームマージして順位を一気に伸ばす参加者もしばしば見受けられます。このため、コンペ終盤にメダルの border が一気に上がって参加者が苦しむのも Kaggle でよく見られる光景です。
  記事のタイトルにも入っている Stacking は、大雑把に言うと Ensemble の中でも各モデルの予測値を特徴量として新たなモデルを学習させる手法のことを指します。過去コンペの solution*3*4 で行われた Stacking の複雑さから†黒魔術†なんて言われたりもしますね。注意深く扱わないと local data に overfit して大惨事(Big Shake Down)になりかねませんが、時に強力な決め手ともなり得る手法だと考えています。 (Stacking の詳細や注意点については Kaggle Ensembling Guide*5 や Kaggle 本*6 の "7章 アンサンブル" をご覧ください。)

 本記事では Stacking の中でも比較的新しい部類である(と僕が勝手に思っている) Neural Network を用いた Stacking をいくつか紹介し、特に Stacking するのが面倒な Multi-Label Classification のタスクで比較検討して行きます。


この記事が参考になりそうな方:

  • NN の扱いをある程度心得ており、学習・推論が一通りできる Kaggler
  • 仕組みとか気にしないのでとにかく score を上げたい Kaggler
  • NN を用いた Stacking に興味がある Kaggler

この記事を読まない方が良いと思われる方:

  • Kaggle 初心者、もしくはこれから Kaggle 始めたいって方 (闇に魅入られてはなりません)
  • Stacking の理論的な部分に興味がある方(僕は気分でやってるだけなので何もわかりません...)
  • Ensemble は甘えだと思っている玄人 Kaggler (精進するので許して...)

目次

  • はじめに
  • Stacking を Neural Network でやると何が嬉しいの?
  • 使用する Competition Data
  • Stacking に使用する Model
    • MLP
    • 1D-CNN
    • 2D-CNN
    • GCN
  • 結果
    • Stacking 元の Model の Score
    • 各 Stacking Model の Score
    • Take Me Higher
  • 終わりに
  • 付録
続きを読む

小ネタ:LightGBM の callback が何を受け取るのか確認する

懲りずにまた LightGBM ネタです。前回*1が重すぎてしばらくブログ書くことは無いだろうと思っていたのですがふと思い付きました。

諸事情により LightGBM の callback を実装したくなったのですが、公式 docs の説明*2を読んだだけだと、

  • callbacks (list of callables or None, optional (default=None)) – List of callback functions that are applied at each iteration. See Callbacks in Python API for more information.


関数っぽいものを渡すんだろうけど何を受け取るのかよくわからんなということで、調べると共に備忘録を残すことにしました。

目次

  • callback 関数が受け取るもの
  • 百聞は一見に如かず
  • おわりに
  • 余談
続きを読む

LightGBM で強引に Multi-Task(は???) Regression を行う

!!注意!!:この記事の内容は率直に言って全く褒められた行為ではありません。それをご了承の上でネタとしてご覧ください。

はじめに

前回*1に引き続き今回も LightGBM のお話です*2。前回はちょい使いどころがある話でしたが、今回に関しては本当に誰得ネタだと思います。

僕自身は DSB2019 の反省*3*4をしている際に Regression 用の Custom Objective の作り方を学び、前回の記事を書いている中で Binary Classification についても作り方を学びました*5 。 その流れで「んじゃ今度は Multi-Class でもやってみるか~」となり、更にその流れで「Multi-Task はどうなんや?」となってこの記事を書くに至りました。タイトルで「Multi-Task(は???) Regression」となっているのはこの表現が合っているのか自信が無い & 実装上の理由*6があって、 これについては後程説明します。

先におことわりしておくと、僕は GBDT の仕組みを何となくしか理解しておらずあくまで外部仕様を把握して使っているという状態です。なので、この記事が誤った内容や不正確な内容を含んでいる可能性は多分にあり、またそれを非常に恐れています。読む方は疑いの目線を持って読んで頂きつつ、誤りを発見してもどうか...どうか優しくしてください😇

目次

  • はじめに
  • 準備:Multi-Class Classification 用に Custom Objective を作る
  • 本題:じゃあ Multi-Task はどう?
  • これって意味あるの?
  • 本当に... 本当に意味は無い?
  • おわりに
  • 参考: GBDT の multi-class classification に関する情報
  • おまけ:他に方法はあるの?

*1:https://tawara.hatenablog.com/entry/2020/05/09/162633

*2:小ネタにしては長すぎたのでタグは付けていない

*3:https://umi-log.com/kaggle-dsb-mtg/

*4:https://www.slideshare.net/TakujiTahara/201200229-lt-dsb2019-ordered-logit-model-for-qwk-tawara

*5:長くなるので記事中には登場しませんでしたが。

*6:LightGBM の 内部実装を理解している方はこの時点で多分わかると思います。

続きを読む