Skip to content

Commit

Permalink
added composite network to documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
jrzkaminski committed Aug 4, 2023
1 parent a4cd82c commit debf3bd
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 16 deletions.
11 changes: 9 additions & 2 deletions bamt/networks/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -655,7 +655,12 @@ def wrapper():
c.name
for c in self.nodes
if type(c).__name__
not in ("DiscreteNode", "LogitNode", "CompositeDiscreteNode", "ConditionalLogitNode")
not in (
"DiscreteNode",
"LogitNode",
"CompositeDiscreteNode",
"ConditionalLogitNode",
)
]
positive_columns = [
c for c in cont_nodes if self.descriptor["signs"][c] == "pos"
Expand Down Expand Up @@ -892,7 +897,9 @@ def _encode_categorical_data(self, data):
return data

def _decode_categorical_data(self, data):
data = data.apply(lambda col: pd.to_numeric(col).astype(int) if col.dtype == 'object' else col)
data = data.apply(
lambda col: pd.to_numeric(col).astype(int) if col.dtype == "object" else col
)
for column, encoder in self.encoders.items():
data[column] = encoder.inverse_transform(data[column])
return data
4 changes: 1 addition & 3 deletions bamt/nodes/gaussian_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,7 @@ def choose(self, node_info: GaussianParams, pvals: List[float]) -> float:
model = pickle.loads(a)

if type(self).__name__ == "CompositeContinuousNode":
pvals = [
int(item) if isinstance(item, str) else item for item in pvals
]
pvals = [int(item) if isinstance(item, str) else item for item in pvals]

cond_mean = model.predict(np.array(pvals).reshape(1, -1))[0]
var = node_info["variance"]
Expand Down
4 changes: 1 addition & 3 deletions bamt/nodes/logit_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,7 @@ def choose(self, node_info: LogitParams, pvals: List[Union[float]]) -> str:
model = pickle.loads(a)

if type(self).__name__ == "CompositeDiscreteNode":
pvals = [
int(item) if isinstance(item, str) else item for item in pvals
]
pvals = [int(item) if isinstance(item, str) else item for item in pvals]
distribution = model.predict_proba(np.array(pvals).reshape(1, -1))[0]

# choose
Expand Down
5 changes: 5 additions & 0 deletions docs/source/api/networks.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ Networks Module
:undoc-members:
:show-inheritance:

.. automodule:: bamt.networks.composite_bn
:members:
:undoc-members:
:show-inheritance:

.. automodule:: bamt.networks.big_brave_bn
:members:
:undoc-members:
Expand Down
63 changes: 63 additions & 0 deletions docs/source/models/bayesiannetworks/composite_bn.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
Composite Bayesian Networks
------------------------

.. autoclass:: bamt.networks.composite_bn.CompositeBN
:members:
:no-undoc-members:

Network initialization
~~~~~~~~~~~~~~~~~~~~~~

If the dataset contains both discrete and continuous variables, ``CompositeBN`` is can be used.
To initialize a ``CompositeBN`` object, you can use the following code:

.. code-block:: python
from bamt.networks.composite_bn import CompositeBN
bn = CompositeBN()
Data Preprocessing
~~~~~~~~~~~~~~~~~~

Before applying any structure or parametric learning, the data should be preprocessed as follows:

.. code-block:: python
import bamt.Preprocessor as pp
import pandas as pd
from sklearn import preprocessing
data = pd.read_csv("path/to/data")
encoder = preprocessing.LabelEncoder()
p = pp.Preprocessor([("encoder", encoder)])
preprocessed_data, _ = p.apply(data)
Structure Learning
~~~~~~~~~~~~~~~~~~

For structure learning of Composite BNs, ``bn.add_nodes()`` and ``bn.add_edges()`` methods are used.
Data should be non-preprocessed when passed to ``bn.add_edges()``

.. code-block:: python
info = p.info
bn.add_nodes(info)
bn.add_edges(data) # !!! non-preprocessed
Parametric Learning
~~~~~~~~~~~~~~~~~~~

For parametric learning of continuous BNs, ``bn.fit_parameters()`` method is used.

.. code-block:: python
bn.fit_parameters(data) # !!! non-preprocessed
bn.get_info()
6 changes: 3 additions & 3 deletions docs/source/models/bayesiannetworks/continuous_bn.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Continuous Bayesian Networks
----------------------------

.. autoclass:: bamt.networks.ContinuousBN
.. autoclass:: bamt.networks.continuous_bn.ContinuousBN
:members:
:no-undoc-members:

Expand All @@ -13,9 +13,9 @@ To initialize a ``ContinuousBN`` object, you can use the following code:

.. code-block:: python
import bamt.Networks as Nets
from bamt.networks.continuous_bn import ContinuousBN
bn = Nets.ContinuousBN(use_mixture=True)
bn = ContinuousBN(use_mixture=True)
ContinuousBN has an additional parameter ``use_mixture``.
It is used to determine whether to use mixuters of Gaussian distributions to represent the conditional distribution of continuous variables.
Expand Down
4 changes: 2 additions & 2 deletions docs/source/models/bayesiannetworks/discrete_bn.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ To initialize a ``DiscreteBN`` object, you can use the following code:

.. code-block:: python
import bamt.Networks as Nets
from bamt.networks.discrete_bn import DiscreteBN
bn = Nets.DiscreteBN()
bn = DiscreteBN()
Data Preprocessing
~~~~~~~~~~~~~~~~~~
Expand Down
6 changes: 3 additions & 3 deletions docs/source/models/bayesiannetworks/hybrid_bn.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Hybrid Bayesian Networks
------------------------

.. autoclass:: bamt.networks.HybridBN
.. autoclass:: bamt.networks.hybrid_bn.HybridBN
:members:
:no-undoc-members:

Expand All @@ -13,9 +13,9 @@ To initialize a ``HybridBN`` object, you can use the following code:

.. code-block:: python
import bamt.Networks as Nets
from bamt.networks.hybrid_bn import HybridBN
bn = Nets.HybridBN(has_logit=True, use_mixture=True)
bn = HybridBN(has_logit=True, use_mixture=True)
HybridBN has two additional parameters ``has_logit`` and ``use_mixture``.
``has_logit`` is used to determine whether to use logit nodes. Logit nodes use machine learning algorithms to represent variable.
Expand Down

0 comments on commit debf3bd

Please sign in to comment.