Skip to content

Submission Mode

Submission Mode is activated automatically when:

  1. training.split_column is set, and
  2. 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.

sample_id,yield_strength,split
1,450.0,train
2,470.0,train
3,,test
4,,test
...

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_column must exist in the input DataFrame; a ValueError is raised otherwise.
  • If submission_id_column is null (default), the zero-based integer index (__row_id__) is used as the ID column in submission.csv.
  • submission_id_column is 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, not 37137.0); text and fractional IDs are written unchanged.