HyperoptとOptunaによるハイパーパラメータチューニングの例

機械学習において、作成したモデルの精度を高めるためのテクニックのひとつがハイパーパラメータのチューニング(調整)です。
ハイパーパラメータのチューニングの方法としては、手動、グリッドサーチ、ランダムサーチ、ベイズ最適化などの方法があります。
今回は、ベイズ最適化による方法でよく使われるライブラリであるHyperoptOptunaの使い方を比較するため、同じ問題(Boston house prices dataset)に対して、同じモデル(リッジ回帰; sklearn.linear_model.Ridge)を用いて、簡単なコードを作成してみました。(あくまでHyperoptとOptunaの使用例を示すためのもので、この問題の解法を示しているわけではございませんので、ご了承ください。)

上がHyperoptのコード例、下がOptunaのコード例です。コードを比較するとわかるように、Hyperoptの方は最適化するモデル(関数)とは別にハイパーパラメータの範囲を定義してfmin関数に関数とハイパーパラメータの範囲を定義したものを渡していますが、Optunaの方は最適化するモデル(関数)の中でハイパーパラメータの範囲を定義しています。

今回の例では、以下の通り、実行結果はほぼ同じになりました。

HyperoptとOptunaは、TPE(Tree-structured Parzen Estimator)という同一の最適化エンジンを使っていますが、枝刈りの機能の貢献により、Optuna の方が効率的に最適化の処理をするようです。

HyperoptとOptunaについての詳しい情報は、以下のリンクをご参照ください。

参照

Sphinxでグリッドテーブルに全角記号を使った場合のエラー

ドキュメントの作成に、ドキュメントが簡単に作れるツール Sphinx を気に入って使っています。

先日、グリッドテーブル(Grid Table)に全角記号を入れるとエラーになるということに気がつきました。
具体的には、以下のようなものがエラーになってしまいます。

しかし、次のようにするとエラーなく処理されます。

横幅がそろっていないとエラーになるはずが、そろっているとエラーになり、ずらすとエラーがなくなるいう状態です。

困って調べたところ、Pythonのdocutilsパッケージが原因であることがわかりました。

グリッドテーブルが正しい形式になっているかを確認するときに、docutils内で、グリッドテーブルの各行の長さを計算しています。そのとき、ひらがなや漢字などの全角の文字は、半角2文字分の幅を取っているので、見た目と合わせるために、長さを2として計算されます。しかし、「→」などの全角記号が長さを1として計算されているため、見た目とずれてしまっています。

これを修正するために、以下のようにしました。環境はDebian9(stretch)です。

システム側のdocutilsを変更しないで済ませるために、ユーザのホーム以下のディレクトリにコピーをします。ここでは「.pythonlib」というディレクトリ名にしましたが、これは任意の名前で構いません。

このディレクトリを、モジュールファイルのデフォルトの検索パスに追加するために、環境変数を設定します。bashならば、以下の行を環境設定ファイル(「.profile」など)に記述します。

環境設定ファイルを読み込めば有効になります。

コピーしたdocutilsディレクトリ配下の「statemachine.py」の

のように変更します(「A」を追加)。

また、今回の修正には直接関係ありませんが、整合性をとるため、コピーしたdocutilsディレクトリ配下の「utils/__init__.py」の

のように変更(「1」を「2」に変更)しておくといいと思われます。

以上で、全角記号を含んだグリッドテーブルで、見た目がそろっていればエラーが出ずに処理できるようになりました。

MySQLをインストールする

Python+MySQLの組み合わせでCGIシステムを作成するために、MySQLとPythonとのインターフェースをインストールします。MySQLの文字コードはutf8とします。

  • mysql-serverパッケージをインストールする。MySQLのrootユーザのパスワードを設定する。
  • /etc/mysql/my.cnfを変更し、文字コードを設定する。
  • PythonとMySQLのインターフェース関連のpython-mysqldbパッケージをインストールする。Pythonで、import MySQLdbが実行できれば準備完了です。

Pythonのdatetime型のデータで引き算を行なう

例えば部屋などの予約をする場合、使用開始時刻と使用終了時刻が入力され、何時間使用したかを算出したいとします。

時刻のデータ型はdatetime型とします。
Pythonのバージョンは2.7.6です。

[例1]
使用開始時刻:2014年12月18日 10:00
使用終了時刻:2014年12月18日 11:30
使用時間:1.5(h)

24時間を超える可能性がある場合は total_seconds() というメソッドを使うとうまくいきます。

[例2]
使用開始時刻:2014年12月19日 12:00
使用終了時刻:2014年12月20日 13:30
使用時間:25.5(h)

入力した文字列が半角英数字かどうかチェックする

正規表現…、あまり得意ではありません。
しかし、当然、システムでは入力チェックが必要不可欠。
苦手なんて言ってられません。

入力した文字列が半角英数字かどうかチェックする方法です。

指定したディレクトリのファイル一覧を出力する

プログラミング言語は主にPythonを使用しています。
よく使うのにすぐ忘れてしまう命令を少しずつ書いていこうと思います。

ある任意のディレクトリ下にあるファイルの一覧を出力する方法です。
ファイル名はリストで出力されます。