microsoft/qlib · error · ValueError

model is not fitted yet!

Error message

model is not fitted yet!

What it means

Thrown by TRAModel.predict when self.fitted is False. TRAModel (temporal routing adaptor) sets fitted only after a full train run (which also writes info.json to logdir). Note predict additionally asserts the dataset is an MTSDatasetH, so the fitted check fires after that type check passes.

Source

Thrown at qlib/contrib/model/pytorch_tra.py:503

                    "alpha": self.alpha,
                    "seed": self.seed,
                    "logdir": self.logdir,
                    "pretrain": self.pretrain,
                    "init_state": self.init_state,
                    "transport_method": self.transport_method,
                    "use_daily_transport": self.use_daily_transport,
                },
                "best_eval_metric": -best_score,  # NOTE: -1 for minimize
                "metrics": {"train": train_metrics, "valid": valid_metrics, "test": test_metrics},
            }
            with open(self.logdir + "/info.json", "w") as f:
                json.dump(info, f)

    def predict(self, dataset, segment="test"):
        assert isinstance(dataset, MTSDatasetH), "TRAModel only supports `qlib.contrib.data.dataset.MTSDatasetH`"

        if not self.fitted:
            raise ValueError("model is not fitted yet!")

        test_set = dataset.prepare(segment)

        metrics, preds, _, _ = self.test_epoch(-1, test_set, return_pred=True)
        self.logger.info("test metrics: %s" % metrics)

        return preds


class RNN(nn.Module):
    """RNN Model

    Args:
        input_size (int): input size (# features)
        hidden_size (int): hidden size
        num_layers (int): number of hidden layers
        rnn_arch (str): rnn architecture
        use_attn (bool): whether use attention layer.

View on GitHub (pinned to 79633dd950)

Solutions

  1. Run the full TRA training entry point (model.train / the workflow's fit stage) to completion before predicting.
  2. If training failed, read the earlier traceback and fix it — fitted is only set on the success path.
  3. Persist the trained TRAModel (e.g. save state + logdir) and reload the fitted object instead of predicting from a fresh instance.

Example fix

# before
model = TRAModel(...)
model.predict(mts_dataset)  # ValueError: not fitted

# after
model = TRAModel(...)
model.train(mts_dataset, ...)
model.predict(mts_dataset)
Defensive patterns

Strategy: validation

Validate before calling

from qlib.contrib.data.dataset import MTSDatasetH
assert isinstance(dataset, MTSDatasetH), "TRAModel requires MTSDatasetH"
assert getattr(model, "fitted", False), "TRAModel not fitted — run train(...) before predict"

Type guard

def tra_predict_ready(model, dataset) -> bool:
    from qlib.contrib.data.dataset import MTSDatasetH
    return isinstance(dataset, MTSDatasetH) and getattr(model, "fitted", False)

Try / catch

try:
    preds = model.predict(dataset)
except ValueError as e:
    if "not fitted" in str(e):
        raise RuntimeError("Complete TRA training before evaluation") from e
    raise

Prevention

When it happens

Trigger: Calling TRAModel.predict(dataset) where dataset is an MTSDatasetH but model.train(...) was never called or raised before completion (e.g. logging/threading errors or a failed epoch) — fitted stays False and predict raises.

Common situations: TRA workflow scripts that train and evaluate in separate stages; a crashed train (OOM, bad task config) followed by an eval stage that unconditionally predicts; reusing a model object after partially running TRA's task-aware training.

Related errors


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