Framework
JuliaAI/MLJ.jl avatar
JuliaAI/MLJ.jl

MLJ.jl: a common interface for 200+ machine learning models in Julia

A Julia machine learning framework

1,941 stars159 forksJuliaNOASSERTION

At a glance

What is it?
MLJ.jl is an umbrella package that gives Julia users one API for selecting, tuning, evaluating and composing models from many packages. It is aimed at people who want model choice without rewriting glue code, and it costs a dependency on the wider JuliaML ecosystem.
Who is it for?
Adopt MLJ.jl if you are already working in Julia and want one interface over many models, or if you need meta-algorithms such as tuning and stacking without writing them yourself. Do not adopt it as a way to call scikit-learn style Python code from Julia, and do not adopt it if you need a single self-contained package with no ecosystem dependencies, because the README describes MLJ.jl as an umbrella package for components distributed in other packages.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 13 days ago.
What is it written in?
Mainly Julia, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem MLJ.jl solves: one interface over many Julia model packages

Julia's machine learning code is spread across many packages, each with its own fit and predict conventions. The README describes MLJ as a toolbox providing a common interface and meta-algorithms for selecting, tuning, evaluating, composing and comparing over 200 machine learning models written in Julia and other languages. That interface is the product. If you switch from one gradient boosting implementation to another, the model type changes but the workflow around it does not, because resampling, tuning and evaluation are written against the interface rather than against a specific model.

The audience is narrower than the model count suggests. MLJ.jl is for people who have already chosen Julia and now need model selection, hyperparameter tuning, pipeline composition or stacking. It is not a first machine learning library for someone who has never fit a model, and it is not a Python compatibility layer. The README points new users to juliaml.ai and documentation to the stable docs site, and it points model authors to MLJModelInterface.jl, which is the package that defines the contract a model must satisfy to appear in MLJ.

One structural consequence is worth stating plainly. MLJ.jl is an umbrella package. The models and much of the machinery live in other packages, so installing MLJ.jl does not by itself give you every model in the browser. You add the interface packages for the models you actually want.

How the interface, model registry and meta-algorithms fit together

The architecture visible from the repository is a separation between the framework and the models. MLJModelInterface.jl defines what a model must implement for the framework to treat it uniformly. MLJ.jl then supplies the operations that work on anything satisfying that interface: resampling and evaluation, hyperparameter tuning, and composition into pipelines and ensembles. The topics list on the repository names classification, regression, clustering, ensemble learning, pipelines, stacking, tuning and predictive modeling, which matches that split.

The data flow is the standard one, with the interface in the middle. A user constructs a model value, wraps it in a machine that binds the model to data, fits it, and then predicts. Meta-algorithms are themselves models in this scheme, so a tuned model or a stacked ensemble can be passed to the same evaluation machinery as a plain classifier. That is what makes the composition story work: the framework does not need a special case for ensembles because an ensemble is just another thing implementing the interface.

Model authoring is a separate path. The README sends people integrating an existing model to the MLJModelInterface documentation rather than to MLJ.jl itself. In practice this means the framework's surface area is small and the ecosystem's surface area is large, and the two are versioned separately. When something breaks, the first question is usually which interface package is involved, not whether MLJ.jl itself changed.

Installing MLJ.jl and running a first fit

The README does not print install commands. It links to juliaml.ai for new users and to the stable documentation, and it describes MLJ.jl as an umbrella package for components distributed in other packages. The repository gives no code snippet to copy, so there is no install command to quote here. Anyone who wants the exact syntax should start from the stable documentation linked in the README, or from the Julia package manager documentation for adding a registered package.

What the repository does give you is a set of runnable examples, and those are the closest thing to a first use. The examples directory contains examples/README.md, examples/generate.jl, examples/lightning_tour/ and examples/using_mlj/. The lightning tour and the using_mlj directory are the two entry points a new user would read first, and examples/README.md describes what each one covers.

Because the examples are versioned with the source, they match the API of the branch you are on. That matters here: the default branch is dev, not main, so examples read on GitHub may run ahead of the latest tagged release. If you want examples that match a release, check out the tag first, then read the examples from that checkout.

What you should expect after a successful setup is the MLJ namespace available in your session plus the model types from whichever interface package you added. If a model type is missing, the usual cause is that its interface package was not added, not that MLJ.jl failed to load.

Where MLJ.jl is the wrong tool

The clearest limitation is dependency shape. A single-model project that needs one classifier and nothing else pays for the interface, the model registry and the meta-algorithm machinery in exchange for conveniences it will not use. If your workflow is fit, predict, done, a model package used directly is less to install and less to keep in sync.

The second limitation is documentation coverage in the README itself. The README is a signpost: it links to juliaml.ai, to the stable and dev documentation, and to MLJModelInterface.jl for integration. It does not document installation, it does not show a fit and predict example, and it does not describe rollback or version pinning. Anyone evaluating MLJ.jl from the repository page alone is evaluating a landing page, not the framework. The real material is on the documentation site and in the examples directory.

The third is ecosystem coupling. The repository's top-level entries include GOVERNANCE.md, CONTRIBUTING.md, ROADMAP.md and ORGANIZATION.md, which is the layout of a project that expects coordination across multiple packages and maintainers. That coordination is the source of MLJ's breadth, and it is also why a change in an interface package can affect users who never touched MLJ.jl directly. There is no way to take the interface without taking the ecosystem.

MLJ.jl compared with calling scikit-learn from Julia

The obvious alternative for a Julia user is to skip the native stack and call Python's scikit-learn through a bridge. The difference in approach is where the data lives. A bridge passes arrays across a language boundary and returns Python objects, so the estimator, its fitted state and its hyperparameters are Python objects. MLJ.jl keeps models as Julia values that satisfy MLJModelInterface, so tuning, resampling and composition operate on Julia objects with no serialization step.

That distinction matters most in composition. Stacking a Julia model on top of a bridged Python model inside one MLJ pipeline is possible, but the two halves do not share the same interface contract, and the README's claim of over 200 models written in Julia and other languages is the framework's answer to that: bring the model into the interface instead of wrapping the pipeline around two conventions.

The trade-off runs the other way for ecosystem size. scikit-learn has a much larger body of tutorials, Stack Overflow answers and third-party tooling. MLJ.jl's documentation is the stable and dev sites linked from the README, plus the examples in the repository. If your team's institutional knowledge is Python, a bridge may be cheaper than retraining everyone on Julia idioms, even though the runtime story is worse.

Maintenance, releases and licence status

The repository is not archived, and the last push was on 2026-09-07. Recent releases are v0.23.1 on 2026-04-07, v0.23.2 on 2026-04-13, and v0.23.3 on 2026-07-22. The version series is still 0.x, which is worth weighing: minor version bumps can carry interface changes, and the default branch is dev rather than main, so the branch you read on GitHub is not necessarily the released state. Pin to a tagged release if you need reproducibility.

Upgrade cost is ecosystem-shaped rather than package-shaped. Because models arrive through separate interface packages, an MLJ.jl upgrade can require matching upgrades of those packages, and the reverse is also true. The repository's ROADMAP.md and GOVERNANCE.md are the places to look for how those coordinated changes are planned; the README does not describe a compatibility policy.

The licence situation needs care. The README carries an MIT licence badge linking to opensource.org/licenses/MIT, while the repository metadata reports the licence as NOASSERTION, and the top-level entry is LICENCE.md rather than a plain LICENSE file. The two signals do not agree, and the repository's own LICENCE.md is the file that governs. Read it, and read the licences of the individual model packages you add, because those are separate works with their own terms. This is a description of what the repository states, not legal advice.

Editorial conclusion

Adopt MLJ.jl if you are already working in Julia and want one interface over many models, or if you need meta-algorithms such as tuning and stacking without writing them yourself. Do not adopt it as a way to call scikit-learn style Python code from Julia, and do not adopt it if you need a single self-contained package with no ecosystem dependencies, because the README describes MLJ.jl as an umbrella package for components distributed in other packages. Before committing, check the model browser for the specific model you need, confirm that the model's interface package installs and loads on your Julia version, and read the stable documentation for the current API rather than relying on older tutorials.

Frequently asked questions

What is MLJ.jl used for?

The README describes it as a toolbox providing a common interface and meta-algorithms for selecting, tuning, evaluating, composing and comparing over 200 machine learning models written in Julia and other languages. In practice it is the layer that lets you swap models, tune them and build pipelines without rewriting the surrounding code.

Is Julia better than Python for machine learning?

The repository does not make that comparison, and nothing in it supports a general claim either way. What the README does state is that MLJ.jl covers models written in Julia and other languages, so a Julia workflow can reach beyond Julia implementations. The choice depends on your team and your existing code, not on anything documented here.

What are the main 3 types of ML models?

The repository does not enumerate three types. Its topics list names classification, regression and clustering alongside ensemble learning, pipelines, stacking and tuning, which is a description of what the framework supports rather than a taxonomy of model families.

Is Julia still being used?

The repository cannot answer that about the language as a whole. It does show that MLJ.jl itself is not archived, with a last push on 2026-09-07 and a v0.23.3 release on 2026-07-22.

Official sources

  1. Issues
  2. JuliaAI/MLJ.jl on GitHub
  3. Project website
  4. README
  5. Releases
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.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/juliaai-mlj-jl.svg)](https://hysenlabs.com/projects/juliaai-mlj-jl)