NumPy implementations expose the mechanics behind familiar models
ML-From-Scratch is designed for reading. Its supervised section includes linear and logistic regression, decision trees, random forests, support-vector machines, nearest neighbors, boosting, and a small XGBoost implementation. The unsupervised side covers clustering, association rules, PCA, mixture models, autoencoders, and generative models. A homegrown neural-network module supplies layers, activations, losses, and optimizers, so readers can follow data through forward and backward passes.
The whole checkout is small enough to browse in an afternoon: our scan found 89 files, about 6,954 lines of source, and 0.3 MB on disk. That compactness is the attraction. A learner can jump from an example into one implementation file and see the arrays being manipulated. There is far less framework machinery to cross than in a current training library.
Thirty-five installed packages are more than the source suggests
Installation still pulls a standard scientific Python environment. Our run added 35 packages and occupied 37 MB, compared with the 0.3 MB checkout. The dependency list includes NumPy, SciPy, pandas, matplotlib, cvxopt, Gym, progress bars, table formatting, and scikit-learn through the old sklearn distribution name. There is no account, model download, hosted service, or secret to configure for the package itself.
The documented command is python setup.py install, and the package declares version 0.0.4. Requirements have no version ranges, so a fresh install resolves whatever compatible packages the index offers that day. Open pull requests propose replacing sklearn with scikit-learn, removing deprecated dataset calls, and correcting formulas. Anyone teaching from a shared environment should freeze a known set rather than asking a class to resolve those differences independently.
What happened when we ran it
Our fresh unprivileged Debian sandbox, with 3 CPUs and 8 GB of RAM, installed ML-From-Scratch in 48 seconds. The install succeeded with 35 packages and 37 MB on disk. The build also succeeded in 16 seconds. Pip-audit reported 0 known vulnerabilities in the installed dependency set at commit a2806c6.
No tests script or target existed, so the lab skipped tests. The measured repository also had no tests directory, 0 CI workflow files, and no Dockerfile. The absence of a failing test log is therefore not evidence that all algorithms work. Our checks established that the package installs and builds; they did not execute polynomial regression, fit a tree, train the neural-network code, or compare predictions against a reference.
That distinction matters more here than it would for a collection of static notes. The project contains numerical algorithms whose mistakes may return plausible output rather than crash. A regression coefficient, probability, or gradient can be wrong while its shape looks right. With 6,954 source lines and no automated checks in the measured checkout, readers must create small known cases or compare results with another implementation.
Open reports identify concrete errors in regression examples
Issue 110 records the polynomial-regression example failing while constructing cross-validation folds because NumPy rejects an inhomogeneous array shape. Pull request 139 proposes a fix and remains open. Issue 123 reports that LinearRegression resets its regularization object to None, then raises when fit tries to call it. These are specific failures in advertised examples, not complaints about speed or coding style.
The measured build took 16 seconds because it did not run those examples. Issue 124 separately argues that logistic regression omits a 1 / n_samples factor in its gradient, and several open pull requests propose a correction. We did not reproduce or adjudicate the mathematical claim in our sandbox. Its unresolved status is enough to require an independent derivation before using that implementation to teach the exact update rule.
Other age markers sit in the dependency and example surface. The requirements still use gym and sklearn, while an open change replaces the deprecated fetch_mldata call. A 2026 request and pull request add a transformer encoder, which confirms that transformers are absent from the current default branch. The existing catalog remains broad for classical methods, but it does not track the center of current deep-learning education.
Community activity continues while the default branch stays frozen
GitHub listed 32,610 stars and 78 combined issues and pull requests when fetched. A separate issue search returned 43 open issues, and users updated a polynomial-regression report in August 2026. New pull requests in 2026 propose a transformer, regression corrections, and a restored image. People still care about the material, even though community activity has not turned into default-branch updates.
GitHub's repository metadata gives October 15, 2023 as the last push, while the newest commit returned for the default branch is a2806c6 from October 18, 2019. GitHub also returned no latest release. Paired with 0 CI workflows and a queue of unmerged fixes, those dates describe code that should be treated as frozen. The repository is not archived, but its open status does not amount to active maintenance.
Use it as annotated source and avoid production dependencies
The 89-file scale is ideal for study. Pick an algorithm, read the implementation beside a trusted explanation, run it on a tiny dataset with a known answer, and step through the arrays. The examples give useful entry points for that work. MIT licensing also makes classroom modification straightforward, provided users keep the license terms.
For application code, the 48-second install and 16-second build do not offset the missing tests, stale default branch, or open correctness reports. Use scikit-learn for maintained classical models and a current framework for deep learning. ML-From-Scratch earns a bookmark as readable source, especially for trees, clustering, and basic neural-network mechanics. It does not earn a place in a production requirements file.

