{"record":{"id":"a0f7e3b6f8625170","repo":"microsoft/qlib","slug":"unknown-loss-s-a0f7e3","errorCode":null,"errorMessage":"unknown loss `%s`","messagePattern":"unknown loss `(.+?)`","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_krnn.py","lineNumber":359,"sourceCode":"\r\n        self.fitted = False\r\n        self.krnn_model.to(self.device)\r\n\r\n    @property\r\n    def use_gpu(self):\r\n        return self.device != torch.device(\"cpu\")\r\n\r\n    def mse(self, pred, label):\r\n        loss = (pred - label) ** 2\r\n        return torch.mean(loss)\r\n\r\n    def loss_fn(self, pred, label):\r\n        mask = ~torch.isnan(label)\r\n\r\n        if self.loss == \"mse\":\r\n            return self.mse(pred[mask], label[mask])\r\n\r\n        raise ValueError(\"unknown loss `%s`\" % self.loss)\r\n\r\n    def metric_fn(self, pred, label):\r\n        mask = torch.isfinite(label)\r\n\r\n        if self.metric in (\"\", \"loss\"):\r\n            return -self.loss_fn(pred[mask], label[mask])\r\n\r\n        raise ValueError(\"unknown metric `%s`\" % self.metric)\r\n\r\n    def get_daily_inter(self, df, shuffle=False):\r\n        # organize the train data into daily batches\r\n        daily_count = df.groupby(level=0, group_keys=False).size().values\r\n        daily_index = np.roll(np.cumsum(daily_count), 1)\r\n        daily_index[0] = 0\r\n        if shuffle:\r\n            # shuffle data\r\n            daily_shuffle = list(zip(daily_index, daily_count))\r\n            np.random.shuffle(daily_shuffle)\r","sourceCodeStart":341,"sourceCodeEnd":377,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_krnn.py#L341-L377","documentation":"KRNNModel.loss_fn supports only 'mse' (masked mean squared error over non-NaN labels). Any other loss string raises ValueError on the first loss computation during fit().","triggerScenarios":"KRNNModel(loss=anything != 'mse'), then fit(); also triggered by a hyperparameter-search grid containing unsupported loss values.","commonSituations":"Shared hyperparameter configs across model types where some models accept other losses; typos.","solutions":["Set loss='mse'","Subclass and override loss_fn for custom losses"],"exampleFix":"# before\nKRNNModel(loss=\"huber\")\n\n# after\nKRNNModel(loss=\"mse\")","handlingStrategy":"validation","validationCode":"assert loss == \"mse\", \"KRNNModel supports only loss='mse'\"","typeGuard":"def is_supported_krnn_loss(name: str) -> bool:\n    return name == \"mse\"","tryCatchPattern":null,"preventionTips":["Pin loss='mse' in KRNN configs","Subclass for custom losses instead of passing unsupported names"],"tags":["qlib","krnn","loss-function","invalid-argument"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}