CUBE SUGAR CONTAINER

技術系のこと書きます。

Python

Python: scikit-learn の LabelEncoder を説明変数の変換に使うのは誤り

scikit-learn の LabelEncoder を説明変数の変換に使っている例はたくさん見つかる。 しかし、実は本来 LabelEncoder は目的変数の変換に使うことが想定されていることは、あまり知られていない。 これは公式のドキュメントで確認できる。 scikit-learn.org …

Python: Pandas 2 系ではデータ型のバックエンドを変更できる

Pandas の 2 系から、新たにデータ型のバックエンドという考え方が導入された。 これは、端的にいうと DataFrame のデータをどのような形式で持つかを表している。 たとえば Pandas 2.0.0 の時点では、次の 3 つからバックエンドを選ぶことができる。 NumPy …

Python: Polars の DataFrame をゼロコピーで Pandas の DataFrame に変換する

Polars の DataFrame は to_pandas() メソッドを使うことで Pandas の DataFrame に変換できる。 このとき、デフォルトではメモリのコピーが生じる。 pola-rs.github.io ただし、オプションとして use_pyarrow_extension_array=True を渡すとゼロコピーで変…

Python: Polars で各種エンコーダを実装したライブラリ「Shirokumas」を作った

最近は Polars が気に入っていて、主にプライベートで使っている。 ただ、エコシステムという観点では Pandas に比べて発展途上の段階にあると思う。 そこで、今回は発展の一助として「Shirokumas」というライブラリを作ってみた。 github.com どんなライブ…

Python: DuckDB と Polars を組み合わせて使う

DuckDB のバージョン 0.7 で Polars とのインテグレーションが強化された。 たとえば Polars の DataFrame に対して DuckDB の Python API で直接クエリを発行できるようになったらしい。 また、DuckDB で実行したクエリの結果を Polars の DataFrame に変換…

Python: LightGBM の学習率と精度および最適なイテレーション数の関係について

勾配ブースティング決定木 (Gradient Boosting Decision Tree; GBDT) では、以下が経験則として知られている。 学習率 (Learning Rate) を下げることで精度が高まる 一方で、学習にはより多くのイテレーション数 (≒時間) を必要とする しかしながら、上記が…

Python: Polars で行・列が省略されないようにする

今回は Python のデータフレームライブラリの Polars で、データフレームを表示するときに行と列が省略されないようにする方法について。 結論から先に述べると、省略したくないときは pl.Config.set_tbl_cols() と pl.Config.set_tbl_rows() に負の整数 (た…

Target Encoding のスムージングについて

Target (Mean) Encoding の出典は、2001 年の ACM SIGKDD Explorations Newsletter, Volume 3, Issue 1 に掲載された以下の論文らしい。 https://dl.acm.org/doi/10.1145/507533.507538 この論文には Target Encoding のスムージングに関する詳しい記述があ…

Python: PyTorch でバックプロパゲーションが上手くいかない場所を自動で見つける

PyTorch を使っていると、はるか遠く離れた場所で計算した結果に nan や inf が含まれることで、思いもよらない場所から非直感的なエラーを生じることがある。 あるいは、自動微分したときにゼロ除算が生じるようなパターンでは、順伝搬の結果だけ見ていても…

Python: category_encoders の CatBoostEncoder を用いた OrderedTS の算出と多値分類タスクへの拡張について

データ分析コンペなどでよく利用される Target Encoding という特徴量抽出 (Feature Extraction) の手法がある。 これは、ターゲット (目的変数) の情報に基づいて、カテゴリ変数ごとの期待値を説明変数として利用するもの。 Target Encoding には、いくつか…

Python: Pandas で np.float16 はサポートされていない

まったく知らなかったんだけど、Pandas はカラムの型として NumPy の float16 (16 ビット浮動小数点型) をサポートしていない。 これは、以下の Issue で説明されている。 どうやら、プラットフォームによっては float16 を利用できないため対応が難しいらし…

pyenv を使って Ubuntu に複数バージョンの Python をインストールする

今回は Python のインストールマネージャである pyenv を使って、簡単に複数のバージョンの Python を Ubuntu にインストールする方法を書く。 Python でソフトウェアを開発する際には、バージョン間の差異に配慮する必要がある。 そのため、開発する環境で…

Ubuntu の APT で入る Python 仮想環境系のパッケージを使う

最近は Docker などのコンテナ技術の台頭もあって、プログラミング言語に固有の仮想環境を使う人は以前より減った印象がある。 とはいえ、手元でササッと検証するときなどには便利なことに変わりはない。 今回は、Ubuntu を使って APT で入る Python の仮想…

いつの間にか MLflow Tracking Server が Artifact のプロキシに対応していた

以前の MLflow Tracking Server では、アーティファクトを保存する場所については URI としてクライアントに伝えるだけだった。 クライアントは、サーバから教えてもらった URI に自分でつなぎにいく。 この形では、アクセスするためのクレデンシャルがそれ…

Python: 集約特徴量を作るための scikit-learn Transformer 互換クラスの実装例について

ふと、集約特徴量を作るための scikit-learn Transformer 互換な実装を巷であまり見かけないなと思った。 そこで、自作しているものを公開してみる。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 12.4 BuildVersion: 21F79 $ py…

Apple Silicon 版の Mac で Miniforge を使ってサードパーティ製のパッケージをインストールする

これを書いている現在 (2021-11)、Apple Silicon 版の Mac を使って Python の開発環境を整えようとすると、なかなかしんどい。 しんどさの主な要因は、サードパーティ製のパッケージが Apple Silicon をまだサポートしていない場合が多い点にある。 たとえ…

Python: PyTorch の MultiheadAttention を検算してみる

今回は、言わずと知れた Transformer 1 において、処理の中心的な役割を果たしている (とされる) Multi-Head Attention を扱ってみる。 これは、Scaled Dot Product Attention という処理を改良したもの。 PyTorch には Multi-Head Attention の実装として M…

Python: Luigi の DateIntervalParameter について

バッチ処理に特化した Python のデータパイプライン構築用のフレームワークに Luigi がある。 今回は、特定の時系列的な範囲を Task が受け取るのに使える DateIntervalParameter というパラメータを紹介する。 これは、たとえば一週間とか一ヶ月あるいは特…

Python: Luigi の RangeDaily 系の使い方と注意点について

Python の Luigi はバッチ処理に特化したデータパイプライン構築用のフレームワーク。 バッチ処理に特化しているとあって、定期的に実行する系のユーティリティも色々と用意されている。 今回は、その中でも特定の期間に実行すべきバッチ処理をまとめて扱う…

Python: PyTorch の GRU / LSTM を検算してみる

以前のエントリで扱った Simple RNN の検算は、個人的になかなか良い勉強になった。 blog.amedama.jp そこで、今回は Simple RNN の改良版となる GRU (Gated Recurrent Unit) と LSTM (Long Short Term Memory) についても検算してみる。 使った環境は次のと…

Python: PyTorch の RNN を検算してみる

今回は、PyTorch の RNN (Recurrent Neural Network) が内部的にどんな処理をしているのか確認してみる。 なお、ここでいう RNN は、再起的な構造をもったニューラルネットワークの総称ではなく、いわゆる古典的な Simple RNN を指している。 これを書いてい…

Python: Google Colaboratory で Cloud TPU を TensorFlow から試してみる

Google Colaboratory では、ランタイムのタイプを変更することで Cloud TPU (Tensor Processing Unit) を利用できる。 Cloud TPU は、Google が開発しているハードウェアアクセラレータの一種。 利用することで、行列計算のパフォーマンス向上が期待できる。…

Python: Session State API で Streamlit をステートフルにする

これまで Streamlit で書いた Web アプリケーションは、基本的にステートレスだった。 つまり、何らかのイベントが生じてアプリケーションのコードが再評価されると、ウィジェットを除くほとんどすべてのオブジェクトの状態はリセットされていた。 アプリケ…

Python: TFRecord フォーマットについて

TFRecord フォーマットは、TensorFlow がサポートしているデータセットの表現形式の一つ。 このフォーマットは、一言で表すと TensorFlow で扱うデータを Protocol Buffers でシリアライズしたものになっている。 特に、Dataset API との親和性に優れていた…

Python: Luigi でタスク共通のパラメータを扱う

今回は、Luigi で複数のタスクが共通のパラメータを扱う方法について考えてみる。 ここらへん、調べてもあまりドキュメントなどが出てこなかった。 なので、ソースコードを読んでリバースエンジニアリング的に「こういう風にできそう」と判明した内容を書い…

Python: Jupyter の IPython Kernel にスタートアップスクリプトを登録する

今回は Jupyter の IPython Kernel に、スタートアップスクリプトを登録する方法について書いてみる。 スタートアップスクリプトというのは、カーネルの起動時に読み込まれるコードのこと。 IPython Kernel というのは、いわゆるフツーのノートブックを Jupy…

Python: Luigi から S3 互換のオブジェクトストレージを使う

今回は、Python のデータパイプライン構築用フレームワークの Luigi から、Amazon 以外が提供している S3 互換のオブジェクトストレージを利用する方法について書いてみる。 S3 互換のオブジェクトストレージとしては、ひとまず以下のエントリで紹介した Min…

S3 互換オブジェクトストレージの OSS - MinIO を試す

MinIO は Amazon S3 互換のオブジェクトストレージを提供する OSS のひとつ。 たとえばオンプレ環境でオブジェクトストレージを構築したいときや、手元で S3 を扱うアプリケーションの動作確認をするときなんかに使える。 今回はそんな MinIO を AWS CLI と …

Python: Streamlit を使って手早く WebUI 付きのプロトタイプを作る

Streamlit は、ざっくり言うと主にデータサイエンス領域において WebUI 付きのアプリケーションを手早く作るためのソフトウェア。 使い所としては、ひとまず動くものを見せたかったり、少人数で試しに使うレベルのプロトタイプを作るフェーズに適していると…

Python: LightGBM の学習に使うデータ量と最適なイテレーション数の関係性について

XGBoost は同じデータセットとパラメータを用いた場合、学習に使うデータの量 (行数) と最適なイテレーション数が線形な関係にあることが経験的に知られている 1。 今回は、それが同じ GBDT (Gradient Boosting Decision Tree) の一手法である LightGBM にも…