train_catboost

CatBoost-трек: признаки -> оценка по трём схемам -> финальная модель -> submission.csv.

Схемы валидации (данные — один день, 13 реальных ТС + 26 синтетических клонов в train):

  • proxy — как validate: K-fold по реальным точкам train+test блоками по времени; клоны и остальные точки остаются в обучении. Validate устроен так же (соседние моменты T тех же ТС), поэтому это лучший прокси скора платформы. Дополнительно печатается классический holdout train -> test.

  • lovo — честная: откладываем реальное ТС вместе с клонами. Качество на новом ТС / другом дне.

Запуск:

python ml/src/train_catboost.py --dataset ./dataset --eval          # оценка
python ml/src/train_catboost.py --dataset ./dataset --fit --out submission.csv

Functions

conformal_margin(qs, y[, coverage])

На сколько секунд расширить интервал [q10, q90], чтобы накрыть coverage фактов (CQR).

delay_class(y)

eval_holdout(data, feats, params[, w_syn, seeds])

eval_lovo(data, feats, params[, w_syn])

eval_proxy(data, feats, params[, k, ...])

K-fold по реальным точкам блоками по времени (как validate: соседние T, клоны остаются в обучении).

eval_uncertainty(data, feats, params)

Holdout train -> test: покрытие интервала (сырое и после конформной калибровки), качество вероятностей.

fit(X, y_resid, feats, params[, seed, weight])

fit_final(data, feats, params, w_syn, seeds)

fit_uncertainty(X, M, feats, params[, seed])

Квантильная модель (интервал 10–90%) на поправку к cur_dev_s + классификатор early/ontime/late.

load_all(dataset[, cache])

Признаки для train/test/validate (+ кеш в artifacts/cache).

mae(y, p)

mae_by_lead(y, p, lead_s)

MAE по бинам горизонта прогноза (lead_s = сколько сек до целевого момента).

mae_target_estimate(data)

MAE_TARGET по условию «бейзлайн cur_dev_s даёт score 0.40» (оценка на test).

main()

pooled(data)

predict(models, X, feats, cur_dev)

predict_uncertainty(q, clf, X, feats, cur_dev)

-> (квантили задержки N×3 в секундах, вероятности классов N×3 в порядке CLASSES).

real_weight(meta, w_syn)

score(y, p, mae_target)

write_submission(dataset, ids, pred, out)

train_catboost.conformal_margin(qs: numpy.ndarray, y: numpy.ndarray, coverage: float = 0.8) → float[исходный код]

На сколько секунд расширить интервал [q10, q90], чтобы накрыть coverage фактов (CQR).

train_catboost.delay_class(y) → numpy.ndarray[исходный код]
train_catboost.eval_holdout(data: dict, feats: list[str], params: dict, w_syn: float = 1.0, seeds=(0,)) → dict[исходный код]
train_catboost.eval_lovo(data: dict, feats: list[str], params: dict, w_syn: float = 1.0) → dict[исходный код]
train_catboost.eval_proxy(data: dict, feats: list[str], params: dict, k: int = 5, block_min: int = 30, w_syn: float = 1.0, seeds=(0,)) → dict[исходный код]

K-fold по реальным точкам блоками по времени (как validate: соседние T, клоны остаются в обучении).

train_catboost.eval_uncertainty(data: dict, feats: list[str], params: dict) → dict[исходный код]

Holdout train -> test: покрытие интервала (сырое и после конформной калибровки), качество вероятностей.

Калибровочный запас считается на test; честное покрытие проверяется перекрёстно на двух половинах test.

train_catboost.fit(X: pd.DataFrame, y_resid: np.ndarray, feats: list[str], params: dict, seed: int = 0, weight: np.ndarray | None = None) → CatBoostRegressor[исходный код]
train_catboost.fit_final(data: dict, feats: list[str], params: dict, w_syn: float, seeds) → list[catboost.CatBoostRegressor][исходный код]
train_catboost.fit_uncertainty(X: pandas.DataFrame, M: pandas.DataFrame, feats: list[str], params: dict, seed: int = 0)[исходный код]

Квантильная модель (интервал 10–90%) на поправку к cur_dev_s + классификатор early/ontime/late.

train_catboost.load_all(dataset: Path, cache: bool = True) → dict[исходный код]

Признаки для train/test/validate (+ кеш в artifacts/cache).

train_catboost.mae(y, p) → float[исходный код]
train_catboost.mae_by_lead(y: pandas.Series, p: pandas.Series, lead_s: pandas.Series) → list[dict][исходный код]

MAE по бинам горизонта прогноза (lead_s = сколько сек до целевого момента).

Диспетчер должен понимать, где модель точнее, а где — фактически «предупреждает заранее». Обычно MAE растёт с горизонтом; это надо видеть, а не усреднять.

train_catboost.mae_target_estimate(data: dict) → float[исходный код]

MAE_TARGET по условию «бейзлайн cur_dev_s даёт score 0.40» (оценка на test).

train_catboost.main() → None[исходный код]
train_catboost.pooled(data: dict) → tuple[pandas.DataFrame, pandas.DataFrame][исходный код]
train_catboost.predict(models: list[catboost.CatBoostRegressor], X: pandas.DataFrame, feats: list[str], cur_dev: numpy.ndarray) → numpy.ndarray[исходный код]
train_catboost.predict_uncertainty(q: catboost.CatBoostRegressor, clf: catboost.CatBoostClassifier, X: pandas.DataFrame, feats: list[str], cur_dev: numpy.ndarray) → tuple[numpy.ndarray, numpy.ndarray][исходный код]

-> (квантили задержки N×3 в секундах, вероятности классов N×3 в порядке CLASSES).

train_catboost.real_weight(meta: pandas.DataFrame, w_syn: float) → numpy.ndarray[исходный код]
train_catboost.score(y, p, mae_target: float) → float[исходный код]
train_catboost.write_submission(dataset: Path, ids: pandas.Index, pred: numpy.ndarray, out: Path) → pandas.DataFrame[исходный код]