Implementation:Online ml River Tree Splitter NominalReg
| Knowledge Sources | |
|---|---|
| Domains | Online_Learning, Decision_Trees, Regression |
| Last Updated | 2026-02-08 16:00 GMT |
Overview
Splitter for nominal (categorical) features in regression tasks that maintains target statistics for each feature value.
Description
NominalSplitterReg monitors categorical features in regression by keeping variance statistics (Var or VectorDict of Var for multi-target) for each observed feature value. It supports both binary splits (one value vs. others) and multiway splits (one branch per category). The estimator update strategy is dynamically selected based on whether the task is univariate or multivariate regression.
Usage
Use NominalSplitterReg when monitoring categorical features in regression trees. It automatically handles univariate and multi-target regression scenarios.
Code Reference
Source Location
- Repository: Online_ml_River
- File: river/tree/splitter/nominal_splitter_reg.py
Signature
class NominalSplitterReg(Splitter):
def __init__(self):
...
@property
def is_numeric(self):
return False
def update(self, att_val, target_val, w):
...
def cond_proba(self, att_val, target_val):
raise NotImplementedError
def best_evaluated_split_suggestion(self, criterion, pre_split_dist, att_idx, binary_only):
...
Import
from river.tree.splitter import NominalSplitterReg
I/O Contract
| Input | Type | Description |
|---|---|---|
| att_val | any | Categorical feature value |
| target_val | float/dict | Target value (supports multi-target) |
| w | float | Sample weight |
| binary_only | bool | If True, only binary splits; else include multiway |
| Output | Type | Description |
|---|---|---|
| split_suggestion | BranchFactory | Best split with variance statistics |
Usage Examples
from river.tree.splitter.nominal_splitter_reg import NominalSplitterReg
from river.tree.split_criterion import VarianceRatioSplitCriterion
from river.stats import Var
splitter = NominalSplitterReg()
# Update with categorical observations
splitter.update('red', 25.5, 1.0)
splitter.update('blue', 30.2, 1.0)
splitter.update('red', 26.1, 1.0)
splitter.update('green', 28.5, 1.0)
# Get best binary split
criterion = VarianceRatioSplitCriterion()
pre_split = Var()
pre_split.update(25.5, 1.0)
pre_split.update(30.2, 1.0)
pre_split.update(26.1, 1.0)
pre_split.update(28.5, 1.0)
binary_split = splitter.best_evaluated_split_suggestion(
criterion=criterion,
pre_split_dist=pre_split,
att_idx='color',
binary_only=True
)
print(f"Split value: {binary_split.split_info}")
print(f"Merit: {binary_split.merit}")
# Multiway split
multiway_split = splitter.best_evaluated_split_suggestion(
criterion=criterion,
pre_split_dist=pre_split,
att_idx='color',
binary_only=False
)