Repository navigation
|
Hi, I'm a student who spent the summer building an open-source tool for ingredient replacement in formulated products: suggested experiment batches, staged qualification gates, Monte Carlo robustness, sign-offs tied to a hash of the evidence. https://github.com/TM289012/reformulation-assurance The suggestion layer is currently GP plus random forest ranking over random candidates from the bounded mixture simplex. The docs label it exactly that, not BO. Long term, BayBE looks like the right brain for that layer. Two questions:
Happy to be told this is the wrong layer boundary & any other feedback. |
Replies: 3 comments 10 replies
|
Hi @TM289012 Re 1
Re 2 Notes
|
|
Regarding how stable our code is: We take a lot of care in trying to add proper deprecation handling. That is, we usually try to ensure that there are at least several versions where "outdated" behavior still works and is usable, but raises a warning to the user. While this cannot be guaranteed for every feature, you can normally keep using older API versions for at least the next 2 to 3 releases which will then warn you about the feature being deprecated. |
|
Here are the comparison results mentioned in my reply above. I'm posting the version with the fairness fixes built in, because my first pass had two design choices favoring my own arm, and I wanted them controlled, not just disclosed. Setup (script in the repo: backtest_ranker_vs_baybe.py): semi-synthetic replay on my cosmetics demo project. 400 fresh candidates from my generator (legacy emulsifier locked to 0), identical for all arms. Ground truth is an oracle fit to the 81 completed real lots with residual-scale noise, run as two families (random forest and a neural net) so no arm wins by sharing a model family with the oracle. All arms start with the full 88-lot history. Success is the first pick in the pool's top 2% by true worst-spec margin. 5 seeds, censored at 40 rounds. Arms: random; my app's ranking (GP plus RF, joint in-spec probability, pure exploitation); BayBE 0.15 stateless BotorchRecommender with a v1 scalarized single target; and BayBE with your native DesirabilityObjective, one normalized target per response.
What I take from it: (1) My v1 scalarized target was the bottleneck, not your recommender. Native multi-target mode moved BayBE from 22 to 2 median rounds. My earlier caveat, confirmed by experiment. (2) At full strength your recommender and my ranking are basically tied on this task, under both oracle families. (3) Both beat random by a wide margin. (4) Regime caveat: all arms start from 88 informative measurements, friendly territory for pure exploitation. With sparse starting history I'd expect the BO machinery to pull ahead. That's the next experiment I want to run. One API note: my guesses at the new-style target constructors were wrong, so the desirability arm ran on the deprecated MATCH and MAX constructors, which worked exactly as the deprecation policy described, warnings and all. If someone points me at the current 0.15 way to build a two-sided match target and a normalized one-sided target, I'll update the script. Practical outcome for my app: pinning 0.15, and the integration seam (own candidate pool, SubspaceDiscrete.from_dataframe, stateless recommend) held up with no fighting. Thanks for the pointers. |
Thanks, this is exactly what I needed.
On your question about external gating and audit state: my app runs qualification stages (confirmation replicates, then process window, then supplier lots) and a candidate can't advance until real lab results pass that stage's criteria. The model only proposes experiments. Audit state means every prediction is frozen at recommendation time and scored against results later, and sign-offs are bound to a SHA-256 hash of the evidence they approved, so changes after signing are visible. Live demo: https://reformulation-assurance-demo.streamlit.app/ (public sandbox, one click to enter).
Based on your answers I pinned 0.15, kept my own candidate generation,…