# `LAST`

### *class* capymoa.classifier.LAST[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/classifier/_last.py#L16)

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

Local Adaptive Streaming Tree.

Local Adaptive Streaming Tree (LAST) <sup>[1](#l1)</sup> is an incremental decision tree
with adaptive splitting mechanisms. LAST maintains a change detector at each
leaf and splits this node if a change is detected in the error or the leaf’s
data distribution.

An appealing feature of LAST is that users do not need to specify
the Grace Period, Tau threshold and confidence hyperparameters
as in Hoeffding Trees <sup>[2](#l2)</sup>.

```pycon
>>> from capymoa.classifier import LAST
>>> from capymoa.datasets import ElectricityTiny
>>> from capymoa.evaluation import prequential_evaluation
>>> from capymoa.drift.detectors import HDDMAverage
>>>
>>> stream = ElectricityTiny()
>>> classifier = LAST(stream.get_schema(), change_detector=HDDMAverage())
>>> results = prequential_evaluation(stream, classifier, max_instances=1000)
>>> print(f"{results['cumulative'].accuracy():.1f}")
88.6
```

* <a id='l1'>**[1]**</a> Daniel Nowak Assis, Jean Paul Barddal, and Fabrício Enembreck. Just Change on Change: Adaptive Splitting Time for Decision Trees in Data Stream Classification. 39th ACM/SIGAPP Symposium on Applied Computing (SAC ‘24).
* <a id='l2'>**[2]**</a> Daniel Nowak Assis, Jean Paul Barddal, and Fabrício Enembreck. Behavioral insights of adaptive splitting decision trees in evolving data stream classification. Knowledge and Information Systems, 2025.

#### \_\_init_\_(schema: [Schema](capymoa.stream.Schema.md#capymoa.stream.Schema) | [None](https://docs.python.org/3/builtins/constants.html#None) = None, random_seed: [int](https://docs.python.org/3/builtins/functions.html#int) = 0, split_criterion: [str](https://docs.python.org/3/builtins/stdtypes.html#str) | [SplitCriterion](capymoa.core.moa.splitcriteria.SplitCriterion.md#capymoa.core.moa.splitcriteria.SplitCriterion) = 'InfoGainSplitCriterion', change_detector: [MOADriftDetector](capymoa.drift.base_detector.MOADriftDetector.md#capymoa.drift.base_detector.MOADriftDetector) | [None](https://docs.python.org/3/builtins/constants.html#None) = None, monitor_distribution=False, leaf_prediction: [int](https://docs.python.org/3/builtins/functions.html#int) = 'NaiveBayesAdaptive', nb_threshold: [int](https://docs.python.org/3/builtins/functions.html#int) = 0, numeric_attribute_observer: [str](https://docs.python.org/3/builtins/stdtypes.html#str) = 'GaussianNumericAttributeClassObserver', binary_split: [bool](https://docs.python.org/3/builtins/functions.html#bool) = False, max_byte_size: [float](https://docs.python.org/3/builtins/functions.html#float) = 33554433, memory_estimate_period: [int](https://docs.python.org/3/builtins/functions.html#int) = 1000000, stop_mem_management: [bool](https://docs.python.org/3/builtins/functions.html#bool) = True, remove_poor_attrs: [bool](https://docs.python.org/3/builtins/functions.html#bool) = False, disable_prepruning: [bool](https://docs.python.org/3/builtins/functions.html#bool) = True)[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/classifier/_last.py#L48)

Construct Local Adaptive Streaming Tree.

* **Parameters:**
  * **schema** – Stream schema.
  * **random_seed** – Seed for reproducibility.
  * **split_criterion** – Split criterion to use.
  * **change_detector** – The change detector created at leaf nodes
    that determines splitting time upon increase in error or impurity of class
    distribution.
  * **monitor_distribution** – If True, change detector monitors class distribution impurity.
  * **leaf_prediction** – Prediction mechanism used at leafs.
  * **nb_threshold** – Number of instances a leaf should observe before allowing
    Naive Bayes.
  * **numeric_attribute_observer** – The Splitter or Attribute Observer (AO) used
    to monitor the class statistics of numeric features and perform splits.
  * **binary_split** – If True, only allow binary splits.
  * **max_byte_size** – The max size of the tree, in bytes.
  * **memory_estimate_period** – Interval (number of processed instances) between
    memory consumption checks.
  * **stop_mem_management** – If True, stop growing as soon as memory limit is
    hit.
  * **remove_poor_attrs** – If True, disable poor attributes to reduce memory
    usage.
  * **disable_prepruning** – If True, disable merit-based tree pre-pruning.

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

#### *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: [Instance](capymoa.core.Instance.md#capymoa.core.Instance)) → [int](https://docs.python.org/3/builtins/functions.html#int) | [None](https://docs.python.org/3/builtins/constants.html#None)[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/base/_classifier.py#L56)

Predict the label of an instance.

The base implementation calls [`predict_proba()`](#capymoa.classifier.LAST.predict_proba) and returns the
label with the highest probability.

* **Parameters:**
  **instance** – The instance to predict the label for.
* **Returns:**
  The predicted label or `None` if the classifier is unable
  to make a prediction.

#### predict_proba(instance) → [ndarray](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray)[[tuple](https://docs.python.org/3/builtins/stdtypes.html#tuple)[[Any](https://docs.python.org/3/library/typing.html#typing.Any), ...], [dtype](https://numpy.org/doc/stable/reference/generated/numpy.dtype.html#numpy.dtype)[float64]] | [None](https://docs.python.org/3/builtins/constants.html#None)[[source]](https://github.com/adaptive-machine-learning/CapyMOA/blob/3e255b1/src/capymoa/base/_classifier.py#L117)

Return probability estimates for each label.

* **Parameters:**
  **instance** – The instance to estimate the probabilities for.
* **Returns:**
  An array of probabilities for each label or `None` if the
  classifier is unable to make a prediction.

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

Train the classifier with a labeled instance.

* **Parameters:**
  **instance** – The labeled instance to train the classifier with.

#### random_seed *: [int](https://docs.python.org/3/builtins/functions.html#int)*

The random seed for reproducibility.

When implementing a classifier ensure random number generators are seeded.

#### schema *: [Schema](capymoa.stream.Schema.md#capymoa.stream.Schema)*

The schema representing the instances.
