{"record":{"id":"b46a6b15fe0f0d2c","repo":"microsoft/qlib","slug":"unsupported-reweighter-type-b46a6b","errorCode":null,"errorMessage":"Unsupported reweighter type.","messagePattern":"Unsupported reweighter type\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/pytorch_lstm_ts.py","lineNumber":217,"sourceCode":"        save_path=None,\n        reweighter=None,\n    ):\n        dl_train = dataset.prepare(\"train\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\n        dl_valid = dataset.prepare(\"valid\", col_set=[\"feature\", \"label\"], data_key=DataHandlerLP.DK_L)\n        if dl_train.empty or dl_valid.empty:\n            raise ValueError(\"Empty data from dataset, please check your dataset config.\")\n\n        dl_train.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\n        dl_valid.config(fillna_type=\"ffill+bfill\")  # process nan brought by dataloader\n\n        if reweighter is None:\n            wl_train = np.ones(len(dl_train))\n            wl_valid = np.ones(len(dl_valid))\n        elif isinstance(reweighter, Reweighter):\n            wl_train = reweighter.reweight(dl_train)\n            wl_valid = reweighter.reweight(dl_valid)\n        else:\n            raise ValueError(\"Unsupported reweighter type.\")\n\n        train_loader = DataLoader(\n            ConcatDataset(dl_train, wl_train),\n            batch_size=self.batch_size,\n            shuffle=True,\n            num_workers=self.n_jobs,\n            drop_last=True,\n        )\n        valid_loader = DataLoader(\n            ConcatDataset(dl_valid, wl_valid),\n            batch_size=self.batch_size,\n            shuffle=False,\n            num_workers=self.n_jobs,\n            drop_last=True,\n        )\n\n        save_path = get_or_create_path(save_path)\n","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/pytorch_lstm_ts.py#L199-L235","documentation":"The TS LSTM fit() accepts a reweighter only in two forms: None (uniform weights of ones) or an instance of qlib.dataset.common.Reweighter (whose reweight(df) method supplies sample weights). Anything else raises ValueError('Unsupported reweighter type.') before DataLoaders are constructed.","triggerScenarios":"model.fit(dataset, reweighter=X) where X is neither None nor a Reweighter instance — e.g. a numpy array of weights, a dict, a callable, or a custom class that mimics Reweighter but does not subclass it.","commonSituations":"Passing a raw weight vector because the model's loss takes weights; implementing sample weighting ad hoc instead of via Reweighter; passing a Reweighter imported from the wrong module path or a reimplementation.","solutions":["Wrap your weighting logic in qlib.dataset.common.Reweighter (implement its reweight(df) method) and pass that instance.","Omit the argument (reweighter=None) for uniform weights.","If using a builtin, qlib provides Reweighter subclasses (e.g. in qlib/contrib/eva/alpha or similar weighting utilities) — reuse them where they fit."],"exampleFix":"# before\nmodel.fit(dataset, reweighter=np.array([0.5, 1.5, ...]))  # ValueError: Unsupported reweighter type.\n\n# after\nfrom qlib.data.dataset import Reweighter\n\nclass MyReweighter(Reweighter):\n    def reweight(self, data_frame):\n        return data_frame[\"label\"].abs().values  # your weights\n\nmodel.fit(dataset, reweighter=MyReweighter())","handlingStrategy":"type-guard","validationCode":"from qlib.data.dataset import Reweighter\n\nif reweighter is not None and not isinstance(reweighter, Reweighter):\n    raise TypeError(\"reweighter must be None or a qlib Reweighter instance\")\nmodel.fit(dataset, reweighter=reweighter)","typeGuard":"from qlib.data.dataset import Reweighter\n\ndef is_valid_reweighter(rw) -> bool:\n    return rw is None or isinstance(rw, Reweighter)","tryCatchPattern":"try:\n    model.fit(dataset, reweighter=rw)\nexcept ValueError as e:\n    if \"Unsupported reweighter\" in str(e):\n        raise TypeError(\"Wrap weights in a qlib Reweighter subclass\") from e\n    raise","preventionTips":["Never pass raw arrays/callables as reweighter — always a Reweighter subclass.","Import Reweighter from qlib.data.dataset (qlib.dataset.common) so isinstance checks match.","Implement reweight(data_frame) returning one weight per sample."],"tags":["pytorch","qlib","reweighter","lstm","type-validation"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}