bayesml.metatree package#

モジュール内容#

このモジュールでは、ある種のベイズ決定木モデルとその事前分布を利用できます。

_images/metatree_example1.png _images/metatree_example2.png

確率的データ生成モデル#

  • \(\boldsymbol{x}=[x_1, \ldots, x_p, x_{p+1}, \ldots , x_{p+q}]\):説明変数です。最初の \(p\) 個の変数は連続変数です。残りの \(q\) 個の変数はカテゴリ変数です。

  • \(\mathcal{Y}\) : 目的変数の空間

  • \(y \in \mathcal{Y}\) : 目的変数

  • \(D_\mathrm{max} \in \mathbb{N}\) : 木の最大深さ

  • \(T_\mathrm{max}\):すべての内部ノードが同じ数の子ノードを持ち、すべての葉ノードが同じ深さ \(D_\mathrm{max}\) を持つ完全木

  • \(\mathcal{S}_\mathrm{max}\):\(T_\mathrm{max}\) のすべてのノードの集合

  • \(s \in \mathcal{S}_\mathrm{max}\) : 木のノード

  • \(\mathcal{I}_\mathrm{max} \subset \mathcal{S}_\mathrm{max}\):\(T_\mathrm{max}\) のすべての内部ノードの集合

  • \(\mathcal{L}_\mathrm{max} \subset \mathcal{S}_\mathrm{max}\):\(T_\mathrm{max}\) のすべての葉ノードの集合

  • \(\mathcal{T}\)::\(T_\mathrm{max}\) の部分木からなる集合

  • \(T \in \mathcal{T}\):\(T_\mathrm{max}\) の部分木

  • \(\mathcal{I}_T\):\(T\) のすべての内部ノードの集合

  • \(\mathcal{L}_T\) : \(T\) のすべての葉ノードの集合

  • \(\boldsymbol{k}=(k_s)_{s \in \mathcal{I}_\mathrm{max}}\) : 内部ノードに割り当てられた特徴量のインデックス、すなわち \(k_s \in \{1, 2,\ldots,p+q\}\) です。もし \(k_s \leq p\) であれば、ノード \(s\) には閾値があります。

  • \(\mathcal{K}=\{ 1, 2, \ldots , p+q \}^{|\mathcal{I}_\mathrm{max}|}\) : すべての \(\boldsymbol{k}\) の集合

  • \(\boldsymbol{\theta}=(\theta_s)_{s \in \mathcal{S}}\) : ノードに割り当てられたパラメータ

  • \(s_{\boldsymbol{k},T}(\boldsymbol{x}) \in \mathcal{L}_T\): \(T\) かつ \(\boldsymbol{k}\) の下で \(\boldsymbol{x}\) が到達する葉ノード

\[p(y | \boldsymbol{x}, \boldsymbol{\theta}, T, \boldsymbol{k})=p(y | \theta_{s_{\boldsymbol{k},T}(\boldsymbol{x})})\]

事前分布#

  • \(g_s \in [0,1]\):各ノード \(s \in \mathcal{S}_\mathrm{max}\) に割り当てられるハイパーパラメータ。 \(T_\mathrm{max}\) の任意の葉ノード \(s\) について、\(g_s=0\) と仮定します。

\[\begin{split}p(\boldsymbol{k}) &= \frac{1}{|\mathcal{K}|} = \left( \frac{1}{p+q} \right)^{|\mathcal{I}_\mathrm{max}|}, \\ p(T) &= \prod_{s \in \mathcal{I}_T} g_s \prod_{s' \in \mathcal{L}_T} (1-g_{s'}).\end{split}\]

パラメータ \(\theta_s\) の事前分布は、\(p(y | \theta_s)\) に対して共役事前分布であり、各ノードごとに独立していると仮定します。

事後分布#

事後分布は次のように近似されます:

  • \(n \in \mathbb{N}\): サンプルサイズ

  • \(\boldsymbol{x}^n = \{ \boldsymbol{x}_1, \boldsymbol{x}_2, \ldots, \boldsymbol{x}_n \}\)

  • \(\boldsymbol{x}_{s, \boldsymbol{k}}\):\(\boldsymbol{k}\) の下で \(s\) を通過するデータ点の説明変数です。

  • \(y^n = \{ y_1, y_2, \ldots, y_n \}\)

  • \(y_{s, \boldsymbol{k}}\):\(\boldsymbol{k}\) の下で \(s\) を通過するデータ点の目的変数です。

まず、事後分布 \(p(\boldsymbol{k}, T, \boldsymbol{\theta} | \boldsymbol{x}^n, y^n)\) は、次のように分解できます:

\[p(\boldsymbol{k}, T, \boldsymbol{\theta} | \boldsymbol{x}^n, y^n) = p(\boldsymbol{k} | \boldsymbol{x}^n, y^n) p(T | \boldsymbol{x}^n, y^n, \boldsymbol{k}) p(\boldsymbol{\theta} | \boldsymbol{x}^n, y^n, \boldsymbol{k}, T).\]

\(\boldsymbol{\theta}\) については、共役事前分布を仮定しているため、事後分布 \(p(\boldsymbol{\theta} | \boldsymbol{x}^n, y^n, \boldsymbol{k}, T)\) を正確に計算することができます。

また、\(T\) についても、メタツリーと呼ばれる概念を用いることで、事後分布 \(p(T | \boldsymbol{x}^n, y^n, \boldsymbol{k})\) を正確に計算することができます。メタツリーは単一のツリーではなく、すべてのツリーの内部ノードに対して同じ特徴量の割り当て \(\boldsymbol{k}\) が与えられているツリーの集合です。 \(\boldsymbol{k}\) で定義されるメタツリー上の木々の事後分布は、以下の通りです:

\[p(T | \boldsymbol{x}^n, y^n, \boldsymbol{k}) = \prod_{s \in \mathcal{I}_T} g_{s|\boldsymbol{x}^n, y^n, \boldsymbol{k}} \prod_{s' \in \mathcal{L}_T} (1-g_{s'|\boldsymbol{x}^n, y^n, \boldsymbol{k}}),\]

ここで、\(g_{s|\boldsymbol{x}^n, y^n, \boldsymbol{k}} \in [0,1]\) は、\(\boldsymbol{x}^n\)、\(y^n\)、および \(\boldsymbol{k}\) から次のように計算できます:

\[\begin{split}g_{s|\boldsymbol{x}^n, y^n, \boldsymbol{k}} = \begin{cases} \frac{g_s \prod_{s' \in \mathrm{Ch}(s)}q(y_{s', \boldsymbol{k}}|\boldsymbol{x}_{s', \boldsymbol{k}}, s', \boldsymbol{k})}{q(y_{s, \boldsymbol{k}}|\boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k})}, & s \in \mathcal{I}_\mathrm{max},\\ g_s, & \mathrm{otherwise}, \end{cases}\end{split}\]

ここで、\(\mathrm{Ch}(s)\) は、\(T_\mathrm{max}\) 上の \(s\) の子ノードの集合を表し、\(q(y_{s, \boldsymbol{k}}|\boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k})\) は、任意の \(s \in \mathcal{S}_\mathrm{max}\) に対して次のように定義されます。

\[\begin{split}&q(y_{s, \boldsymbol{k}}|\boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k}) = \begin{cases} (1-g_s) f(y_{s, \boldsymbol{k}} | \boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k}) \\ \qquad {}+ g_s \prod_{s' \in \mathrm{Ch}(s)} q(y_{s', \boldsymbol{k}} | \boldsymbol{x}_{s', \boldsymbol{k}}, s', \boldsymbol{k}), & s \in \mathcal{I}_\mathrm{max},\\ f(y_{s, \boldsymbol{k}} | \boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k}), & \mathrm{otherwise}. \end{cases}\end{split}\]

ここで、\(f(y_{s, \boldsymbol{k}} | \boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k})\) は次のように定義されます:

\[f(y_{s, \boldsymbol{k}} | \boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k}) = \int p(y_{s, \boldsymbol{k}} | \boldsymbol{x}_{s, \boldsymbol{k}}, \theta_s) p(\theta_s) \mathrm{d}\theta_s.\]

\(\boldsymbol{k}\) について、事後分布 \(p(\boldsymbol{k} | \boldsymbol{x}^n, y^n)\) を近似するアルゴリズムとして、メタツリー・ランダムフォレスト(MTRF)とメタツリー・マルコフ連鎖モンテカルロ(MTMCMC)法の2つがあります。

MTRFによる近似#

MTRFでは、まず通常の(非ベイズ)ランダムフォレストアルゴリズムを用いて、特徴量割り当てベクトルの集合 \(\mathcal{K}' = \{\boldsymbol{k}_1, \boldsymbol{k}_2, \ldots, \boldsymbol{k}_B\}\) を構築します。 次に、\(\boldsymbol{k} \in \mathcal{K}\) について、事後分布 \(p(\boldsymbol{k} | \boldsymbol{x}^n, y^n)\) を次のように近似します:

\[\begin{split}p(\boldsymbol{k} | \boldsymbol{x}^n, y^n) \approx \tilde{p}(\boldsymbol{k} | \boldsymbol{x}^n, y^n) \propto \begin{cases} q(y_{s_\lambda, \boldsymbol{k}}|\boldsymbol{x}_{s_\lambda, \boldsymbol{k}}, s_\lambda, \boldsymbol{k}), & \boldsymbol{k} \in \mathcal{K}',\\ 0, & \mathrm{otherwise}. \end{cases}\end{split}\]

ここで、\(s_{\lambda}\) は \(T_\mathrm{max}\) の根ノードです。

予測分布は次のように近似されます:

\[p(y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n) = \sum_{\boldsymbol{k} \in \mathcal{K}'} \tilde{p}(\boldsymbol{k} | \boldsymbol{x}^n, y^n) q(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s_\lambda, \boldsymbol{k}),\]

ここで、\(q(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s_\lambda, \boldsymbol{k})\) は、 \(q(y_{s_\lambda, \boldsymbol{k}}|\boldsymbol{x}_{s_\lambda, \boldsymbol{k}}, s_\lambda, \boldsymbol{k})\) と同様の方法で計算されます。

予測分布の期待値は、次のように近似されます。

\[\mathbb{E}_{p(y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n)} [Y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n] = \sum_{\boldsymbol{k} \in \mathcal{K}'} \tilde{p}(\boldsymbol{k} | \boldsymbol{x}^n, y^n) \mathbb{E}_{q(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s_\lambda, \boldsymbol{k})} [Y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n, \boldsymbol{k}],\]

ここで、\(q\) の期待値は、次のように再帰的に与えられます。

\[\begin{split}&\mathbb{E}_{q(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s, \boldsymbol{k})} [Y_{n+1} | \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n, \boldsymbol{k}] \\ &= \begin{cases} (1-g_{s|\boldsymbol{x}^n, y^n, \boldsymbol{k}}) \mathbb{E}_{f(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s, \boldsymbol{k})} [Y_{n+1} | \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n, \boldsymbol{k}] \\ \qquad + g_{s|\boldsymbol{x}^n, y^n, \boldsymbol{k}} \mathbb{E}_{q(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s_\mathrm{child}, \boldsymbol{k})} [Y_{n+1} | \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n, \boldsymbol{k}] ,& s \in \mathcal{I}_\mathrm{max},\\ \mathbb{E}_{f(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s, \boldsymbol{k})} [Y_{n+1} | \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n, \boldsymbol{k}],& (\mathrm{otherwise}). \end{cases}\end{split}\]

ここで、\(f(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s, \boldsymbol{k})\) は、 \(f(y_{s, \boldsymbol{k}} | \boldsymbol{x}_{s, \boldsymbol{k}}, s, \boldsymbol{k}\) と同様の方法で計算され、 \(s_\mathrm{child}\) は、根ノードから葉ノード \(s_{\boldsymbol{k},T_\mathrm{max}}(\boldsymbol{x}_{n+1})\) へのパス上の \(s\) の子ノードとなります。

MTMCMCによる近似#

MTMCMC法では、MCMC法を用いて事後分布 \(p(\boldsymbol{k} | \boldsymbol{x}^n, y^n)\) から標本 \(\boldsymbol{k}\) を生成し、この標本の経験分布によって事後分布を近似します。 得られた標本を \(\{\boldsymbol{k}^{(t)}\}_{t=1}^{t_\mathrm{end}}\) とします。

予測分布#

予測分布は次のように近似されます:

\[p(y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n) = \frac{1}{t_\mathrm{end}} \sum_{t=1}^{t_\mathrm{end}} q(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s_\lambda, \boldsymbol{k}^{(t)}).\]

予測分布の期待値は、次のように近似されます:

\[\mathbb{E}_{p(y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n)} [Y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n] = \frac{1}{t_\mathrm{end}} \sum_{t=1}^{t_\mathrm{end}} \mathbb{E}_{q(y_{n+1}|\boldsymbol{x}_{n+1},\boldsymbol{x}^n, y^n, s_\lambda, \boldsymbol{k}^{(t)})} [Y_{n+1}| \boldsymbol{x}_{n+1}, \boldsymbol{x}^n, y^n, \boldsymbol{k}^{(t)}].\]

参照#

  • Dobashi, N.; Saito, S.; Nakahara, Y.; Matsushima, T. Meta-Tree Random Forest: Probabilistic Data-Generative Model and Bayes Optimal Prediction. Entropy 2021, 23, 768. https://doi.org/10.3390/e23060768

  • Nakahara, Y.; Saito, S.; Kamatsuka, A.; Matsushima, T. Probability Distribution on Full Rooted Trees. Entropy 2022, 24, 328. https://doi.org/10.3390/e24030328

  • Nakahara, Y.; Saito, S.; Ichijo, N.; Kazama, K.; Matsushima, T. Bayesian Decision Theory on Decision Trees: Uncertainty Evaluation and Interpretability. Proceedings of The 28th International Conference on Artificial Intelligence and Statistics, in Proceedings of Machine Learning Research 2025, 258:1045-1053 Available from https://proceedings.mlr.press/v258/nakahara25a.html.

GitHubスターのお願い#

もしこのページが参考になったら、GitHubリポジトリにスターをいただけると開発の励みになります。
以下のリンクからリポジトリを開いて右上の☆Starを押してください。

リポジトリを開いて右上の☆Starを押す!

GitHubスター

クラス#

class bayesml.metatree.GenModel(c_dim_continuous, c_dim_categorical, c_max_depth=2, c_num_children_vec=2, c_num_assignment_vec=None, c_ranges=None, SubModel=bernoulli, sub_constants={}, root=None, h_k_weight_vec=None, h_g=0.5, sub_h_params={}, h_metatree_list=[], h_metatree_prob_vec=None, seed=None)#

ベースクラス: Generative

確率的データ生成モデルと事前分布

パラメータ:
c_dim_continuousint

非負の整数

c_dim_categoricalint

非負の整数

c_num_children_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の整数のベクトルで、デフォルトでは [2,2,...,2] となります。 最初の c_dim_continuous 個の要素は、内部ノードにおける連続型特徴の子要素の数を表します。残りの c_dim_categorical 個の要素は、カテゴリ型特徴の子要素の数を表します。単一の整数が入力された場合、それはブロードキャストされます。

c_max_depthint, オプション

正の整数(デフォルトは2)

c_num_assignment_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の整数のベクトルです。最初の c_dim_continuous 個の要素は、パス上の連続型特徴の最大割り当て数を表します。 残りの c_dim_categorical 個の要素は、カテゴリ型特徴量の最大割り当て数を表します。負の要素(例:-1)が含まれる場合、対応する特徴量は何度でも割り当てられます。デフォルトでは [-1,...,-1] です。

c_rangesnumpy.ndarray, optional

サイズが (c_dim_continuous,2) の numpy.ndarray です。「k」番目の連続特徴量に対する閾値は、「c_ranges[k,0]」と「c_ranges[k,1]」の間で生成されます。デフォルトでは、[[-3,3],[-3,3],...,[-3,3]] となります。

SubModelclass, optional

ベルヌーイ、カテゴリカル、ポアソン、正規、指数、または線形回帰。デフォルトはベルヌーイです。

sub_constantsdict, optional

self.SubModel.GenModel の定数。デフォルトは {} です

rootmetatree._Node, optional

メタツリーの根ノードです。デフォルトでは、木は1つのノードのみで構成されます。

h_k_weight_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の実数のベクトルで、デフォルトでは [1,...,1] です。

h_gfloat, optional

0以上1以下の実数で、デフォルトは 0.5 です

sub_h_paramsdict, optional

self.SubModel.GenModel の h_params は、デフォルトで {} です

h_metatree_listlist of metatree._Node, optional

メタツリーの根ノード、デフォルトでは [] です

h_metatree_prob_vecnumpy.ndarray, optional

\([0, 1]\) 内の実数のベクトルで、h_metatree_list の事前分布を表します。デフォルトでは一様分布となります。要素の和は 1.0 でなければなりません。

seed{None, int}, optional

numpy.random.default_rng() を初期化するシード値です。デフォルトでは None

属性:
c_dim_features: int

c_dim_continuous + c_dim_categorical

メソッド

gen_params([feature_fix, threshold_fix, ...])

事前分布からパラメータを生成します。

gen_sample([sample_size, x_continuous, ...])

確率的データ生成モデルからサンプルを生成します。

get_constants()

GenModel の定数を取得します。

get_h_params()

事前分布のハイパーパラメータを取得します。

get_params()

確率的データ生成モデルのパラメータを取得します。

load_h_params(filename)

h_paramsにハイパーパラメータをロードします。

load_params(filename)

save_params に保存されたパラメータをロードします。

save_h_params(filename)

python pickle モジュールを使ってハイパーパラメータを保存します。

save_params(filename)

python の pickle モジュールを使ってパラメータを保存します。

save_sample(filename, sample_size[, x])

生成されたサンプルを NumPy .npz フォーマットで保存します。

set_h_params([h_k_weight_vec, h_g, ...])

事前分布のハイパーパラメータを設定します。

set_params([root])

確率的データ生成モデルのパラメータを設定します。

visualize_model([filename, format, ...])

確率的データ生成モデルと生成されたサンプルを可視化します。

get_constants()#

GenModel の定数を取得します。

返り値:
constantsdict of {str: int, numpy.ndarray}
  • "c_dim_continuous":``self.c_dim_continuous``の値

  • "c_dim_categorical":``self.c_dim_categorical``の値

  • "c_num_children_vec":``self.c_num_children_vec``の値

  • "c_max_depth":``self.c_max_depth``の値

  • "c_num_assignment_vec":``self.c_num_assignment_vec``の値

  • "c_ranges":``self.c_ranges``の値

set_h_params(h_k_weight_vec=None, h_g=None, sub_h_params=None, h_metatree_list=None, h_metatree_prob_vec=None)#

事前分布のハイパーパラメータを設定します。

パラメータ:
h_k_weight_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の実数のベクトルです。デフォルトでは None です。

h_gfloat, optional

\([0, 1]\) 内の実数。デフォルトは None です

sub_h_paramsdict, optional

self.SubModel.GenModel の h_params は、デフォルトでは None です

h_metatree_listlist of metatree._Node, optional

メタツリーのルートノード。デフォルトでは None です

h_metatree_prob_vecnumpy.ndarray, optional

h_metatree_list の事前分布を表す:math:[0, 1] 内の実数のベクトルです。デフォルトは None です。要素の合計は 1.0 でなければなりません。

get_h_params()#

事前分布のハイパーパラメータを取得します。

返り値:
h_paramsdict of {str: float, list, dict, numpy.ndarray}
  • "h_k_weight_vec":``self.h_k_weight_vec``の値

  • "h_g":``self.h_g``の値

  • "sub_h_params":``self.sub_h_params``の値

  • "h_metatree_list":``self.h_metatree_list``の値

  • "h_metatree_prob_vec":``self.h_metatree_prob_vec``の値

gen_params(feature_fix=False, threshold_fix=False, tree_fix=False, threshold_type='even')#

事前分布からパラメータを生成します。

生成された値は self.root に設定されます。

パラメータ:
feature_fixbool, optional

「True」の場合、特徴量の割り当てインデックスは固定されます。デフォルトは「False」です。

threshold_fixbool, optional

「True」の場合、連続型特徴量の閾値は固定されます。デフォルトは「False」です。「feature_fix」が「False」の場合、「threshold_fix」は「False」でなければなりません。

tree_fixbool, optional

「True」の場合、ツリーの形状は固定されます。デフォルトは「False」です。「feature_fix」が「False」の場合、「tree_fix」は「False」でなければなりません。

しきい値の種類{'even', 'random'}, optional

しきい値を生成する手順の一種で、デフォルトは 'even' です。'even' の場合、self.c_ranges は等間隔で再帰的に分割されます。'random' の場合、self.c_ranges はランダムな間隔で再帰的に分割されます。

set_params(root=None)#

確率的データ生成モデルのパラメータを設定します。

パラメータ:
rootmetatree._Node, optional

メタツリーの根ノード。デフォルトではNoneです。

get_params()#

確率的データ生成モデルのパラメータを取得します。

返り値:
paramsdict of {str:metatree._Node}
  • "root" : self.root の値です。

gen_sample(sample_size=None, x_continuous=None, x_categorical=None)#

確率的データ生成モデルからサンプルを生成します。

パラメータ:
sample_sizeint, オプション

正の整数、デフォルトは None です。

x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

返り値:
x_continuousnumpy.ndarray

サイズが (sample_size,c_dim_continuous) である2次元のfloat型配列です。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

ynumpy.ndarray

サイズが「sample_size」の1次元配列です。

save_sample(filename, sample_size, x=None)#

生成されたサンプルを NumPy .npz フォーマットで保存します。

キーワード "x "でNpzFileとして保存されます。

パラメータ:
filenamestr

サンプルを保存するファイル名。ない場合は .npz が追加されます。

sample_sizeint, オプション

正の整数、デフォルトは None です。

x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

visualize_model(filename=None, format=None, sample_size=100, x_continuous=None, x_categorical=None)#

確率的データ生成モデルと生成されたサンプルを可視化します。

なお、カテゴリカル特徴量の値にはジッターが適用されます。

パラメータ:
filenamestr, optional

図を保存する際のファイル名。デフォルトは「None」です

formatstr, optional

レンダリングの出力形式(「pdf」、 「png」など)。

sample_sizeint, オプション

正の整数、デフォルトは100

x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

例

>>> from bayesml import metatree
>>> model = metatree.GenModel(
>>>     c_dim_continuous=1,
>>>     c_dim_categorical=1)
>>> model.gen_params(threshold_type='random')
>>> model.visualize_model()
_images/metatree_example1.png _images/metatree_example2.png
class bayesml.metatree.LearnModel(c_dim_continuous, c_dim_categorical, c_max_depth=2, c_num_children_vec=2, c_num_assignment_vec=None, c_ranges=None, SubModel=bernoulli, sub_constants={}, h0_k_weight_vec=None, h0_g=0.5, sub_h0_params={}, h0_metatree_list=[], h0_metatree_prob_vec=None)#

ベースクラス: Posterior, PredictiveMixin

事後分布と予測分布

パラメータ:
c_dim_continuousint

非負の整数

c_dim_categoricalint

非負の整数

c_max_depthint, オプション

正の整数(デフォルトは2)

c_num_children_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の整数のベクトルで、デフォルトでは [2,2,...,2] となります。 最初の c_dim_continuous 個の要素は、内部ノードにおける連続型特徴の子要素の数を表します。残りの c_dim_categorical 個の要素は、カテゴリ型特徴の子要素の数を表します。単一の整数が入力された場合、それはブロードキャストされます。

c_num_assignment_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の整数のベクトルです。最初の c_dim_continuous 個の要素は、パス上の連続型特徴の最大割り当て数を表します。 残りの c_dim_categorical 個の要素は、カテゴリ型特徴量の最大割り当て数を表します。負の要素(例:-1)が含まれる場合、対応する特徴量は何度でも割り当てられます。デフォルトでは [-1,...,-1] です。

c_rangesnumpy.ndarray, optional

サイズが (c_dim_continuous,2) の numpy.ndarray です。「k」番目の連続特徴量に対する閾値は、「c_ranges[k,0]」と「c_ranges[k,1]」の間で生成されます。デフォルトでは、[[-3,3],[-3,3],...,[-3,3]] となります。

SubModelclass, optional

ベルヌーイ、カテゴリカル、ポアソン、正規、指数、または線形回帰。デフォルトはベルヌーイです。

sub_constantsdict, optional

self.SubModel.LearnModel の定数。デフォルトは {} です

h0_k_weight_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の実数のベクトルで、デフォルトでは [1,...,1] です。

h0_gfloat, optional

0以上1以下の実数で、デフォルトは 0.5 です

sub_h0_paramsdict, optional

self.SubModel.LearnModel の h0_params は、デフォルトで {} です

h0_metatree_listlist of metatree._Node, optional

メタツリーの根ノード、デフォルトでは [] です

h0_metatree_prob_vecnumpy.ndarray, optional

\([0, 1]\) 内の実数のベクトルで、h0_metatree_list の事前分布を表します。デフォルトでは一様分布となります。要素の和は 1.0 でなければなりません。

属性:
c_dim_features: int

c_dim_continuous + c_dim_categorical

hn_k_weight_vecnumpy.ndarray

長さが c_dim_continuous+c_dim_categorical である正の実数のベクトル

hn_gfloat

:math:`[0, 1]`に属する実数

sub_hn_paramsdict

self.SubModel.LearnModel の hn_params

hn_metatree_listmetatree._Node のリスト

メタツリーの根ノード

hn_metatree_prob_vecnumpy.ndarray

h0_metatree_list の事前分布を表す、\([0, 1]\) 内の実数のベクトルです。その要素の和は 1.0 になります。

メソッド

calc_feature_importances()

特徴量の重要度を計算します

calc_pred_density(y)

予測分布の確率密度関数の値の計算

calc_pred_dist([x_continuous, x_categorical])

予測分布のパラメータを計算します。

calc_pred_var()

予測分布の分散を計算

estimate_params([loss, visualize, filename, ...])

与えられた基準に基づいたパラメータ推定

fit([x_continuous, x_categorical, y, alg_type])

モデルをデータに当てはめます。

get_constants()

LearnModel の定数を取得します。

get_h0_params()

事前分布のハイパーパラメータを取得します。

get_hn_params()

事後分布のハイパーパラメータを取得します。

get_p_params()

予測分布のパラメータを取得します。

load_h0_params(filename)

h0_paramsにハイパーパラメータをロードします。

load_hn_params(filename)

hn_paramsにハイパーパラメータをロードします。

make_prediction([loss])

与えられた基準の下で、新しいデータ点を予測します。

overwrite_h0_params()

事後分布のハイパーパラメータの初期値を学習した値で上書きします。

pred_and_update([x_continuous, ...])

逐次的に新しいデータ点を予測し、事後分布を更新します。

predict([x_continuous, x_categorical])

データを予測

predict_proba([x_continuous, x_categorical])

データを予測

reset_hn_params()

事後分布のハイパーパラメータを初期値に戻します。

save_h0_params(filename)

python pickle モジュールを使ってハイパーパラメータを保存します。

save_hn_params(filename)

python pickle モジュールを使ってハイパーパラメータを保存します。

set_h0_params([h0_k_weight_vec, h0_g, ...])

事前分布のハイパーパラメータを設定します。

set_hn_params([hn_k_weight_vec, hn_g, ...])

事後分布のハイパーパラメータを設定します。

update_posterior([x_continuous, ...])

訓練データを使って事後分布のハイパーパラメータを更新します。

visualize_posterior([filename, format, ...])

パラメータの事後分布を可視化します。

get_constants()#

LearnModel の定数を取得します。

返り値:
constantsdict of {str: int, numpy.ndarray}
  • "c_dim_continuous":``self.c_dim_continuous``の値

  • "c_dim_categorical":``self.c_dim_categorical``の値

  • "c_num_children_vec":``self.c_num_children_vec``の値

  • "c_max_depth":``self.c_max_depth``の値

  • "c_num_assignment_vec":``self.c_num_assignment_vec``の値

  • "c_ranges":``self.c_ranges``の値

set_h0_params(h0_k_weight_vec=None, h0_g=None, sub_h0_params=None, h0_metatree_list=None, h0_metatree_prob_vec=None)#

事前分布のハイパーパラメータを設定します。

パラメータ:
h0_k_weight_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の実数のベクトルです。デフォルトでは None です。

h0_gfloat, optional

\([0, 1]\) 内の実数。デフォルトは None です

sub_h0_paramsdict, optional

self.SubModel.LearnModel の h0_params は、デフォルトでは None です

h0_metatree_listlist of metatree._Node, optional

メタツリーのルートノード。デフォルトでは None です

h0_metatree_prob_vecnumpy.ndarray, optional

h0_metatree_list の事前分布を表す、\([0, 1]\) の実数ベクトルです。デフォルトは None です。要素の合計は 1.0 でなければなりません。

get_h0_params()#

事前分布のハイパーパラメータを取得します。

返り値:
h0_paramsdict of {str: float, list, dict, numpy.ndarray}
  • "h0_k_weight_vec":``self.h0_k_weight_vec``の値

  • "h0_g":``self.h0_g``の値

  • "sub_h0_params":``self.sub_h0_params``の値

  • "h0_metatree_list":``self.h0_metatree_list``の値

  • "h0_metatree_prob_vec":``self.h0_metatree_prob_vec``の値

set_hn_params(hn_k_weight_vec=None, hn_g=None, sub_hn_params=None, hn_metatree_list=None, hn_metatree_prob_vec=None)#

事後分布のハイパーパラメータを設定します。

パラメータ:
hn_k_weight_vecnumpy.ndarray, optional

長さが c_dim_continuous+c_dim_categorical である正の実数のベクトルです。デフォルトでは None です。

hn_gfloat, optional

\([0, 1]\) 内の実数。デフォルトは None です

sub_hn_paramsdict, optional

self.SubModel.LearnModel の hn_params は、デフォルトでは None です

hn_metatree_listlist of metatree._Node, optional

メタツリーのルートノード。デフォルトでは None です

hn_metatree_prob_vecnumpy.ndarray, optional

\([0, 1]\) の実数のベクトルで、hn_metatree_list の事前分布を表します。デフォルトは None です。要素の合計は 1.0 でなければなりません。

get_hn_params()#

事後分布のハイパーパラメータを取得します。

返り値:
hn_paramsdict of {str: float, list, dict, numpy.ndarray}
  • "hn_k_weight_vec":``self.hn_k_weight_vec``の値

  • "hn_g":``self.hn_g``の値

  • "sub_hn_params":``self.sub_hn_params``の値

  • "hn_metatree_list":``self.hn_metatree_list``の値

  • "hn_metatree_prob_vec":``self.hn_metatree_prob_vec``の値

update_posterior(x_continuous=None, x_categorical=None, y=None, alg_type='MTRF', **kwargs)#

訓練データを使って事後分布のハイパーパラメータを更新します。

パラメータ:
x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

ynumpy.ndarray

dtypeがintまたはfloatである目的変数の値

alg_type{'MTRF', 'given_MT', 'MTMCMC', 'REMTMCMC'}, optional

アルゴリズムの種類。デフォルトは「MTRF」です

**kwargsdict, optional

アルゴリズムのオプションパラメータ。デフォルトは {} です。

  • alg_type='MTRF' の場合

    • MTRF[1]では、 sklearn.ensemble.RandomForestClassifier または sklearn.ensemble.RandomForestRegressor がサブルーチンとして呼び出されます。 **kwargs として指定された引数は、これらのサブルーチンに渡されます。 したがって、これらのサブルーチンに対して、例えば n_estimators や random_state などのオプションを指定したい場合は、ここで指定することができます。ただし、これらのサブルーチンの max_depth は self.c_max_depth の値に設定されているため、再度設定しようとするとエラーが発生します。

  • alg_type='given_MT’ の場合

    • 'given_MT' にはオプションのパラメータはありません。

  • alg_type='MTMCMC’ の場合

    • burn_in : int

      バーンイン段階の期間は、デフォルトで100です。

    • num_metatrees : int

      バーンイン段階後のサンプリング回数は、デフォルトで500回です。

    • g_max : float

      メトロポリス・ヘイスティングス法における提案分布のエントロピーを制御するためのパラメータの初期値です。デフォルトは 0.0 です。[2] の付録 B.4 も参照してください。g_max は、[2] のアルゴリズム 1 によってバーンイン段階で調整されます。

    • rho : float

      [2]のアルゴリズム1のパラメータで、デフォルト値は0.99です。

    • phi : float

      [2]のアルゴリズム1のパラメータで、デフォルト値は0.999です。

    • p_obj : float

      [2]のアルゴリズム1のパラメータで、デフォルト値は0.3です。 p_obj は、[2]のアルゴリズム1における$r_\mathrm{obj}$に対応します。

    • threshold_type : {'1d_kmeans', 'sample_midpoint'}

      連続説明変数の閾値を生成するルールで、デフォルトでは '1d_kmeans' です。[2] の付録 G も参照してください。

    • seed : {None, int}, 省略可

      numpy.random.default_rng()を初期化するためのシード。デフォルトはNone。

  • alg_type='REMTMCMC’ の場合

    • burn_in : int

      バーンイン段階の期間は、デフォルトで100です。

    • num_metatrees : int

      バーンイン段階後のサンプリング回数は、デフォルトで500回です。

    • num_chains : int

      レプリカ交換モンテカルロ法におけるレプリカの数。デフォルトでは8です。これは[2]の付録Dにおける$J$に相当します。

    • g_max : float

      メトロポリス・ヘイスティングス法における提案分布のエントロピーを制御するパラメータで、デフォルト値は 0.9 です。MTMCMC とは異なり、バーンイン段階では g_max の調整は行われません。[2] の付録 B.4 も参照してください。

    • beta_vec : {None, numpy.ndarray}

      レプリカ交換モンテカルロ法における温度パラメータ。デフォルトは None です。$0 \leq \beta_1 < \beta_2 < \cdots < \beta_J = 1$ を満たす必要があります。None の場合、$\beta_j = j/J$ となります。[2] の付録 D も参照してください。

    • num_interval : int

      レプリカ交換プロセス間の間隔の長さ。デフォルトは10です。[2]の付録Dも参照してください。

    • num_exchange : int

      1回のレプリカ交換プロセスで交換されるレプリカの数。デフォルトは4です。[2]の付録Dも参照してください。

    • threshold_type : {'1d_kmeans', 'sample_midpoint'}

      連続説明変数の閾値を生成するルールで、デフォルトでは '1d_kmeans' です。[2] の付録 G も参照してください。

    • seed : {None, int}, 省略可

      numpy.random.default_rng()を初期化するためのシード。デフォルトはNone。

参照

[1]

Dobashi, N., Saito, S., Nakahara, Y., & Matsushima, T. (2021). Meta-Tree Random Forest: Probabilistic Data-Generative Model and Bayes Optimal Prediction. Entropy, 23(6), 768. Available from https://doi.org/10.3390/e23060768

[2]

Nakahara, Y., Saito, S., Ichijo, N., Kazama, K. & Matsushima, T. (2025). Bayesian Decision Theory on Decision Trees: Uncertainty Evaluation and Interpretability. Proceedings of The 28th International Conference on Artificial Intelligence and Statistics, in Proceedings of Machine Learning Research 258:1045-1053 Available from https://proceedings.mlr.press/v258/nakahara25a.html.

estimate_params(loss='0-1', visualize=True, filename=None, format=None)#

与えられた基準に基づいたパラメータ推定

近似MAPメタツリー \(M_{T,\boldsymbol{k}_b} = \mathrm{argmax} p(M_{T,\boldsymbol{k}_{b'}} | \boldsymbol{x}^n, y^n)\) が返されます。

パラメータ:
lossstr, optional

ベイズリスク関数の基礎となる損失関数で、デフォルトでは "0-1" です。この関数は "0-1" のみをサポートしています。

visualizebool, optional

「True」の場合、推定されたメタツリーが可視化されます。デフォルトでは「True」です。この可視化には「graphviz」が必要です。

filenamestr, optional

図を保存する際のファイル名。デフォルトは「None」です

formatstr, optional

レンダリングの出力形式(「pdf」、 「png」など)。

返り値:
map_rootmetatree._Node

推定されたメタツリーの根ノードであり、各ノードには推定されたパラメータも含まれています。

警告

複数のメタツリーが、同等のモデルクラスを表す場合があります。この関数は、そのような重複を考慮していません。

visualize_posterior(filename=None, format=None, num_metatrees=3, h_params=False)#

パラメータの事後分布を可視化します。

この方法には「graphviz」が必要です。

パラメータ:
filenamestr, optional

図を保存する際のファイル名。デフォルトは「None」です

formatstr, optional

レンダリングの出力形式(「pdf」、 「png」など)。

num_metatreesint, オプション

表示するメタツリーの数。デフォルトは3です。

h_paramsbool, optional

「True」の場合、各ノードのハイパーパラメータが表示されます。「False」の場合、各ノードの推定パラメータが表示されます。

例

>>> from bayesml import metatree
>>> gen_model = metatree.GenModel(
>>>     c_dim_continuous=1,
>>>     c_dim_categorical=1)
>>> gen_model.gen_params(threshold_type='random')
>>> x_continuous,x_categorical,y = gen_model.gen_sample(200)
>>> learn_model = metatree.LearnModel(
>>>     c_dim_continuous=1,
>>>     c_dim_categorical=1)
>>> learn_model.update_posterior(x_continuous,x_categorical,y)
>>> learn_model.visualize_posterior(num_metatrees=2)
_images/metatree_posterior2.png
get_p_params()#

予測分布のパラメータを取得します。

このモデルには、予測分布を表す単純なパラメトリック式がありません。そのため、この関数は「None」を返します。

返り値:
None
calc_pred_dist(x_continuous=None, x_categorical=None)#

予測分布のパラメータを計算します。

パラメータ:
x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

make_prediction(loss=None)#

与えられた基準の下で、新しいデータ点を予測します。

パラメータ:
lossstr, optional

ベイズリスク関数の基礎となる損失関数です。デフォルトでは None です。この関数は、「squared」、「0-1」、および「KL」をサポートしています。損失関数が None の場合、サブモデルが回帰モデル(正規、ポアソン、指数、または線形回帰)であるときは「squared」が使用され、サブモデルが分類モデル(ベルヌーイまたはカテゴリカル)であるときは「0-1」が使用されます。

返り値:
Predicted_valuesnumpy.ndarray

指定された損失関数に基づく予測値です。サブモデルが分類モデル(ベルヌーイまたはカテゴリカル)であり、損失関数が「KL」の場合、予測分布は出現確率からなるnumpy.ndarrayとして返されます。

calc_pred_dist(x_continuous, x_categorical) を呼び出した際、予測値のサイズまたは予測分布の数は、x_continuous および x_categorical の標本サイズと同じになります。

pred_and_update(x_continuous=None, x_categorical=None, y=None, loss=None)#

逐次的に新しいデータ点を予測し、事後分布を更新します。

パラメータ:
x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

ynumpy.ndarray

dtypeがintまたはfloatである目的変数の値

lossstr, optional

ベイズリスク関数の基礎となる損失関数です。デフォルトではNoneです。この関数は、「squared」、「0-1」、および「KL」をサポートしています。

返り値:
Predicted_valuesnumpy.ndarray

指定された損失関数に基づく予測値です。サブモデルが分類モデル(ベルヌーイまたはカテゴリカル)であり、損失関数が「KL」の場合、予測分布は出現確率からなるnumpy.ndarrayとして返されます。

calc_pred_dist(x_continuous, x_categorical) を呼び出した際、予測値のサイズまたは予測分布の数は、x_continuous および x_categorical の標本サイズと同じになります。

calc_pred_var()#

予測分布の分散を計算

返り値:
varsnumpy.ndarray

予測分布の分散です。この分散のサイズは、calc_pred_dist(x) を呼び出した際の x のサンプルサイズと同じです。

calc_feature_importances()#

特徴量の重要度を計算します

返り値:
feature_importancesnumpy.ndarray

特徴量の重要度

calc_pred_density(y)#

予測分布の確率密度関数の値の計算

パラメータ:
ynumpy.ndarray

y のサイズは (sample_size, ) にブロードキャスト可能なものでなければなりません。つまり、最後の次元のサイズは 1 または sample_size でなければなりません。ここで、sample_size は calc_pred_dist(x) を呼び出した際の x のサンプルサイズです。

返り値:
p_ynumpy.ndarray

予測分布の確率密度関数の値です。

fit(x_continuous=None, x_categorical=None, y=None, alg_type='MTRF', **kwargs)#

モデルをデータに当てはめます。

この関数は以下の関数のラッパーです:

>>> self.reset_hn_params()
>>> self.update_posterior(x_continuous,x_categorical,y,alg_type,**kwargs)
>>> return self
パラメータ:
x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

ynumpy.ndarray

dtypeがintまたはfloatである目的変数の値

alg_type{'MTRF', 'given_MT', 'MTMCMC', 'REMTMCMC'}, optional

アルゴリズムの種類。デフォルトは「MTRF」です

**kwargsdict, optional

アルゴリズムのオプションパラメータ。デフォルトは {} です

返り値:
selfLearnModel

The fitted model.

predict(x_continuous=None, x_categorical=None)#

データを予測

この関数は以下の関数のラッパーです:

>>> self.calc_pred_dist(x_continuous,x_categorical)
>>> return self.make_prediction()
パラメータ:
x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

返り値:
Predicted_valuesnumpy.ndarray

サブモデルが回帰モデル(正規、ポアソン、指数、または線形回帰)の場合、二乗損失関数に基づく予測値が返されます。サブモデルが分類モデル(ベルヌーイまたはカテゴリカル)の場合、0-1損失関数に基づく予測値が返されます。予測値のサイズは、x_continuous および x_categorical のサンプルサイズと同じです。

predict_proba(x_continuous=None, x_categorical=None)#

データを予測

この関数は、サブモデルが分類モデル(bernoulli または categorical)である場合にサポートされます。これは、以下の関数のラッパーです:

>>> self.calc_pred_dist(x_continuous,x_categorical)
>>> return self.make_prediction(loss="KL")
パラメータ:
x_continuousnumpy.ndarray, optional

サイズが (sample_size,c_dim_continuous) である2次元のfloat配列です。デフォルトではNoneです。

x_categoricalnumpy.ndarray, optional

サイズが (sample_size,c_dim_categorical) である 2 次元の int 配列です。デフォルトでは None です。各要素 x_categorical[i,j] は、0 <= x_categorical[i,j] < self.c_num_children_vec[self.c_dim_continuous+j] を満たす必要があります。

返り値:
predicted_distributionsnumpy.ndarray

KL損失関数に基づく予測分布です。予測分布の数は、x_continuous および x_categorical の標本サイズと同じです。