microsoft/qlib · error · ValueError

Unsupported reweighter type.

Error message

Unsupported reweighter type.

What it means

Thrown by LGBModel._prepare_data when the reweighter argument is neither None nor a qlib.model.base.Reweighter instance. The API accepts only these two forms; passing arrays, callables, or duck-typed objects fails before the lgb.Dataset is built.

Source

Thrown at qlib/contrib/model/gbdt.py:53

        for key in ["train", "valid"]:
            if key in dataset.segments:
                df = dataset.prepare(key, col_set=["feature", "label"], data_key=DataHandlerLP.DK_L)
                if df.empty:
                    raise ValueError("Empty data from dataset, please check your dataset config.")
                x, y = df["feature"], df["label"]

                # Lightgbm need 1D array as its label
                if y.values.ndim == 2 and y.values.shape[1] == 1:
                    y = np.squeeze(y.values)
                else:
                    raise ValueError("LightGBM doesn't support multi-label training")

                if reweighter is None:
                    w = None
                elif isinstance(reweighter, Reweighter):
                    w = reweighter.reweight(df)
                else:
                    raise ValueError("Unsupported reweighter type.")
                ds_l.append((lgb.Dataset(x.values, label=y, weight=w, free_raw_data=False), key))
        return ds_l

    def fit(
        self,
        dataset: DatasetH,
        num_boost_round=None,
        early_stopping_rounds=None,
        verbose_eval=20,
        evals_result=None,
        reweighter=None,
        **kwargs,
    ):
        if evals_result is None:
            evals_result = {}  # in case of unsafety of Python default values
        ds_l = self._prepare_data(dataset, reweighter)
        ds, names = list(zip(*ds_l))
        early_stopping_callback = lgb.early_stopping(

View on GitHub (pinned to 79633dd950)

Solutions

  1. Subclass qlib.model.base.Reweighter and implement reweight(self, df) -> pd.Series
  2. Pass reweighter=None when no weighting is needed

Example fix

# before
model.fit(dataset, reweighter=np.ones(n))

# after
from qlib.model.base import Reweighter

class MyReweighter(Reweighter):
    def reweight(self, df):
        return pd.Series(1.0, index=df.index)

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

Strategy: type-guard

Validate before calling

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

Type guard

from qlib.model.base import Reweighter

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

Prevention

When it happens

Trigger: model.fit(dataset, reweighter=np.array([...])) or reweighter=some_function; a custom class implementing reweight() without subclassing Reweighter.

Common situations: Coming from sklearn's sample_weight convention; writing a custom weighting scheme unaware of the Reweighter base class.

Related errors


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