microsoft/qlib · error · ValueError

model is not fitted yet!

Error message

model is not fitted yet!

What it means

KRNNModel.predict refuses to run unless self.fitted is True, which only happens after fit() completes. Predicting before a successful fit raises this ValueError.

Source

Thrown at qlib/contrib/model/pytorch_krnn.py:492

                stop_steps = 0
                best_epoch = step
                best_param = copy.deepcopy(self.krnn_model.state_dict())
            else:
                stop_steps += 1
                if stop_steps >= self.early_stop:
                    self.logger.info("early stop")
                    break

        self.logger.info("best score: %.6lf @ %d" % (best_score, best_epoch))
        self.krnn_model.load_state_dict(best_param)
        torch.save(best_param, save_path)

        if self.use_gpu:
            torch.cuda.empty_cache()

    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.krnn_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.krnn_model(x_batch).detach().cpu().numpy()
            preds.append(pred)

View on GitHub (pinned to 79633dd950)

Solutions

  1. Complete fit() before predict()
  2. For inference-only flows, load the checkpoint and set model.fitted = True
  3. Fix exception handling so a failed fit stops the pipeline

Example fix

# before
preds = model.predict(dataset)  # unfitted

# after
model.fit(dataset)
preds = model.predict(dataset)
Defensive patterns

Strategy: validation

Validate before calling

if not getattr(model, "fitted", False):
    raise RuntimeError("KRNNModel not fitted; run fit() first")

Type guard

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

Try / catch

try:
    model.predict(dataset)
except ValueError as e:
    if "not fitted" in str(e):
        model.fit(dataset)
        model.predict(dataset)
    else:
        raise

Prevention

When it happens

Trigger: model.predict(dataset) on a KRNNModel instance whose fit() never ran or raised before setting fitted=True.

Common situations: Fresh model object in an inference script; fit failure ignored by broad try/except; model serialized before fitting.

Related errors


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