microsoft/qlib · error · ValueError

Unsupported reweighter type.

Error message

Unsupported reweighter type.

What it means

Raised in DNNModelPytorch.fit when the `reweighter` argument is neither None nor an instance of qlib.model.base.Reweighter. Sample weights are mandatory internally (the DataLoader wraps data with a weight array), so the model must resolve reweighter to a concrete weight vector; anything else (a function, dict, ndarray) is rejected.

Source

Thrown at qlib/contrib/model/pytorch_general_nn.py:258

        reweighter=None,
    ):
        ists = isinstance(dataset, TSDatasetH)  # is this time series dataset

        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)
        self.logger.info(f"Train samples: {len(dl_train)}")
        self.logger.info(f"Valid samples: {len(dl_valid)}")
        if dl_train.empty or dl_valid.empty:
            raise ValueError("Empty data from dataset, please check your dataset config.")

        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.")

        # Preprocess for data.  To align to Dataset Interface for DataLoader
        if ists:
            dl_train.config(fillna_type="ffill+bfill")  # process nan brought by dataloader
            dl_valid.config(fillna_type="ffill+bfill")  # process nan brought by dataloader
        else:
            # If it is a tabular, we convert the dataframe to numpy to be indexable by DataLoader
            dl_train = dl_train.values
            dl_valid = dl_valid.values

        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(

View on GitHub (pinned to 79633dd950)

Solutions

  1. Wrap your weighting logic in qlib.model.base.Reweighter: subclass it and implement reweight(df) returning a per-row weight array aligned with the DataFrame index.
  2. Pass reweighter=None if you do not need sample weights (uniform weights are used automatically).

Example fix

# before
def my_w(df):
    return (df.index.year - 2000).values
model.fit(dataset, reweighter=my_w)  # ValueError

# after
from qlib.model.base import Reweighter
class YearReweighter(Reweighter):
    def reweight(self, df):
        return (df.index.get_level_values(0).year - 2000).values
model.fit(dataset, reweighter=YearReweighter())
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 a qlib.model.base.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)  # retry without reweighting
    else:
        raise

Prevention

When it happens

Trigger: Calling fit(dataset, reweighter=some_function) or passing a custom object that mimics Reweighter but does not subclass it. Note the check is isinstance-based, so duck typing fails even if the object has a .reweight method.

Common situations: Implementing a custom sample-weighting scheme (e.g. weighting by volatility or recency) as a lambda/function instead of a Reweighter subclass; passing sklearn-style sample_weight arrays directly.

Related errors


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