🤖

シンボリック回帰向けPySRのインストール

2023/05/10に公開

はじめに

データサイエンスにおいてしばしばデータの裏側で起こっている事象の解釈性が求められることがあります。ドメインの原理原則に則った数式をデータから推測することができたらドメインの理解や新たな知見を得ることに役立つだけでなく、原理原則という汎用性をモデル化できている可能性があるため外挿予測性の向上も期待できます。
この記事ではJuliaをバックエンドとしたPythonライブラリPySRをインストールするための手順を示します。

環境

  • Ubuntu 20.04.1
  • Python 3.9.15
  • pysr 0.12.3

手順

Juliaのインストール

天下り的ですが、以下のブログ記事を参考にしてインストールします。
https://qiita.com/STInverSpinel/items/a9efcb393030da3670f0

実際には以下の公式サイトからjuliaのソフトウェアをダウンロードします。
https://julialang.org/downloads/

2023/5/10時点で、当方では以下をダウンロードしました。juliaのバージョンは1.8.5です。
https://julialang-s3.julialang.org/bin/linux/x64/1.8/julia-1.8.5-linux-x86_64.tar.gz

Pythonのインストール

minicondaでインストールします。
https://docs.conda.io/en/latest/miniconda.html

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

condaで作ったpysrという名前の仮想環境にインストールします。

conda create -n pysr python==3.9.15
conda activate pysr
pip install pandas numpy seaborn matplotlib
pip install -U pysr
python -c 'import pysr; pysr.install()'

最終行でjuliaの必要なパッケージをインストールしてコンパイルしているようです。

動作確認

関数を定義します。ここでは、説明変数に相当するXがx0~x4の5次元で、yXとの関係が以下の式で表されるとします。実問題においてはこの関数は自明ではなく、データから推測する必要があります。

y=2.5382 \times \cos(x_3) + x_0^2 - 0.5
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

X = 2 * np.random.randn(100, 5)
y = 2.5382 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 0.5

df = pd.DataFrame(
    np.c_[y,X], columns=["y"]+[f"x{i}" for i in range(5)]
)
df.head()

sns.pairplot(df);

from pysr import PySRRegressor

model = PySRRegressor(
    niterations=40,  # < Increase me for better results
    binary_operators=["+", "*"],
    unary_operators=[
        "cos",
        "exp",
        "sin",
        "inv(x) = 1/x",
        # ^ Custom operator (julia syntax)
    ],
    extra_sympy_mappings={"inv": lambda x: 1 / x},
    # ^ Define operator for SymPy as well
    loss="loss(prediction, target) = (prediction - target)^2",
    # ^ Custom loss function (julia syntax)
)
model.fit(X,y)

warningが出ますが、データの学習が上手く行っているようです。
以下の結果に着目すると、equation候補がいくつかありますが、>>>>マークが付されているscoreが最大のequationに着目すると、(((x0 * x0) + -0.49999997) + (cos(x3) * 2.5382))となっており、yの関数として設定したy=2.5382 \times \cos(x_3) + x_0^2 - 0.5と概ね等しい結果が得られました。

equation候補をデータフレームとして出力してみます。

model.equations_

最良のequationを出力してみます。

model.get_best()

得られたモデルに説明変数を当てはめてy_predを得て、yと比較してみます。

y_pred = model.predict(X)  # best_modelで予測値を返す
plt.figure(figsize=(5,5))
plt.scatter(y, y_pred)
plt.grid()
plt.xlabel("observations")
plt.ylabel("predictions")
plt.show()

ここまでできれば動作確認として十分でしょう。
以上、シンボリック回帰可能なPySRのインストール方法の解説でした。
次回はシンボリック回帰による外挿予測性能について、典型的な機械学習アルゴリズムと比較してみたいと思います。

以上

Discussion