microsoft/qlib · error · ValueError

Unsupported reweighter type.

Error message

Unsupported reweighter type.

What it means

ALSTMTSModel.fit() accepts an optional reweighter used to compute per-sample weights for the training and validation loaders. It only handles two cases: reweighter is None (uniform weights of ones) or reweighter is an instance of qlib's Reweighter class. Anything else (a function, lambda, numpy array, dict) raises ValueError.

Source

Thrown at qlib/contrib/model/pytorch_alstm_ts.py:228

        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. Pass None if you do not need sample reweighting.
  2. Subclass qlib.data.dataset.Reweighting.Reweighter and implement reweight(dataset) returning a pandas Series; pass that instance.
  3. Check the actual import path of Reweighter in your qlib version and make sure your class inherits from it.

Example fix

# before
model.fit(dataset, reweighter=lambda df: df['volume'])

# after
from qlib.data.dataset import Reweighter
class VolReweighter(Reweighter):
    def reweight(self, df):
        return df['volume'] / df['volume'].mean()
model.fit(dataset, reweighter=VolReweighter())
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')

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):
        rw = None  # or wrap logic in a Reweighter subclass
        model.fit(dataset, reweighter=rw)
    else:
        raise

Prevention

When it happens

Trigger: Passing fit(dataset, reweighter=my_func), a raw numpy weight array, or a custom reweighting object that does not subclass qlib.data.dataset.Reweighting.Reweighter.

Common situations: Coming from sklearn-style APIs where sample_weight arrays are accepted directly; writing a bespoke reweighting callable instead of subclassing Reweighter; version drift where the Reweighter import path moved and the isinstance check silently fails.

Related errors


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