Submission Mode¶
Submission Mode is activated automatically when:
training.split_columnis set, and- All target values in the test rows are
NaN(i.e. the test targets are unknown).
The test rows are the test rows of a binary split column, or the rows marked test
in a column of fold IDs (Predefined Folds). Fold IDs without a
marker have no test rows at all — that is a run without hold-out, not Submission Mode.
This is the standard setup for competition submissions (Kaggle-style) and industrial inference workflows where ground truth is unavailable.
What Submission Mode produces¶
| Artifact | Normal run | Submission Mode |
|---|---|---|
| Test metrics | Yes | No (no ground truth) |
| OOF metrics | Yes | Yes |
round_NN/submission_rndNN.csv per model, ensemble/submission.csv with ≥ 2 models |
No | Yes |
| HTML report | With test metrics | Without test metrics section |
A prominent warning is emitted at run start to confirm Submission Mode is active.
Input data format¶
Your CSV/Excel must have a split_column that marks train vs. test rows. Test rows have NaN targets.
YAML config¶
paths:
data_file: data/alloys_submission.csv
run_name: submission_run
data:
predict_column: yield_strength
submission_id_column: sample_id # column used as row ID in submission.csv
# omit to fall back to __row_id__ (integer index)
training:
split_column: split # activates Submission Mode when test targets are NaN
models:
selected:
- ens__cb__absolute
Python equivalent¶
from coremat import (
FrameworkConfig,
PathsConfig,
DataPreprocessingConfig,
TrainConfig,
ModelsConfig,
run_training,
)
fw = FrameworkConfig(
paths=PathsConfig(
data_file_path="data/alloys_submission.csv",
run_name="submission_run",
),
data=DataPreprocessingConfig(
predict_column="yield_strength",
submission_id_column="sample_id",
),
train=TrainConfig(split_column="split"),
models=ModelsConfig(selected=["ens__cb__absolute"]),
)
result = run_training(fw)
Output¶
After the run, a submission CSV is written per feature-selection round, next to that round's model:
data/results/submission_run/
ens__cb__absolute/
round_01/
model_rnd01.joblib
submission_rnd01.csv ← sample_id + predicted yield_strength
report_submission_run_ens__cb__absolute.html ← OOF metrics only (no test section)
The model directory is named after the model ID — there is no model_ prefix —
and the report file carries the run name and the model ID.
With at least two models the run also builds the ensemble, and in Submission Mode it writes its own submission in the same format:
data/results/submission_run/
ensemble/
submission.csv ← sample_id + blended yield_strength
ensemble_weights.json ← the blend weights, fitted on OOF
The ensemble blends each member's submission_rndNN.csv (the member's best round) with
the weights it fitted on the out-of-fold predictions. Rows are matched by the ID
column, not by position; members whose IDs differ stop the ensemble with an error
instead of mixing rows.
Notes¶
- Feature selection reads the OOF curve in every run, so it needs no test labels.
submission_id_columnmust exist in the input DataFrame; aValueErroris raised otherwise.- If
submission_id_columnisnull(default), the zero-based integer index (__row_id__) is used as the ID column insubmission.csv. submission_id_columnis an annotation column: it is never trained on and is not compared when duplicates are dropped.- Every test row needs an ID; an empty one stops the submission with an error. Rows outside the test set (for instance training rows of a combined dataset) may have empty IDs — but then pandas reads the column as float. Whole-number IDs are therefore written back as integers (
37137, not37137.0); text and fractional IDs are written unchanged.