microsoft/qlib · error · ValueError

model is not fitted yet!

Error message

model is not fitted yet!

What it means

Raised by SFM model predict() in qlib/contrib/model/pytorch_sfm.py:438 when self.fitted is False. The flag flips True only after fit() completes (including restoring best params); predict() guards inference with it. An unfitted or half-fit model raises immediately before touching the dataset.

Source

Thrown at qlib/contrib/model/pytorch_sfm.py:438

    def loss_fn(self, pred, label):
        mask = ~torch.isnan(label)

        if self.loss == "mse":
            return self.mse(pred[mask], label[mask])

        raise ValueError("unknown loss `%s`" % self.loss)

    def metric_fn(self, pred, label):
        mask = torch.isfinite(label)

        if self.metric in ("", "loss"):
            return -self.loss_fn(pred[mask], label[mask])

        raise ValueError("unknown metric `%s`" % self.metric)

    def predict(self, dataset: DatasetH, segment: Union[Text, slice] = "test"):
        if not self.fitted:
            raise ValueError("model is not fitted yet!")

        x_test = dataset.prepare(segment, col_set="feature", data_key=DataHandlerLP.DK_I)
        index = x_test.index
        self.sfm_model.eval()
        x_values = x_test.values
        sample_num = x_values.shape[0]
        preds = []

        for begin in range(sample_num)[:: self.batch_size]:
            if sample_num - begin < self.batch_size:
                end = sample_num
            else:
                end = begin + self.batch_size

            x_batch = torch.from_numpy(x_values[begin:end]).float().to(self.device)

            with torch.no_grad():
                pred = self.sfm_model(x_batch).detach().cpu().numpy()

View on GitHub (pinned to 79633dd950)

Solutions

  1. Run fit() to completion before predict().
  2. Check the fitted attribute (or 'best score' log line) before predicting in scripts.
  3. Fix the underlying fit()-time failure if fit never finishes.

Example fix

if not model.fitted:
    model.fit(dataset)
preds = model.predict(dataset, segment="test")
Defensive patterns

Strategy: validation

Validate before calling

if not model.fitted:
    raise RuntimeError("SFM model must complete fit() before predict()")
preds = model.predict(dataset, segment="test")

Type guard

def is_fitted(model) -> bool:
    return bool(getattr(model, "fitted", False))

Try / catch

try:
    preds = model.predict(dataset, segment)
except ValueError as e:
    if "not fitted" in str(e):
        raise RuntimeError("fit() never completed; fix training errors first") from e
    raise

Prevention

When it happens

Trigger: predict() called before fit(); predict() after a fit() that crashed (empty data, bad loss/metric config, OOM) — fitted remains False.

Common situations: Retry loops in backtest scripts that call predict without checking fit status; notebook cells run out of order after a failed training cell.

Related errors


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