CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: LightGBM の cv() 関数から得られるモデルの特徴量の重要度を可視化してみる

今回は LightGBM の cv() 関数から得られる複数の学習済み Booster から特徴量の重要度を取り出して可視化してみる。 それぞれの Booster 毎のバラつきなどから各特徴量の傾向などが確認できるかもしれない。 使った環境は次のとおり。 $ sw_vers ProductNam…

Python: CatBoost を GPU で学習させる

勾配ブースティング決定木を扱うフレームワークの CatBoost は、GPU を使った学習ができる。 GPU を使うと、CatBoost の特徴的な決定木の作り方 (Symmetric Tree) も相まって、学習速度の向上が見込める場合があるようだ。 今回は、それを試してみる。 使っ…

Python: SHAP (SHapley Additive exPlanations) を LightGBM と使ってみる

SHAP は協力ゲーム理論にもとづいて機械学習モデルを解釈する手法と、その実装を指している。 今回は、あまり理論の部分には踏み込むことなく、使い方を中心として書いていく。 使った環境は次のとおり。 $ sw_vers ProductName: Mac OS X ProductVersion: 1…

Python: LightGBM の cv() 関数の実装について

今回は LightGBM の cv() 関数について書いてみる。 LightGBM の cv() 関数は、一般的にはモデルの性能を評価する交差検証に使われる。 一方で、この関数から取り出した学習済みモデルを推論にまで使うユーザもいる。 今回は、その理由やメリットとデメリッ…

Python: Null Importance を使った特徴量選択について

今回は特徴量選択 (Feature Selection) の手法のひとつとして使われることのある Null Importance を試してみる。 Null Importance というのは、目的変数をシャッフルして意味がなくなった状態で学習させたモデルから得られる特徴量の重要度を指す。 では、…

Python: NumPy 配列の操作でメモリのコピーが生じているか調べる

パフォーマンスの観点からいえば、データをコピーする機会は少ないほど望ましい。 コンピュータのバスの帯域幅は有限なので、データをコピーするには時間がかかる。 NumPy の配列 (ndarray) には、メモリを実際に確保している配列と、それをただ参照している…

ltrace(1) で共有ライブラリの呼び出しを追いかける

Linux システムでは ltrace(1) を使うことで共有ライブラリの呼び出しを調べることができる。 今回は、いくつかの例を用いて使い方についてざっくりと見ていく。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 …

Python: LightGBM 開発環境メモ

最近 LightGBM にコントリビューションする機会を得たので、その際に調べたことの備忘録を残しておく。 現時点では、Python 周りの開発環境についてドキュメントは特に見当たらないようだった。 以下は CI 環境のスクリプトやエラーメッセージを読みながら雰…

xargs(1) でシェル関数を使いたい

コマンドラインの処理を並列実行したいときなどに使う xargs(1) だけど、引数にシェル関数を使おうとすると少し工夫する必要がある。 工夫しない場合に失敗する理由から説明しているので、うまくいくやり方だけ知りたいときは下までスクロールしてもらえると…

Python: 画像データをフーリエ変換して周波数領域で扱ってみる

フーリエ変換は音声データに対して用いられることが多い手法だけど、画像データにも応用が効く。 音声データの場合、フーリエ変換を使うことで時間領域の情報を周波数領域の情報に直せる。 それに対し、画像データでは空間領域の情報を周波数領域の情報に直…

Python: UMAP を使ってみる

UMAP (Uniform Manifold Approximation and Projection) は次元削減手法のひとつ。 似た手法としては t-SNE (t-distributed Stochastic Neighbor Embedding) があるけど、それよりも高速らしい。 公式のベンチマークが以下で紹介されていて、t-SNE に比べる…

Python: XGBoost の cv() 関数から学習済みモデルを取り出す

今回は、以下のエントリを XGBoost で焼き直したもの。 つまり、XGBoost でも cv() 関数から学習済みモデルを取り出して Fold Averaging してみようという話。 blog.amedama.jp 使った環境は次のとおり。 $ sw_vers ProductName: Mac OS X ProductVersion: 1…

kubectl の複数の設定ファイルを一つにマージする

何度も調べることになりそうなのでメモしておく。 kubectl で複数の設定ファイルがあるときに、ひとつにまとめる方法について。 使った環境は次のとおり。 $ sw_vers ProductName: Mac OS X ProductVersion: 10.14.6 BuildVersion: 18G5033 $ kubectl versio…

4K ディスプレイを導入するときは HDMI ケーブルに注意が必要

今回は、自宅で 4K ディスプレイを導入した際に HDMI ケーブルを起因とするトラブルが起きた話について。 生じた問題について 我が家では、自宅の作業環境を改善する一環として半年ほど前に 4K ディスプレイを導入した。 そして、普段使っているパソコンとは…

Python: mlflow.start_run(nested=True) は使い方に注意しよう

今回は MLflow Tracking のすごーく細かい話。 ソースコードを読んでいて、ハマる人もいるかもなと思ったので書いておく。 結論から先に書くと、MLflow Tracking には次のような注意点がある。 MLflow Tracking で標準的に使う API はマルチスレッドで Run …

Python: MLflow Tracking を使ってみる

MLflow は MLOps に関連した OSS のひとつ。 いくつかのコンポーネントに分かれていて、それぞれを必要に応じて独立して使うことができる。 今回は、その中でも実験の管理と可視化を司る MLflow Tracking を試してみることにした。 機械学習のプロジェクトで…

Python: Optuna の LightGBMTunerCV から学習済みモデルを取り出す

Optuna v1.5.0 では、LightGBM インテグレーションの一環として LightGBMTunerCV という API が追加された。 これは LightGBM の cv() 関数を Step-wise algorithm で最適化するラッパーになっている。 つまり、重要ないくつかのパラメータを Step-wise で調…

kind (Kubernetes IN Docker) を使ってみる

今回は Kubernetes の開発で使われている公式ツールの kind を使ってみる。 このツールを使うと Docker のコンテナを使って Kubernetes のクラスタが素早く簡単に構築できる。 OpenStack でいうところの DevStack に相当するものかな。 使った環境は次のとお…

Python: Keras でカスタムメトリックを扱う

今回は Keras に組み込みで用意されていない独自の評価指標 (カスタムメトリック) を扱う方法について書いてみる。 なお、Keras でカスタムメトリックを定義する方法については、以下の公式ドキュメントに記載がある。 keras.io 使った環境は次のとおり。 Ke…

Python: gensim の FAST_VERSION 定数の意味について

Python の gensim には自然言語処理 (NLP) に関する様々な実装がある。 そして、その中のいくつかのモジュールには FAST_VERSION という定数が定義されている。 この定数は環境によって異なる値を取って、値によってパフォーマンスが大きく異なる場合がある…

Python: gensim を使った Word Embedding の内省的評価について

以下の書籍では、Word Embedding の評価方法として内省的評価 (intrinsic evaluation) と外省的評価 (extrinsic evaluation) という 2 つのやり方が紹介されている。 内省的評価では、人間が判断した単語間の類似度や、単語の持つ意味を使ったアナロジーを、…

Python: 使わない変数を "_" (アンダースコア) に代入するイディオム

Python には、使わない変数であることを明確に示すためにアンダースコアに代入するというイディオムがある。 今回は、そのイディオムについてあらためて紹介してみる。 使った環境は次のとおり。 $ sw_vers ProductName: Mac OS X ProductVersion: 10.14.6 B…

MySQL の InnoDB でトランザクション分離レベルの違いを試す

今回は MySQL の InnoDB を使ってトランザクション分離レベル (Transaction Isolation Level) の違いを試してみる。 トランザクション分離レベルは、SQL を実装したシステムの ACID 特性において I (Isolation) に対応する概念となっている。 利用する分離レ…

Python: 学習済み機械学習モデルの特性を PDP で把握する

機械学習を用いるタスクで、モデルの解釈可能性 (Interpretability) が重要となる場面がある。 今回は、モデルの解釈可能性を得る手法のひとつとして PDP (Partial Dependence Plot: 部分従属プロット) を扱ってみる。 PDP を使うと、モデルにおいて説明変数…

Python: PySpark で UDAF が作れない場合の回避策について

PySpark では、ごく最近まで UDAF (User Defined Aggregate Function: ユーザ定義集計関数) がサポートされていなかった。 Apache Spark 2.3 以降では Pandas UDF を使うことで UDAF に相当する処理を書くことができるようになっている。 今回は、それ以前の…

ピクセラ PIX-MT100 を iPad から使ってみる

外出先でパソコンからインターネットを使いたいときがある。 そんなときのために、普段はピクセラの PIX-MT100 という LTE 対応 USB ドングルに MVNO の SIM カードを入れて持ち歩いている。 ピクセラ LTE対応USBドングル ホワイト PIX-MT100発売日: 2016/06…

Word2Vec 形式のファイルフォーマットについて

Word2Vec では、Skip-gram や CBOW といったタスクを学習させたニューラルネットワークの隠れ層の重みを使って単語を特徴ベクトルにエンコードする。 つまり、Word2Vec で成果物として得られるのは、コーパスの各単語に対応する特徴ベクトルになる。 今回は…

NAS を買ったら両親に孫の動画を見せやすくなった話

子どもが生まれると、必然的に動画を撮影する機会が増える。 今回は、子どもを撮影した動画を保存するために NAS (Network Attached Storage) を買ったら、副次的な効果として遠隔にいる両親に孫の動画を見せやすくなって良かったという話について。 TL; DR …

Python: Keras で Convolutional AutoEncoder を書いてみる

以前に Keras で AutoEncoder を実装するエントリを書いた。 このときは AutoEncoder を構成する Neural Network のアーキテクチャとして単純な全結合層から成る MLP (Multi Layer Perceptron) を使っている。 blog.amedama.jp 一方で、データとして画像を扱…

Python: gensim で学習済み単語ベクトル表現を扱ってみる

Python で自然言語処理を扱うためのパッケージのひとつに gensim がある。 今回は、gensim で学習済み単語ベクトル表現 (Pre-trained Word Vectors) を使った Word Embedding を試してみた。 Word Embedding というのは単語 (Word) をベクトル表現の特徴量に…