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
- 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.
- 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
- Implement custom sample weighting as a Reweighter subclass, never as a bare function or array.
- isinstance is enforced — duck typing is not enough; always subclass qlib.model.base.Reweighter.
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
- Unsupported reweighter type.
- Unsupported reweighter type.
- Unsupported reweighter type.
- Unsupported reweighter type.
- Unsupported reweighter type.
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/77a0fcbb0078fa66.
Report an issue: GitHub.