シンボリック回帰向けPySRのインストール
はじめに
データサイエンスにおいてしばしばデータの裏側で起こっている事象の解釈性が求められることがあります。ドメインの原理原則に則った数式をデータから推測することができたらドメインの理解や新たな知見を得ることに役立つだけでなく、原理原則という汎用性をモデル化できている可能性があるため外挿予測性の向上も期待できます。
この記事ではJuliaをバックエンドとしたPythonライブラリPySR
をインストールするための手順を示します。
環境
- Ubuntu 20.04.1
- Python 3.9.15
- pysr 0.12.3
手順
Juliaのインストール
天下り的ですが、以下のブログ記事を参考にしてインストールします。
実際には以下の公式サイトからjuliaのソフトウェアをダウンロードします。
2023/5/10時点で、当方では以下をダウンロードしました。juliaのバージョンは1.8.5です。
Pythonのインストール
minicondaでインストールします。
ライブラリのインストール
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の必要なパッケージをインストールしてコンパイルしているようです。
動作確認
関数を定義します。ここでは、説明変数に相当する
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の関数として設定した
equation候補をデータフレームとして出力してみます。
model.equations_
最良のequationを出力してみます。
model.get_best()
得られたモデルに説明変数を当てはめて
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