Supervised Learning with Mandatory Splits and Seeds
Overview
Implements the split-fit-evaluate-assess workflow from Hastie, Tibshirani, and Friedman (2009, ISBN:978-0-387-84857-0) "The Elements of Statistical Learning", Chapter 7. Provides three-way data splitting with automatic stratification, mandatory seeds for reproducibility, automatic data type handling, and 10 algorithms out of the box. Uses 'Rust' backend for cross-language deterministic splitting. Designed for tabular supervised learning with minimal ceremony. Polyglot parity with the 'Python' 'mlw' package on 'PyPI'.
Fixed
- Per-holdout assess enforcement:
ml_assess()now rejects a second call on the same test partition regardless of which model calls it. The provenance registry tracks spent holdouts via content-addressed fingerprinting. - Fixed
ml_prepare()return value extraction (X and norm fields).
New
ml_cv(),ml_cv_temporal(),ml_cv_group()for cross-validation.ml_verify()for post-fit model verification.ml_prepare()for explicit preprocessing.- Content-addressed provenance registry (
rlang::hashfingerprinting). - Cross-verb provenance checks (train/test from same split).
From NEWS.md in the release
Install
Health
ERRORtestsr-devel-windows-x86_64
Running 'testthat.R' [82s]
Running the tests in 'tests/testthat.R' failed.
Complete output:
> library(testthat)
> library(ml)
>
> test_check("ml")
-- Calibrated ml_model [classification | logistic | Platt scaling]
Saved: D:\temp\2026_10_15_10_16_52_18621\RtmpQJZYWb\file5b7c01e6d62ec.html
Saved: D:\temp\2026_10_15_10_16_52_18621\RtmpQJZYWb\file5b7c05a7d3349.html
Saved: D:\temp\2026_10_15_10_16_52_18621\RtmpQJZYWb\file5b7c0796a3f91.html
Saving _problems/test-screen-13.R
[ FAIL 1 | WARN 1546 | SKIP 49 | PASS 1547 ]
══ Skipped tests (49) ══════════════════════════════════════════════════════════
• Rust backend not available (44): 'test-rust.R:15:3', 'test-rust.R:26:3',
'test-rust.R:38:3', 'test-rust.R:48:3', 'test-rust.R:63:3',
'test-rust.R:72:3', 'test-rust.R:81:3', 'test-rust.R:92:3',
'test-rust.R:102:3', 'test-rust.R:112:3', 'test-rust.R:124:3',
'test-rust.R:134:3', 'test-rust.R:155:3', 'test-rust.R:164:3',
'test-rust.R:173:3', 'test-rust.
...[truncated]...
3:3', 'test-rust.R:395:3',
'test-rust.R:409:3', 'test-rust.R:425:3', 'test-rust.R:438:3',
'test-rust.R:447:3', 'test-rust.R:463:3', 'test-rust.R:475:3',
'test-rust.R:487:3', 'test-rust.R:498:3', 'test-rust.R:514:3',
'test-rust.R:526:3', 'test-rust.R:538:3', 'test-rust.R:550:3'
• empty test (2): 'test-parity-w3.R:163:1', 'test-screen.R:16:1'
• gradient_boosting not available: algorithm='gradient_boosting'/'histgradient'
requires the Rust backend. (2): 'test-workflow.R:195:5',
'test-workflow.R:391:7'
• logistic is clf-only — use linear for regression; tested separately (1):
'test-predict.R:16:3'
══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-screen.R:13:3'): screen has time column (numeric, > 0) ───────
Expected `all(lb$time > 0)` to be TRUE.
Differences:
`actual`: FALSE
`expected`: TRUE
[ FAIL 1 | WARN 1546 | SKIP 49 | PASS 1547 ]
Error:
! Test failures.
Execution halted- ERROR12 OK, 1 ERROR2026-10-17
- OK13 OK2026-08-06
- ERROR11 OK, 1 NOTE, 1 ERROR2026-08-04
- NOTE12 OK, 1 NOTE2026-08-01
- OK13 OK2026-07-23
Show 26 earlier changesHide 26 earlier changes
- ERROR12 OK, 1 ERROR2026-07-19
- OK13 OK2026-07-18
- ERROR12 OK, 1 ERROR2026-07-16
- OK13 OK2026-07-07
- ERROR11 OK, 2 ERROR2026-07-03
- OK13 OK2026-06-30
- ERROR12 OK, 1 ERROR2026-06-29
- OK13 OK2026-06-27
- ERROR12 OK, 1 ERROR2026-06-24
- OK13 OK2026-06-18
- ERROR12 OK, 1 ERROR2026-06-16
- OK13 OK2026-06-06
- ERROR10 OK, 3 ERROR2026-06-01
- OK13 OK2026-05-26
- ERROR12 OK, 1 ERROR2026-05-24
- OK13 OK2026-05-17
- ERROR12 OK, 1 ERROR2026-05-09
- OK13 OK2026-05-05
- ERROR11 OK, 2 ERROR2026-04-28
- OK14 OK2026-04-24
- ERROR13 OK, 1 ERROR2026-04-16
- OK14 OK2026-04-15
- ERROR13 OK, 1 ERROR2026-04-11
- OK14 OK2026-03-30
- ERROR13 OK, 1 ERROR2026-03-29
- OK5 OK2026-03-20
Documentation
- Help pages
- 70 (16 internal)includes a package overview page
- Examples that run
- 73%29 run in a plain check · 11 only when donttest examples are enabled (R CMD check --as-cran)
- Exported functions with examples
- 100%
- Documented parameters
- 100%
- Return-value docs
- 100%
- Help pages citing references
- 0%
Downloads
Repository
- PRs merged (all time)
- 50%
- Median days to close, 50 most recently updated closed issues
- not measured
- Median days to close, 50 most recently updated closed PRs
- 0
Stars over time
Forks over time
PRs over time
7 development-tooling and community-health practices detected across 3 families in the upstream repository
Checks run against github.com/epagogy/ml on 2026-10-11.
The R CMD check workflow runs on Linux
This repository shows signs of AI coding tools.
- Claude Codefirst seen on or before 2026-03-14Named in .gitignore: .claude, CLAUDE.mdCommits: at least 1 crediting it in the message
- Claude Opus 4.61 commit · Mar 2026
Dependencies
Code & Tests
Datasets
People & History
- RR 4.6.0 released · 2026-04-24
- 0.1.2Latest2026-03-19 · current release
- RR 4.5.0 released · 2025-04-11
Package metadata
- First published
- 2026-03-19
- Total releases
- 1 / 1 yrs
- License
- MIT + file LICENSE OSI
- Minimum R
- ≥ 4.1.0
- Download size
- 156 KB
Cite
Cite this package
Run in R for the authors' entry:
citation("ml")The package provides a citation file, so citation() returns the authors' own entry.
It points to 10.5281/zenodo.19023838.
The repository also keeps a CITATION.cff.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-18, which the citation names so these numbers can be found later. More on citing and the projects behind them.