microsoft/qlib · error · ValueError

Empty data from dataset, please check your dataset config.

Error message

Empty data from dataset, please check your dataset config.

What it means

Thrown by LGBModel._prepare_data when a present segment ('train' or, if defined, 'valid') yields an empty DataFrame from dataset.prepare at learn time. Unlike CatBoost, this model iterates over segments that exist and only requires 'train' (there is an assert for it); the error means a segment that exists in config still produced zero rows.

Source

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

            raise NotImplementedError
        self.params = {"objective": loss, "verbosity": -1}
        self.params.update(kwargs)
        self.early_stopping_rounds = early_stopping_rounds
        self.num_boost_round = num_boost_round
        self.model = None

    def _prepare_data(self, dataset: DatasetH, reweighter=None) -> List[Tuple[lgb.Dataset, str]]:
        """
        The motivation of current version is to make validation optional
        - train segment is necessary;
        """
        ds_l = []
        assert "train" in dataset.segments
        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(

View on GitHub (pinned to 79633dd950)

Solutions

  1. Inspect dataset.prepare(seg, col_set=["feature","label"], data_key="learn").shape for each segment before fit
  2. Correct handler date ranges and instrument selection to overlap loaded data
  3. Check learn processors (dropna etc.) are not removing every row

Example fix

# before
model.fit(dataset)  # ValueError: Empty data from dataset

# after
for seg in dataset.segments:
    df = dataset.prepare(seg, col_set=["feature","label"], data_key="learn")
    assert not df.empty, f"{seg} empty"
model.fit(dataset)
Defensive patterns

Strategy: validation

Validate before calling

assert "train" in dataset.segments
for seg in dataset.segments:
    if seg in ("train", "valid"):
        assert not dataset.prepare(seg, col_set=["feature","label"], data_key="learn").empty, f"{seg} is empty"

Try / catch

try:
    model.fit(dataset)
except ValueError as e:
    if "Empty data" in str(e):
        for seg in dataset.segments:
            print(seg, dataset.prepare(seg, col_set=["feature","label"], data_key="learn").shape)
    raise

Prevention

When it happens

Trigger: Calling fit with a 'train' segment whose date range has no data; DK_L processing dropping all rows; an over-restrictive instrument filter (e.g. market filter matching nothing).

Common situations: Bad start_time/end_time in handler config; stock-pool/filter config selecting no instruments; NaN-heavy features removed by learn processors.

Related errors


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