Machine learning work has five stages: prepare training data, train, evaluate, deploy, and keep checking accuracy. maclnote covers all five in the notebook where you already work. Below is what each part does, with the churn model from the screenshots as the running example.
Open your existing .ipynb files unchanged. Attach a GPU when it is time to train and release it when the run finishes, so nobody pays for an idle GPU overnight. Two people can work in the same notebook at once, which is how a feature engineering idea and a model change get tried in the same afternoon rather than in two branches that never merge.
# nothing to import for tracking; the notebook is already tracked model = GradientBoostingClassifier( n_estimators=400, learning_rate=0.05, max_depth=4) model.fit(X_train, y_train) auc = roc_auc_score(y_val, model.predict_proba(X_val)[:, 1]) print(f"val_auc={auc:.4f}") # → run #42 · val_auc 0.9127 · 38 s · dataset customers@v17
When a cell calls fit() or runs a training loop, maclnote records what a careful data scientist would write down and usually does not: every hyperparameter read from the model object, the training and validation metrics per epoch or per fold, the confusion matrix and ROC curve, feature importances, the random seed, the code as it was at that moment, and the version of the training data. Two hundred runs later, you can sort by validation AUC and see exactly what separated the top two.
mn.log(val_auc=0.91).| Run | lr | depth | trees | data | val_auc |
|---|---|---|---|---|---|
| #42 | 0.05 | 4 | 400 | v17 | 0.9127 |
| #41 | 0.05 | 6 | 400 | v17 | 0.9081 |
| #40 | 0.10 | 4 | 200 | v17 | 0.9044 |
| #39 | 0.10 | 4 | 200 | v16 | 0.8962 |
| #38 | 0.30 | 3 | 100 | v16 | 0.8815 |
When a notebook reads a table, a bucket or a file to build a training set, maclnote fingerprints the rows and columns it read and stores a versioned snapshot or pointer. The training run records that version, along with the train, validation and test split. A year later you can retrain on the same rows, and when a deployed model makes a strange prediction you can walk back to the examples it learned from.
When a run is good enough to consider for production, promote it to a candidate model. maclnote generates an evaluation report: held-out metrics, calibration, accuracy per customer segment, and how it compares with the model currently deployed. A reviewer sees the report, the training data version and the code on one page and approves it there. Then one click deploys it as a prediction API or a scheduled scoring job, with the previous version kept ready for rollback.
curl -X POST https://api.maclnote.com/v1/endpoints/churn-prod/predict \ -H "Authorization: Bearer $MACLNOTE_TOKEN" \ -d '{"tenure_months": 14, "plan": "pro", "tickets_90d": 3}' → {"churn_probability": 0.71, "model_version": "v3", "request_id": "r_8f2…"}
A model is only as good as the data it sees today looks like the data it trained on. Every deployed model logs its inputs and predictions, and each night maclnote compares the last day's feature distributions with the training set version, feature by feature, using the population stability index and Kolmogorov–Smirnov statistics. It also tracks null rates and categories the model never saw in training. When the true labels arrive, days or weeks later, accuracy, precision, recall and AUC are computed automatically and plotted next to the drift history, so you can see whether the drift actually hurt.
The maclnote assistant answers from your notebooks, training runs, datasets and deployed models, not from the internet. Ask why run #42 beat run #41 and it diffs the hyperparameters and the code and reads the learning curves. Ask it to write the next cell and it uses your real column names and the libraries pinned in your project. Ask what changed in the churn model since last month and it answers from the run history, with links to every run it cites.
Bring a notebook to a 30-minute call. We will train it with the run recorded, compare two configurations, and deploy the better one as a prediction API, live.