microsoft/qlib · error · ValueError

Unsupported reweighter type.

Error message

Unsupported reweighter type.

What it means

The TS LSTM fit() accepts a reweighter only in two forms: None (uniform weights of ones) or an instance of qlib.dataset.common.Reweighter (whose reweight(df) method supplies sample weights). Anything else raises ValueError('Unsupported reweighter type.') before DataLoaders are constructed.

Source

Thrown at qlib/contrib/model/pytorch_lstm_ts.py:217

        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 your weighting logic in qlib.dataset.common.Reweighter (implement its reweight(df) method) and pass that instance.
  2. Omit the argument (reweighter=None) for uniform weights.
  3. If using a builtin, qlib provides Reweighter subclasses (e.g. in qlib/contrib/eva/alpha or similar weighting utilities) — reuse them where they fit.

Example fix

# before
model.fit(dataset, reweighter=np.array([0.5, 1.5, ...]))  # ValueError: Unsupported reweighter type.

# after
from qlib.data.dataset import Reweighter

class MyReweighter(Reweighter):
    def reweight(self, data_frame):
        return data_frame["label"].abs().values  # your weights

model.fit(dataset, reweighter=MyReweighter())
Defensive patterns

Strategy: type-guard

Validate before calling

from qlib.data.dataset import Reweighter

if reweighter is not None and not isinstance(reweighter, Reweighter):
    raise TypeError("reweighter must be None or a qlib Reweighter instance")
model.fit(dataset, reweighter=reweighter)

Type guard

from qlib.data.dataset import Reweighter

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

Try / catch

try:
    model.fit(dataset, reweighter=rw)
except ValueError as e:
    if "Unsupported reweighter" in str(e):
        raise TypeError("Wrap weights in a qlib Reweighter subclass") from e
    raise

Prevention

When it happens

Trigger: model.fit(dataset, reweighter=X) where X is neither None nor a Reweighter instance — e.g. a numpy array of weights, a dict, a callable, or a custom class that mimics Reweighter but does not subclass it.

Common situations: Passing a raw weight vector because the model's loss takes weights; implementing sample weighting ad hoc instead of via Reweighter; passing a Reweighter imported from the wrong module path or a reimplementation.

Related errors


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