Settings Reference¶
Complete reference for all training, evaluation and threshold settings.
For what each setting means, a worked example, and how the settings interact with each other, see the Settings Guide.
TrainSettings¶
Required Parameters¶
| Parameter | Type | Description |
|---|---|---|
out_folder |
string | Directory to save trained models and label stats |
train_files |
list | Paths to training data files (.csv or .parquet) |
Optional Parameters¶
| Parameter | Default | Description |
|---|---|---|
n |
1 | Number of trees to build per target class |
max_depth |
100 | Hard cap on the number of dot-separated segments in a spore's depth, i.e. the maximum number of splits between root and leaf. A safety net, not a tuning knob — min_eval_fit bounds depth in practice. See Settings Guide |
frac_eval_cat |
0.5 | Fraction of data for bin evaluation vs weight-based grouping |
max_eval_fit |
1000 | Maximum rows sampled per node |
min_eval_fit |
10 | Minimum rows per class before a node becomes a leaf — the setting that actually determines tree depth |
n_dims |
3 | Feature combinations to evaluate (1=single, 2=pairs, 3=triplets) |
n_cat |
3 | Number of bins per feature |
calcs_per_dim |
5000 | Maximum combinations to evaluate per dimension |
spore_diff |
1.0 | Branch-merge distance for the winning split's bin combinations: adjacent combinations (sorted by their target/non-target diff) are merged while their difference stays below spore_diff and at least two branches remain. 0.0 keeps every observed combination as its own branch (fan-out); >= 1.0 collapses the split into a binary split |
score_method |
"diff_dir_1.5" | Scoring method for split candidates: "diff_all_<exp>" (dimension-neutral, 0.5 * sum(\|p-q\|^exp)), "diff_dir_<exp>" (directional, max of target/non-target sums), "lift_dir_<exp>" (directional mass-weighted log-likelihood lift n * abs(ln(n / E))**exp, dominant side wins), "hellinger" (Hellinger distance). Exponent <exp> is one of 1.0, 1.5, 2.0; default is "diff_dir_1.5" (entropy-style weighting on the plain p - q difference) |
smoothing |
0.0 | Laplace smoothing alpha for the proportion estimates used in candidate scoring. 0 disables smoothing; when active, all scoring methods use Laplace-smoothed proportions. The left/neutral/right classification always uses the raw proportions |
leaf_score |
"log_odds" |
Formula for the leaf (spore) scores. "log_odds" stores Laplace-smoothed log-odds ln((target + leaf_alpha) / (non_target + leaf_alpha)) — unbounded, comparable across targets, exactly antisymmetric under swapping target and non-target; designed for mean combination, where softmax over the per-target scores yields approximate posteriors. "weakened_diff" keeps the legacy signed target rate scaled by 1 - ln(n) / n (bounded to [-1, 1]) |
leaf_alpha |
0.5 | Pseudo-count (Beta prior concentration) of the Laplace smoothing for leaf_score="log_odds". 0.5 is the Jeffreys prior, 1.0 the Laplace prior. Larger values shrink small leaves stronger towards the balanced score 0 |
min_split_improvement |
0.0 | Minimum relative improvement (e.g. 0.05 = 5%) a multi-dimensional candidate (dim >= 2) needs to beat the current best split. 0 disables the requirement |
pair_corr_filter |
True | Filter correlated feature combinations per node: a candidate whose joint table lets both classes concentrate on a dominant bin masks its 1D-weakest feature for the rest of the node |
pair_corr_min_main |
0.9 | Minimum share of BOTH classes inside the dominant bin (per remaining-feature cell, summed over all cells) for a candidate to count as correlated. Mirrors the 1D is_diff_to_low threshold |
pair_corr_max_features |
None | Limit the dim-2 candidate search to the top-K features by 1D score. Useful for wide datasets where all pairs are too many |
adaptive_n_rep |
True | Scale repetitions down on nodes with plenty of rows: 1 repetition at 44 * n_cat group rows, 3 at 16 * n_cat, otherwise n_rep. The group half (1 - frac_eval_cat) of the smaller class is compared, because that is what the cuts are built from. false keeps n_rep fixed |
n_rep |
5 | Number of random split repetitions. Each multi-dimensional feature combination is evaluated once per repetition with correctly aligned count rows; higher values reduce statistical fluctuations but increase training time. Capped per node by adaptive_n_rep |
Example: TrainSettings¶
# Minimum required
out_folder: my_model
train_files:
- /path/to/train.csv
# With all options
n: 10
out_folder: my_model
max_depth: 100
frac_eval_cat: 0.5
max_eval_fit: 1000
min_eval_fit: 50
n_dims: 3
n_cat: 5
calcs_per_dim: 5000
score_method: diff_dir_1.5
smoothing: 0.0
leaf_score: log_odds
leaf_alpha: 0.5
min_split_improvement: 0.0
pair_corr_filter: true
pair_corr_min_main: 0.9
pair_corr_max_features: null
spore_diff: 1.0
adaptive_n_rep: true
n_rep: 5
train_files:
- /path/to/train.csv
!!! note "max_parallel_where is not a training setting"
It only exists in EvalSettings and is used for SQL
batching during evaluation.
EvalSettings¶
Required Parameters¶
| Parameter | Type | Description |
|---|---|---|
in_folders |
list | Directories containing trained models |
out_folder |
string | Directory for evaluation results |
test_files |
list | Paths to test/evaluation data files (.csv or .parquet) |
Optional Parameters¶
| Parameter | Default | Description |
|---|---|---|
out_file |
null | Output file path (.csv or .parquet) |
keep_cols |
[] | Columns to include in output |
max_parallel_where |
100 | Legacy cut-models: split SQL into batches once a tree has at least this many spores. Models with structured conditions are scored natively and ignore it |
same_target_pilz_comb_method |
mean |
Combine the n trees per target label by mean or max (mean is more robust — a single outlier tree otherwise dominates) |
different_target_pilz_comb_method |
softmax |
Combine per-target scores into a prediction: softmax applies a sigmoid nonlinearity below the tree aggregation before the cross-target argmax (default; for same_target=max this is identical to max; for same_target=mean the prediction can differ), max takes the highest score, youden predicts the largest threshold margin with majority-class fallback |
Example: EvalSettings¶
# Minimum required
in_folders:
- model
out_folder: results
test_files:
- /path/to/test.csv
# With all options
in_folders:
- model_v1
- model_v2
out_folder: results
out_file: predictions.csv
keep_cols:
- customer_id
- date
max_parallel_where: 500
test_files:
- /path/to/test.csv
Decision Thresholds¶
Decision thresholds are derived on the fly from the leaf counts stored in
each tree (n_target/n_non_target): every tree contributes its
Youden-optimal threshold, mean combination compares each target score against
the mean of its trees' thresholds, maximum combination compares each tree
score against its own threshold. No threshold files are written or read;
training only persists label_stats.json (label counts and majority class)
as the fallback prediction when no threshold margin is positive.
Parameter Guide¶
n_rep and n_dims together¶
n_rep applies to complete split candidates, not only to individual
features. For example, with n_dims: 2 and n_rep: 3, every pair is built and
evaluated three times using the matching repetition of each feature. The
median candidate of that pair is then compared with the other possible splits.
This preserves row alignment while retaining the stabilizing effect of
repeated random splits.
The calcs_per_dim limit counts feature combinations. Increasing n_rep
therefore increases the work per combination, but does not change how many
combinations the limit permits.
train_files / test_files¶
| Setting | Where | Description |
|---|---|---|
train_files |
TrainSettings | Data used to build the trees |
test_files |
EvalSettings | Data used for evaluation / inference |
n: Number of Trees¶
| Value | Effect |
|---|---|
| 1 | Fast, baseline |
| 3-5 | Good balance |
| 10+ | More accurate, slower |
max_depth¶
max_depth caps the number of dot-separated segments in a spore's depth
field, which equals the number of splits between the root and that leaf. The
cap is a safety net, not a tuning knob: min_eval_fit stops the recursion
first in almost every case.
| Value | Effect |
|---|---|
1 |
Degenerate — the root is already a leaf, so the tree has no split at all |
2+ |
Leaves may carry up to max_depth segments |
100 (default) |
Effectively unbounded; only a guard against pathological data |
To make a model shallower, lower min_eval_fit — not max_depth. See the
Settings Guide for the exact
semantics and the measured effect of both settings.
n_dims¶
| Value | Effect |
|---|---|
| 1 | Single features only |
| 2 | Feature pairs |
| 3+ | Complex interactions |
n_cat¶
| Value | Effect |
|---|---|
| 2-3 | Few bins, general |
| 3 | Default |
| 10+ | Many bins, specific |
calcs_per_dim¶
| Value | Effect |
|---|---|
| null | No limit |
| 1000 | Quick |
| 10000 | Thorough |
| 100000+ | Exhaustive |
n_rep: Repetitions per Candidate¶
Controls how many times the data is randomly split into count and group sets. Each repetition computes a candidate independently; the median result across all repetitions is selected. For multi-dimensional candidates, features are combined only with their matching repetition, preventing count rows from different shuffles from being paired.
| Value | Effect |
|---|---|
| 1 | No repetition, fast |
| 3 | Light smoothing |
| 5 | Default, good balance |
| 10+ | Very stable cuts, slower |
score_method: Split Scoring¶
Controls how the discriminating power of a split candidate is computed. All
methods are built on the plain proportion difference diff_plain = p - q:
| Value | Effect |
|---|---|
"diff_all_1.0" |
Dimension-neutral sum 0.5 * sum(|p - q|). |
"diff_all_1.5" |
0.5 * sum(|p - q|**1.5) — dampens near-zero cells, emphasizes strong ones |
"diff_all_2.0" |
0.5 * sum((p - q)**2) — quadratic, strongest cells dominate |
"diff_dir_1.0" |
Directional: sums |p - q| separately for target-favouring and non-target-favouring bins and takes the dominant side |
"diff_dir_1.5" (default) |
Entropy-style weighting abs(p - q) * sqrt(abs(p - q)), directional (dominant side wins). Not dimension-neutral |
"diff_dir_2.0" |
Squared directional sum on p - q, dominant side wins |
"lift_dir_1.0" |
Directional expected log-likelihood lift n * abs(ln(n / E)) per direction (E the expected count under independence, n/m the pseudo-count-augmented cell counts), dominant side wins. Evidence-weighted via the cell counts; empty cells contribute exactly 0, pure cells stay bounded by n * ln(1/pi). At exp = 1.0 the sums are the directional parts of the G deviance (G = 2 * n_total * mutual information) |
"lift_dir_1.5" |
Directional log-lift n * abs(ln(n / E))**1.5, dominant side wins |
"lift_dir_2.0" |
Directional log-lift n * abs(ln(n / E))**2, dominant side wins |
"hellinger" |
Hellinger distance 0.5 * sum((sqrt(p) - sqrt(q))**2). Dimension-neutral and less sensitive to noise in sparsely populated bins |
smoothing: Laplace Smoothing¶
When smoothing is greater than zero, every bin combination receives the
pseudo-count smoothing on both sides before the proportions used by all
scoring methods are computed. This dampens the effect of sparsely populated
cells on the candidate ranking. The left/neutral/right
classification always uses the raw proportions, so the resulting model
structure is unaffected by smoothing.
| Value | Effect |
|---|---|
| 0.0 (default) | No smoothing |
| 1.0 | Standard Laplace smoothing (add-one) |
| 5.0+ | Strong prior — sparse cells barely contribute to the score |
min_split_improvement: Dimensional Barrier¶
A multi-dimensional candidate (dim >= 2) is only selected when its score exceeds the current best split by at least this relative factor. This prevents sparse higher-dimensional combinations from winning purely due to score noise.
| Value | Effect |
|---|---|
| 0.0 (default) | Any improvement counts, a candidate only needs to be strictly better |
| 0.05 | A 2D/3D split must beat the best split by at least 5% |
| 0.1 | Conservative — only clearly better combinations are used |
pair_corr_filter: 2D Correlation Filter¶
Extends the 1D is_diff_to_low check to feature combinations. In every
dimension stage (dim 2..=n_dims) each evaluated candidate checks its joint
correlation table: for every candidate position, the cells are grouped by
the remaining features and the share of each class inside the dominant bin
of that position is summed. When BOTH classes put more than
pair_corr_min_main of their mass into the dominant bins, one feature of
the combination is redundant given the rest and the 1D-weakest feature of
the candidate is masked immediately — it is no longer used for any
following combination of this node, and the triggering candidate itself is
excluded. The mask only lives in the current node: the next node starts
fresh with all features.
Effects:
calcs_per_dimonly counts combinations that are actually evaluated — combinations containing a masked feature are skipped without consuming budget, so the budget stretches further for the meaningful candidates.- The check runs on the candidate's median repetition table and costs nothing extra (the table is computed for scoring anyway).
- With
n_dims: 1no pair filtering happens (there are no combination stages). - The 1D-best feature can never be masked (it is never the weakest member of a combination).
| Value | Effect |
|---|---|
true (default) |
Correlated combinations prune the feature pool per node |
false |
All features stay eligible for every combination |
pair_corr_min_main works like the 1D threshold of is_diff_to_low
(0.9): higher values only prune near-deterministic dependencies, lower
values prune more aggressively. pair_corr_max_features limits the pair
stage (dim 2) to the top-K features by 1D score — a useful guard for wide
datasets (e.g. pixel features) where the number of pairs grows
quadratically.
spore_diff: Branch Condensation¶
The winning split is defined by the bin combinations of its correlation
table. Two combinations are merged into one branch when the adjacent pair
with the smallest difference in target/non-target rate (diff) stays below
spore_diff:
- The observed combinations are sorted by
diff— the regularized normalized difference(n*M - m*N - sqrt(n)*M - sqrt(m)*N - n*sqrt(M) - m*sqrt(N)) / (n*M + m*N)with target/non-target cell countsn/mand totalsN/M, clamped to0on the dominating side. The square-root penalty terms keep underpopulated cells at0until they gather enough evidence. The pair with the smallest gap is merged first; the mergeddiffis recomputed from the summed counts with the same regularized formula. - Merging continues until the smallest remaining gap reaches
spore_diffor at least two observed branches remain — a split always has at least two real branches (plus an optional residual), never one. - The residual branch (combinations never observed in the count sample,
segment
.n) is never merged into. 0.0keeps every observed combination as its own branch — the pure fan-out split.>= 1.0collapses the observed combinations into a binary split.
With spore_diff: 0.0 every branch is its own recursive subtree
(depth segment .<i>), and the combinations that were NOT observed in the
count sample are grouped into a single residual subtree (segment .n).
Section depth is dot-separated (e.g. 0, 0.3, 0.3.n), so the decision
path of a leaf is reconstructed exactly.
Effects:
- Spores keep the standard
l/n/rencoding disabled; the extended dot-encoded depth is the only encoding. - Each branch subtree scores itself via its own sample read.
- A split observed across all possible combinations has no residual branch.
- Best for sparse high-dimensional tables: with
spore_diff: 0.0the split does not cluster distinct cells into groups; with the default1.0it collapses into a clean binary split.
| Value | Effect |
|---|---|
0.0 |
One branch per observed cell; residual n groups the unobserved cells (fan-out) |
0 < spore_diff < 1 |
Greedy adjacent merge below the distance; intermediate fan-out |
>= 1.0 (default) |
All observed combinations condensed into a binary split |
Quick Reference Table¶
Note that min_eval_fit — not max_depth — is what these profiles tune to
control model size. See the
Settings Guide.
See also¶
- Settings Guide — Every setting with an example, a value table, and its interactions with the other settings
- Training Internals — The algorithm these settings drive
- Best Practices — Recommended tuning order
- Troubleshooting — Common issues