combo's only release is from February 2020, and its matplotlib dependency is optional in prose and required in the file
(AAAI' 20) A Python Toolbox for Machine Learning Model Combination
At a glance
- What is it?
- A model and score combination toolbox from an AAAI 2020 demo track paper, with Stacking, DCS, DES, EAC and LSCP over scikit-learn, xgboost and LightGBM base learners. The library is still moving, the packaging says otherwise, and the one code sample on the page cannot run.
- Who is it for?
- The library itself is worth a look if you are combining classifiers, clustering or outlier detectors, because the API is one import and one constructor, the algorithm list covers the mainstream approaches, and numba plus joblib are used where the work allows it. The packaging around it has drifted.
- Can I use it commercially?
- Yes. BSD-2-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 67 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- yzhao062/combo660 ★ · -1
| Repository | 2026-09-11 | 2026-11-14 |
|---|---|---|
| yzhao062/combo | 661 | 660 |
-1 Stars in the last 64 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The only release is from 2020, and the page tells you to install a pre-release
There is one release tag in this repository, V0.1.0, published on 19 February 2020 and labelled a stable release. The default branch has been pushed to as late as 8 September 2026, so the source has moved six and a half years past the only thing PyPI has a tag for. The installation section acknowledges this without quite saying it: it recommends pip, asks you to make sure the latest version is installed because the library is updated frequently, and then gives three commands.
pip install combo # normal install
pip install --upgrade combo # or update if needed
pip install --pre combo # or include pre-release version for new featuresSo the documented way to get the features described on the page is the third command, because the stable tag no longer contains them. Nothing states which pre-release is current or how far it has drifted from 0.1.0.
matplotlib is optional in the prose and mandatory in the requirements file
The dependency list marks one entry as optional:
* Python 3.5, 3.6, or 3.7 * joblib * matplotlib (optional for running examples) * numpy>=1.13 * numba>=0.35 * pyod * scipy
The file behind it disagrees. requirements.txt lists joblib, matplotlib, numpy>=1.13, numba>=0.35, pyod, scipy and scikit-learn at 0.20 or newer, with matplotlib and scipy and joblib carrying no floor at all, and setup.py reads that file and passes the lines straight into install_requires. So the annotation that makes matplotlib optional exists in the readme while the packaging makes it a hard requirement of the library, and four of the seven entries are unpinned. The scikit-learn entry is also written differently from the way the page writes it, which resolvers normalise but which no other line in the file does. The pyod entry is the same author's separate outlier detection library, and the page's own citation list references a PyOD paper.
Pre-Alpha metadata sits next to a stable release and five audiences
setup.py declares `Development Status :: 2 - Pre-Alpha` and then five intended audiences: education, financial and insurance industry, science and research, developers, and information technology. Set that against the single release tag, whose name contains the words stable release, and the package's own description, which names an AAAI 2020 conference paper in the demo track. A library can be any of those things, but declaring a pre-development status for something aimed at financial and insurance users is a mismatch worth noticing, particularly when the classifier list also stops its Python versions at 3.5 in the visible portion. The author is listed with a Carnegie Mellon address, and the package keeps a citation file at the root alongside a changelog.
The API demo uses five classifiers it never imports
There is one code sample on the page and it will not run:
from combo.models.classifier_stacking import Stacking
# initialize a group of base classifiers
classifiers = [DecisionTreeClassifier(), LogisticRegression(),
KNeighborsClassifier(), RandomForestClassifier(),
GradientBoostingClassifier()]Only one import is present. DecisionTreeClassifier, LogisticRegression, KNeighborsClassifier, RandomForestClassifier and GradientBoostingClassifier are all used and none is imported, so the first line a reader copies raises a name error, and the four variables the fitted model is then asked to train on are undefined as well. What the sample does show is the shape of the API: one import from a module named for the algorithm, a base estimators list, and a fit followed by label and probability prediction. The example directory carries the same algorithms as separate scripts, one each for stacking, dynamic classifier selection, direct ensemble selection, clustering combination, outlier detector combination, probability combination and use of multiple libraries, so the runnable versions of these snippets live beside them rather than on this page.
Four CI badges, a Travis file, and a claim of frequent updates
The header carries more badges than the project has releases. There is a GitHub Actions workflow badge for a testing workflow, a Circle CI badge, an AppVeyor status badge pinned to the master branch, Coveralls for coverage, and Code Climate for maintainability. The repository root matches with a CircleCI directory, an AppVeyor configuration file and a Travis configuration file, so four continuous integration systems are configured for one package. Some of those services have changed their free offerings for open source since the only tag was cut, and the page does not say which of the four is the one that currently gates a merge. Against that, the text asks you to install the latest version because the library is updated frequently, which is true of the branch and not true of the published artefact. A repository with a changelog file, a citation file, a manifest file and a file of PyPI build commands at its root also looks hand packaged rather than released automatically, which is consistent with a single tag.
The table of contents promises nine sections and the text carries one
The contents list names installation, an API cheatsheet and reference, the implemented algorithms, four worked examples covering stacking and DCS and DES, simple classifier combination, clustering combination and outlier detector combination, then development status and inclusion criteria. The body text on the page reaches only the installation heading before it ends. So eight of the nine destinations in the contents belong to a document section a reader cannot see from here, and the anchors carry older names: the first example's link is `#example-of-stackingdcsdes`, which does not match its own title with the numbering added. Everything a user needs beyond install is on the documentation site, with the notebooks directory and the examples directory as the other two places it can be learned.
The download URL points at the branch, and a do-not-use script sits in examples
The packaging metadata sets the download URL to a zip archive of the master branch rather than of a release, so the link PyPI shows after install points at unreviewed commits instead of the version you installed. Two smaller signals point the same way. The repository carries a changelog, a citation file, a manifest file and a file of PyPI build commands at the root, which is the shape of a project that has been packaged by hand rather than continuously. And the examples directory contains a file named `temp_do_not_use.py` alongside nine working example scripts and a data directory, so a script the author marked as unusable is still published where a reader browsing the folder will find it.
Editorial conclusion
The library itself is worth a look if you are combining classifiers, clustering or outlier detectors, because the API is one import and one constructor, the algorithm list covers the mainstream approaches, and numba plus joblib are used where the work allows it. The packaging around it has drifted. The single release predates six and a half years of commits, the supported Python versions stop at 3.7, a dependency the page calls optional is unconditional in the file that becomes the install requirements, and the metadata calls a package Pre-Alpha while its only tag is labelled a stable release. None of that stops the code working on a modern stack, but it does mean you should check the versions yourself rather than trusting the classifiers, and install the pre-release if you want current behaviour. Before relying on it, verify that numba, pyod and the unpinned scipy and joblib still resolve against your environment, and confirm the API for the specific combiner you want, since the documentation site is the only detailed reference and the page's example is missing its imports. It suits a research codebase revisiting model combination. It does not suit a production dependency that needs a version policy.
Frequently asked questions
What is the combo library?
A BSD licensed Python toolbox for combining machine learning models and scores, presented as an AAAI 2020 demo track paper. It combines base learners from scikit-learn, xgboost and LightGBM for classification, clustering and anomaly detection, with algorithms named on the page including Stacking, DCS, DES, EAC and LSCP, and uses numba and joblib for speed where possible.
How do I install combo?
The page recommends pip and offers three commands: a normal install, an upgrade, and a pre-release install for new features. It also offers cloning the repository and running pip install in the checkout. The documented supported versions are Python 3.5, 3.6 or 3.7, and the only published release is V0.1.0 from February 2020.
How do I combine classifiers with combo?
By importing the algorithm's module and passing a list of base estimators, as in `Stacking(base_estimators=classifiers)` followed by a fit and then predict and predict_proba. The page's own snippet omits the imports for the five classifiers it instantiates, so copy it as a shape rather than as runnable code.
What does combo require at install time?
Seven entries: joblib, matplotlib, numpy 1.13 or newer, numba 0.35 or newer, pyod, scipy, and scikit-learn 0.20 or newer. The page marks matplotlib as optional for running examples, while setup.py reads that file line by line and passes it to install_requires, so all seven are installed. Four of them carry no version floor.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/yzhao062-combo)Star history chart for your README
[](https://hysenlabs.com/projects/yzhao062-combo)Was this useful?