microsoft/qlib · error · ValueError

Unsupported reweighter type.

Error message

Unsupported reweighter type.

What it means

Raised in GRUModelTS.fit when `reweighter` is neither None nor a qlib.model.base.Reweighter instance. The TS DataLoader pairs each sample with a weight from this reweighter, so the type check is strict isinstance-based; a callable or array is rejected.

Source

Thrown at qlib/contrib/model/pytorch_gru_ts.py:222

        save_path=None,
        reweighter=None,
    ):
        dl_train = dataset.prepare("train", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
        dl_valid = dataset.prepare("valid", col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
        if dl_train.empty or dl_valid.empty:
            raise ValueError("Empty data from dataset, please check your dataset config.")

        dl_train.config(fillna_type="ffill+bfill")  # process nan brought by dataloader
        dl_valid.config(fillna_type="ffill+bfill")  # process nan brought by dataloader

        if reweighter is None:
            wl_train = np.ones(len(dl_train))
            wl_valid = np.ones(len(dl_valid))
        elif isinstance(reweighter, Reweighter):
            wl_train = reweighter.reweight(dl_train)
            wl_valid = reweighter.reweight(dl_valid)
        else:
            raise ValueError("Unsupported reweighter type.")

        train_loader = DataLoader(
            ConcatDataset(dl_train, wl_train),
            batch_size=self.batch_size,
            shuffle=True,
            num_workers=self.n_jobs,
            drop_last=True,
        )
        valid_loader = DataLoader(
            ConcatDataset(dl_valid, wl_valid),
            batch_size=self.batch_size,
            shuffle=False,
            num_workers=self.n_jobs,
            drop_last=True,
        )

        save_path = get_or_create_path(save_path)

View on GitHub (pinned to 79633dd950)

Solutions

  1. Wrap weighting logic in a qlib.model.base.Reweighter subclass implementing reweight(df).
  2. Pass reweighter=None for uniform weights.

Example fix

# before
model.fit(dataset, reweighter=np.linspace(0.1, 1.0, n))  # ValueError

# after
from qlib.model.base import Reweighter
class LinearReweighter(Reweighter):
    def reweight(self, df):
        return np.linspace(0.1, 1.0, len(df))
model.fit(dataset, reweighter=LinearReweighter())
Defensive patterns

Strategy: type-guard

Validate before calling

from qlib.model.base import Reweighter
assert reweighter is None or isinstance(reweighter, Reweighter), "reweighter must be None or Reweighter instance"

Type guard

from qlib.model.base import Reweighter

def is_valid_reweighter(r) -> bool:
    return r is None or isinstance(r, Reweighter)

Try / catch

try:
    model.fit(dataset, reweighter=reweighter)
except ValueError as e:
    if "Unsupported reweighter type" in str(e):
        model.fit(dataset)
    else:
        raise

Prevention

When it happens

Trigger: fit(dataset, reweighter=lambda df: ...) or passing a numpy weight array; also passing a Reweighter-like duck-typed object that does not subclass Reweighter.

Common situations: Custom sample weighting implemented as a plain function; migrating code that passed sample_weight arrays to sklearn-style APIs.

Related errors


AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15). Data as JSON: /api/errors/6f09b6ef0d3991f5. Report an issue: GitHub.