Adding Learners#

This document describes adding a new classifier, regressor, or another learner to CapyMOA. Before doing this, you should have read the installation guide to set up your development environment.

Where does my new learner go?#

You should add your new learner to the appropriate directory:

  • Classifiers go in src/capymoa/classifier.

  • Regressors go in src/capymoa/regressor.

  • Semi-supervised classifiers go in src/capymoa/ssl/classifier.

Each standalone learner should be in its own file, prefixed with _ to indicate that they are not meant to be imported directly. Instead, they are imported by an __init__.py file. The __init__.py file is a special file that tells Python to treat the directory as a package.

For example, to add a new classifier class called MyNewLearner, you should implement it in src/capymoa/classifier/_my_new_learner.py and add it to the src/capymoa/classifier/__init__.py file. The __init__.py will look like this:

from ._my_new_learner import MyNewLearner
...
__all__ = [
    'MyNewLearner',
    ...
]

The prefix and init files allow users to import all classifiers, regressors, or semi-supervised from one package while splitting the code into multiple files. You can, for example, import your new learner with the following:

from capymoa.classifier import MyNewLearner

What does a learner implement?#

A learner should implement the appropriate interface:

  • capymoa.base.Classifier for classifiers.

  • capymoa.base.Regressor for regressors.

  • capymoa.base.ClassifierSSL for semi-supervised classifiers.

If your method is a wrapper around a MOA learner, you should use the appropriate base class:

  • capymoa.base.MOAClassifier for classifiers.

  • capymoa.base.MOARegressor for regressors.

How do I test my new learner?#

You should add a test to ensure your learner achieves and continues to achieves the expected performance in future versions. CapyMOA provides parametrized tests for classifiers, regressors, and semi-supervised classifiers. You should not need to write any new test code. Instead, you should add your test’s parameters to the appropriate test file:

  • tests/test_classifiers.py for classifiers.

  • tests/test_regressors.py for regressors.

  • tests/test_ssl_classifiers.py for semi-supervised classifiers.

To run your tests, use the following command:

python -m pytest -k MyNewLearner

The -k MyNewLearner flag tells PyTest to run tests containing MyNewLearner in the test ID.

  • If you want to add documented exemplar usage of your learner, you can add doctests. See the testing guide for more information.

  • If you need custom test code for your learner, you can add a new test file in tests.

How do I document my new learner?#

You should add a docstring to your learner that describes the learner and its parameters. The docstring should be in the Sphinx format. Check the documenation guide for more information and an example.

How to debug failed GitHub Actions?#

Before submitting your pull request, you may wish to run all tests to ensure your changes will succeed in GitHub Actions. You can run all tests with:

invoke test

If you run into issues with GitHub actions failing to build documentation. Follow the instructions in the documentation guide to build the documentation locally. The documentation build settings are intentionally strict to ensure the documentation builds correctly.