# `SOKNLBT`

### *class* capymoa.regressor.SOKNLBT[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/regressor/_soknl_base_tree.py#L13)

Bases: [`MOARegressor`](capymoa.base.MOARegressor.md#capymoa.base.MOARegressor)

The base tree for Self-Optimising K Nearest Leaves as distribed by Sun. at el.

SOKNLBT modifies the FIMT-DD algorithm to store information at the leaves that
allows SOKNL to calculate the distance between a given instance and a leaf.

See also [`capymoa.regressor.SOKNL`](capymoa.regressor.SOKNL.md#capymoa.regressor.SOKNL) and py:class:capymoa.regressor.FIMTDD
See [`capymoa.base.MOARegressor`](capymoa.base.MOARegressor.md#capymoa.base.MOARegressor) for train and predict.

Reference:

[Sun, Yibin, Bernhard Pfahringer, Heitor Murilo Gomes, and Albert Bifet.
“SOKNL: A novel way of integrating K-nearest neighbours with adaptive random forest regression for data streams.”
Data Mining and Knowledge Discovery 36, no. 5 (2022): 2006-2032.](https://researchcommons.waikato.ac.nz/server/api/core/bitstreams/f91959c0-1515-44c3-bd5f-737135ee3e48/content)

Example usage:

```pycon
>>> from capymoa.datasets import Fried
    >>> from capymoa.regressor import SOKNLBT
    >>> from capymoa.evaluation import prequential_evaluation
>>> stream = Fried()
>>> schema = stream.get_schema()
>>> learner = SOKNLBT(schema)
>>> results = prequential_evaluation(stream, learner, max_instances=1000)
>>> results["cumulative"].rmse()
4.950050301515773
```

#### \_\_init_\_(schema: [Schema](capymoa.stream.Schema.md#capymoa.stream.Schema), subspace_size_size: [int](https://docs.python.org/3/builtins/functions.html#int) = 2, split_criterion: [SplitCriterion](capymoa.core.moa.splitcriteria.SplitCriterion.md#capymoa.core.moa.splitcriteria.SplitCriterion) | [str](https://docs.python.org/3/builtins/stdtypes.html#str) = 'VarianceReductionSplitCriterion', grace_period: [int](https://docs.python.org/3/builtins/functions.html#int) = 200, split_confidence: [float](https://docs.python.org/3/builtins/functions.html#float) = 1.0e-7, tie_threshold: [float](https://docs.python.org/3/builtins/functions.html#float) = 0.05, page_hinckley_alpha: [float](https://docs.python.org/3/builtins/functions.html#float) = 0.005, page_hinckley_threshold: [int](https://docs.python.org/3/builtins/functions.html#int) = 50, alternate_tree_fading_factor: [float](https://docs.python.org/3/builtins/functions.html#float) = 0.995, alternate_tree_t_min: [int](https://docs.python.org/3/builtins/functions.html#int) = 150, alternate_tree_time: [int](https://docs.python.org/3/builtins/functions.html#int) = 1500, learning_ratio: [float](https://docs.python.org/3/builtins/functions.html#float) = 0.02, learning_ratio_decay_factor: [float](https://docs.python.org/3/builtins/functions.html#float) = 0.001, learning_ratio_const: [bool](https://docs.python.org/3/builtins/functions.html#bool) = False, random_seed: [int](https://docs.python.org/3/builtins/functions.html#int) | [None](https://docs.python.org/3/builtins/constants.html#None) = None) → [None](https://docs.python.org/3/builtins/constants.html#None)[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/regressor/_soknl_base_tree.py#L42)

Construct SelfOptimisingBaseTree.

* **Parameters:**
  * **subspace_size_size** – Number of features per subset for each node split. Negative values = #features - k
  * **split_criterion** – Split criterion to use.
  * **grace_period** – Number of instances a leaf should observe between split attempts.
  * **split_confidence** – Allowed error in split decision, values close to 0 will take long to decide.
  * **tie_threshold** – Threshold below which a split will be forced to break ties.
  * **page_hinckley_alpha** – Alpha value to use in the Page Hinckley change detection tests.
  * **page_hinckley_threshold** – Threshold value used in the Page Hinckley change detection tests.
  * **alternate_tree_fading_factor** – Fading factor used to decide if an alternate tree should replace an original.
  * **alternate_tree_t_min** – Tmin value used to decide if an alternate tree should replace an original.
  * **alternate_tree_time** – The number of instances used to decide if an alternate tree should be discarded.
  * **learning_ratio** – Learning ratio to used for training the Perceptrons in the leaves.
  * **learning_ratio_decay_factor** – Learning rate decay factor (not used when learning rate is constant).
  * **learning_ratio_const** – Keep learning rate constant instead of decaying.

#### cli_help()[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/base/_regressor.py#L53)

#### *classmethod* from_params(schema: [Any](https://docs.python.org/3/library/typing.html#typing.Any) = None, params: [dict](https://docs.python.org/3/builtins/stdtypes.html#dict)[[str](https://docs.python.org/3/builtins/stdtypes.html#str), [Any](https://docs.python.org/3/library/typing.html#typing.Any)] | [None](https://docs.python.org/3/builtins/constants.html#None) = None, random_seed: [int](https://docs.python.org/3/builtins/functions.html#int) = 1) → [Any](https://docs.python.org/3/library/typing.html#typing.Any)[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/base/_learner_params.py#L170)

Construct an instance from parameters produced by `get_params`.

#### get_params() → [dict](https://docs.python.org/3/builtins/stdtypes.html#dict)[[str](https://docs.python.org/3/builtins/stdtypes.html#str), [Any](https://docs.python.org/3/library/typing.html#typing.Any)][[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/base/_learner_params.py#L163)

Return the hyper-parameters captured from the constructor.

#### predict(instance)[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/base/_regressor.py#L59)

#### train(instance)[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/base/_regressor.py#L56)
