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
- Inspect dataset.prepare(seg, col_set=["feature","label"], data_key="learn").shape for each segment before fit
- Correct handler date ranges and instrument selection to overlap loaded data
- 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
- Validate every segment's shape before fit
- Ensure date ranges and instrument filters match the loaded data
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
- Empty data from dataset, please check your dataset config.
- Empty data from dataset, please check your dataset config.
- Empty data from dataset, please check your dataset config.
- LightGBM doesn't support multi-label training
- LightGBM doesn't support multi-label training
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/528e72938f9c754d.
Report an issue: GitHub.