{"record":{"id":"8fa898cfaad643d4","repo":"microsoft/qlib","slug":"model-is-not-fitted-yet-8fa898","errorCode":null,"errorMessage":"model is not fitted yet!","messagePattern":"model is not fitted yet!","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_krnn.py","lineNumber":492,"sourceCode":"                stop_steps = 0\r\n                best_epoch = step\r\n                best_param = copy.deepcopy(self.krnn_model.state_dict())\r\n            else:\r\n                stop_steps += 1\r\n                if stop_steps >= self.early_stop:\r\n                    self.logger.info(\"early stop\")\r\n                    break\r\n\r\n        self.logger.info(\"best score: %.6lf @ %d\" % (best_score, best_epoch))\r\n        self.krnn_model.load_state_dict(best_param)\r\n        torch.save(best_param, save_path)\r\n\r\n        if self.use_gpu:\r\n            torch.cuda.empty_cache()\r\n\r\n    def predict(self, dataset: DatasetH, segment: Union[Text, slice] = \"test\"):\r\n        if not self.fitted:\r\n            raise ValueError(\"model is not fitted yet!\")\r\n\r\n        x_test = dataset.prepare(segment, col_set=\"feature\", data_key=DataHandlerLP.DK_I)\r\n        index = x_test.index\r\n        self.krnn_model.eval()\r\n        x_values = x_test.values\r\n        sample_num = x_values.shape[0]\r\n        preds = []\r\n\r\n        for begin in range(sample_num)[:: self.batch_size]:\r\n            if sample_num - begin < self.batch_size:\r\n                end = sample_num\r\n            else:\r\n                end = begin + self.batch_size\r\n            x_batch = torch.from_numpy(x_values[begin:end]).float().to(self.device)\r\n            with torch.no_grad():\r\n                pred = self.krnn_model(x_batch).detach().cpu().numpy()\r\n            preds.append(pred)\r\n\r","sourceCodeStart":474,"sourceCodeEnd":510,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_krnn.py#L474-L510","documentation":"KRNNModel.predict refuses to run unless self.fitted is True, which only happens after fit() completes. Predicting before a successful fit raises this ValueError.","triggerScenarios":"model.predict(dataset) on a KRNNModel instance whose fit() never ran or raised before setting fitted=True.","commonSituations":"Fresh model object in an inference script; fit failure ignored by broad try/except; model serialized before fitting.","solutions":["Complete fit() before predict()","For inference-only flows, load the checkpoint and set model.fitted = True","Fix exception handling so a failed fit stops the pipeline"],"exampleFix":"# before\npreds = model.predict(dataset)  # unfitted\n\n# after\nmodel.fit(dataset)\npreds = model.predict(dataset)","handlingStrategy":"validation","validationCode":"if not getattr(model, \"fitted\", False):\n    raise RuntimeError(\"KRNNModel not fitted; run fit() first\")","typeGuard":"def is_fitted(model) -> bool:\n    return bool(getattr(model, \"fitted\", False))","tryCatchPattern":"try:\n    model.predict(dataset)\nexcept ValueError as e:\n    if \"not fitted\" in str(e):\n        model.fit(dataset)\n        model.predict(dataset)\n    else:\n        raise","preventionTips":["Check fitted status in predict wrappers","Ensure failed fits abort rather than fall through to inference"],"tags":["qlib","krnn","lifecycle","predict-before-fit"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}