{"generated_at": "2026-10-12T04:20:56.852176+00:00", "dataset": {"file": "training_data.csv", "rows": 4520, "columns": 86, "usable_features": 72, "seasons": "2016\u20132024 (Week 5 onward)", "note": "Opponent-adjusted, no future leakage \u2014 each row's stats use games prior to that matchup only."}, "models": {"ridge": {"model": "Ridge (sklearn)", "target": "margin", "intercept": 4.8833, "features": [{"name": "away_adjusted_epa_allowed", "value": -25.8009}, {"name": "away_adjusted_epa", "value": 24.402}, {"name": "home_adjusted_epa", "value": -23.8058}, {"name": "home_adjusted_epa_allowed", "value": 21.8143}, {"name": "home_elo", "value": -0.0313}, {"name": "away_elo", "value": 0.0265}, {"name": "away_talent", "value": 0.0101}, {"name": "home_talent", "value": -0.0093}]}, "xgb": {"model": "XGBClassifier (xgboost)", "target": "home_win", "features": [{"name": "spread", "importance": 0.314}, {"name": "away_elo", "importance": 0.0626}, {"name": "home_talent", "importance": 0.0608}, {"name": "home_adjusted_epa_allowed", "importance": 0.0588}, {"name": "home_adjusted_success_allowed", "importance": 0.0584}, {"name": "home_elo", "importance": 0.058}, {"name": "home_adjusted_success", "importance": 0.0579}, {"name": "away_adjusted_epa_allowed", "importance": 0.0573}, {"name": "away_adjusted_success_allowed", "importance": 0.0571}, {"name": "away_adjusted_epa", "importance": 0.0554}, {"name": "away_adjusted_success", "importance": 0.0552}, {"name": "away_talent", "importance": 0.055}, {"name": "home_adjusted_epa", "importance": 0.0495}]}, "fastai": {"model": "fastai.tabular_learner", "target": "home_win", "note": "Original supplied artifact verified with legacy FastAI 2.7.19. It produces unbounded regression scores trained on home_win, not probabilities. The corrected classification tutorial produces separate private research models. Importances not available."}}, "notebooks": [{"file": "01_linear_regression_margin.ipynb", "title": "Ridge Regression \u2014 Margin", "model": "Ridge(alpha=1.0)", "target": "margin", "blurb": "Fast interpretable baseline for score margin. MAE, RMSE, R\u00b2, actual-vs-predicted scatter."}, {"file": "02_random_forest_team_points.ipynb", "title": "Random Forest \u2014 Team Points", "model": "RandomForestRegressor", "target": "home_points / away_points", "blurb": "Two forests predict each team's score; implied margin from the pair."}, {"file": "03_xgboost_win_probability.ipynb", "title": "XGBoost \u2014 Win Probability", "model": "XGBClassifier", "target": "home_win", "blurb": "Accuracy, AUC, log loss, calibration curve. The fitted xgb_home_win_model.pkl."}, {"file": "04_fastai_win_probability.ipynb", "title": "FastAI \u2014 Win Probability", "model": "fastai.tabular_learner", "target": "home_win", "blurb": "Corrected categorical home-win tutorial with CPU training and reload checks. New models remain private research, separate from the supplied regression artifact."}, {"file": "05_logistic_regression_win_probability.ipynb", "title": "Logistic Regression \u2014 Win Probability", "model": "LogisticRegression", "target": "home_win", "blurb": "Interpretable classifier; coefficient plot shows key drivers."}, {"file": "06_shap_interpretability.ipynb", "title": "SHAP \u2014 Margin Explanations", "model": "shap.Explainer", "target": "margin", "blurb": "Explanation tool, not a forecast model. Shapley values on an XGBoost margin model."}, {"file": "07_stacked_ensemble.ipynb", "title": "Stacked Ensemble", "model": "Logistic + RF + XGB \u2192 Logistic stacker", "target": "home_win", "blurb": "Stacking meta-model combining three base learners."}], "inventory": [{"id": "epa_ols", "name": "EPA-OLS spread model", "role": "production", "target": "Home Margin (home points minus away points)", "artifact": null, "source": "src/cfb_model_lab/betting.py; ADR-0011", "note": "Produces the in-season spread card and matchup calculator. Its margin-derived probabilities are separate from the StackedEnsemble."}, {"id": "sp_plus", "name": "SP+", "role": "external_fallback", "target": "External point ratings and rating-derived margins", "artifact": null, "source": "src/cfb_model_lab/picks.py; CONTEXT.md (Engine)", "note": "External comparison and the announced preseason/early-season fallback where supported. It is not a locally trained model or an ensemble probability."}, {"id": "ridge", "name": "Ridge regression", "role": "research_only", "target": "Margin (away points minus home points)", "artifact": "model_pack/ridge_model.joblib", "source": "model_pack/01_linear_regression_margin.ipynb", "note": "Notebook 01 fits Ridge with alpha=1.0. The supplied fitted artifact supplies the coefficient chart below; it does not produce the production spread card."}, {"id": "random_forest_points", "name": "Random Forest team scores", "role": "notebook_only", "target": "Home points and away points; implied score margin", "artifact": null, "source": "model_pack/02_random_forest_team_points.ipynb", "note": "Two RandomForestRegressors demonstrate team-score prediction. These are distinct from the RandomForestClassifier inside the production-code ensemble. No standalone score artifact is supplied here."}, {"id": "xgb", "name": "XGBoost home-win classifier", "role": "research_only", "target": "Home-win probability", "artifact": "model_pack/xgb_home_win_model.pkl", "source": "model_pack/03_xgboost_win_probability.ipynb; src/cfb_model_lab/model.py", "note": "The supplied standalone classifier supplies the importance chart below. A separately fitted XGBClassifier is also an ensemble component; this artifact does not itself produce the spread card."}, {"id": "fastai", "name": "FastAI supplied artifact", "role": "unavailable", "target": "Unbounded home-win regression score", "artifact": "model_pack/fastai_home_win_model.pkl", "source": "model_pack/04_fastai_win_probability.ipynb; model_pack/legacy-fastai-requirements.txt", "note": "The legacy artifact is not a probability model. Probability output is unavailable from it. The corrected classification notebook trains separate private research models."}, {"id": "logistic", "name": "Logistic regression notebook", "role": "notebook_only", "target": "Home-win probability", "artifact": null, "source": "model_pack/05_logistic_regression_win_probability.ipynb; src/cfb_model_lab/model.py", "note": "Standalone interpretable classifier tutorial. Logistic regression is separately fitted as an ensemble component and meta-model; no standalone notebook artifact is supplied here."}, {"id": "stacked_ensemble", "name": "StackedEnsemble", "role": "display_only", "target": "Home-win probability", "artifact": "public/api/ensemble.json", "source": "src/cfb_model_lab/model.py; scripts/build_ensemble_predictions.py; ADR-0011", "note": "Logistic regression, RandomForestClassifier and XGBoost feed a logistic stacker. Its displayed win probabilities do not select the EPA spread card. Expanded weekly refits remain research candidates until the promotion gate and owner's decision."}, {"id": "huber", "name": "Huber challenger", "role": "research_only", "target": "Research margin experiment", "artifact": null, "source": "Owner-reported local research; no reviewed artifact in this checkout", "note": "Reported local experiment, not integrated or reproduced by this catalog. No fitted artifact, performance result or production role is claimed."}]}