@@ -12,7 +12,7 @@ Atlas builds models for you, and shows its work. Give it a data frame and a
1212target; an LLM agent (via [ ellmer] ( https://ellmer.tidyverse.org ) ) explores
1313the data, proposes a modeling plan for your approval, then writes and runs R
1414code to fit, compare, and refine candidate models. You get back fitted
15- models ready for ` predict() ` , a leaderboard, a written report — and, because
15+ models ready for ` predict() ` , a leaderboard, a written report - and, because
1616the agent works by writing R, the complete script of everything it did.
1717
1818Three ideas separate atlas from "ask a chatbot for model code":
@@ -24,7 +24,7 @@ Three ideas separate atlas from "ask a chatbot for model code":
2424
2525* ** Sessions are persistent.** Every code chunk and conversation turn is
2626 checkpointed to disk as it happens. A crash, a restart, or a deliberate
27- interruption loses nothing — resume and keep going.
27+ interruption loses nothing - resume and keep going.
2828
2929* ** Your data stays on your machine.** The LLM sees column names, types,
3030 and printed summaries, never the rows. All fitting happens locally in
@@ -43,7 +43,7 @@ pak::pkg_install("mattyoreilly/Atlas")
4343You also need an API key for an LLM provider. atlas defaults to Anthropic:
4444run ` usethis::edit_r_environ() ` , add a line ` ANTHROPIC_API_KEY=sk-ant-... ` ,
4545save, and restart R. Any tool-capable ellmer provider works via the ` chat `
46- argument — OpenAI, Gemini, Bedrock, or a local model through Ollama.
46+ argument - OpenAI, Gemini, Bedrock, or a local model through Ollama.
4747
4848## Usage
4949
@@ -54,14 +54,14 @@ res <- atlas(mtcars, outcome = "mpg", goal = "prioritise interpretability")
5454```
5555
5656The agent narrates as it works. It profiles the data (flagging suspected
57- target leakage), proposes a plan — model families chosen to match the
57+ target leakage), proposes a plan - model families chosen to match the
5858outcome's distribution, a seeded validation scheme, any monotone effects it
59- believes the domain implies — and ** waits for your approval in the
59+ believes the domain implies - and ** waits for your approval in the
6060console** . You can answer "yes", or redirect it: "only linear models, and
6161don't use qsec". Then it builds up to ` n_models ` candidates, compares them
6262on held-out data, refines the winner's features until improvement stalls,
63- verifies any constraints, and — with
64- [ modelblueprint] ( https://mattyoreilly.github.io/modelblueprint/ ) installed —
63+ verifies any constraints, and - with
64+ [ modelblueprint] ( https://mattyoreilly.github.io/modelblueprint/ ) installed -
6565writes a full validation workup (gain, calibration, grouped residuals,
6666one-ways, PDPs) to the run directory.
6767
@@ -76,18 +76,18 @@ res$session$tell("why did the refined model win?") # keep talking
7676
7777Every run walks the same six stages, and you hold the pen at stage 2:
7878
79- 1 . ** Explore** — dimensions, types, missingness, the outcome's
79+ 1 . ** Explore** - dimensions, types, missingness, the outcome's
8080 distribution; automatic leakage screening.
81- 2 . ** Plan, then stop for you** — candidate families matched to the
81+ 2 . ** Plan, then stop for you** - candidate families matched to the
8282 outcome's distribution, a validation scheme, suggested monotone
8383 constraints. Approval is a conversation: whatever you type is folded
8484 into the plan.
85- 3 . ** Build** — up to ` n_models ` candidates, compared on held-out data.
86- 4 . ** Refine** — the winner's features are iterated one change at a time
85+ 3 . ** Build** - up to ` n_models ` candidates, compared on held-out data.
86+ 4 . ** Refine** - the winner's features are iterated one change at a time
8787 until the stopping rules call convergence.
88- 5 . ** Verify** — machine-checked constraints run against every final model;
88+ 5 . ** Verify** - machine-checked constraints run against every final model;
8989 violations trigger repair rounds.
90- 6 . ** Document** — report, leaderboard, reproducible script, validation
90+ 6 . ** Document** - report, leaderboard, reproducible script, validation
9191 plots, all in the run directory.
9292
9393Two kinds of dial control how long this takes. The * statistical* stopping
@@ -114,13 +114,13 @@ res$constraints # one row per model x constraint: passed, detail
114114```
115115
116116Columns that won't exist at prediction time don't belong in the data at
117- all — ` exclude ` removes them before the agent ever sees it, and
117+ all - ` exclude ` removes them before the agent ever sees it, and
118118` atlas_leakage_screen() ` automatically flags predictors that alone explain
119119almost all of the outcome. See ` vignette("constraints") ` .
120120
121121## Unattended runs
122122
123- For hands-off experimentation — overnight, in a script, on a schedule —
123+ For hands-off experimentation - overnight, in a script, on a schedule -
124124set ` autonomous = TRUE ` : the agent states its plan and proceeds instead of
125125waiting for approval, iterating keep/discard experiments under the stopping
126126rules. Pair it with ` test_prop ` to hold out rows the agent ** never sees** ;
@@ -139,8 +139,8 @@ res$test_leaderboard # held-out performance, best first
139139```
140140
141141Long runs stay affordable: past a token budget (` compact_at ` ) the
142- conversation is compacted — transcript archived to disk, context cleared,
143- agent re-oriented from session state at no extra LLM cost — and every
142+ conversation is compacted - transcript archived to disk, context cleared,
143+ agent re-oriented from session state at no extra LLM cost - and every
144144results object reports the session's total dollar ` cost ` . See
145145` vignette("autonomous") ` .
146146
@@ -162,26 +162,26 @@ Runs land in `.atlas/<timestamp>` by default; set
162162## Limitations
163163
164164* ** Columns are the scaling limit, not rows.** Fitting is local, so a
165- million rows just take the time they take — but the agent reasons about
165+ million rows just take the time they take - but the agent reasons about
166166 variables by name, and past a few dozen columns that reasoning degrades.
167167 Pre-select features for wide data.
168168* ** Cost scales with agent steps** , not data size: more candidates, more
169169 repair rounds, more follow-ups mean more LLM calls. ` print(res) ` shows
170170 what a session cost.
171171* ** The statistical stopping rules are agent-applied.** For guarantees,
172- use the mechanical budgets (` max_steps ` , ` max_runtime ` ) — those are
172+ use the mechanical budgets (` max_steps ` , ` max_runtime ` ) - those are
173173 enforced by atlas, not the model.
174174* ** An agent is not a statistician.** atlas verifies what you tell it to
175175 verify; judgment about what the model is * for* stays with you. Read the
176176 report, check ` res$code ` , and look at the validation output.
177177
178178## Learn more
179179
180- * ` vignette("atlas") ` — a full walkthrough: setup, the build lifecycle,
180+ * ` vignette("atlas") ` - a full walkthrough: setup, the build lifecycle,
181181 what you get back, what it costs
182- * ` vignette("constraints") ` — encoding domain knowledge that can't be
182+ * ` vignette("constraints") ` - encoding domain knowledge that can't be
183183 ignored
184- * ` vignette("sessions") ` — persistence, resuming, steering mid-build, and
184+ * ` vignette("sessions") ` - persistence, resuming, steering mid-build, and
185185 token stewardship
186- * ` vignette("autonomous") ` — unattended runs with hard budgets and a
186+ * ` vignette("autonomous") ` - unattended runs with hard budgets and a
187187 protected test set
0 commit comments