{"record":{"id":"6d570aef744b8a35","repo":"microsoft/qlib","slug":"unsupported-reweighter-type","errorCode":null,"errorMessage":"Unsupported reweighter type.","messagePattern":"Unsupported reweighter type\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/model/catboost_model.py","lineNumber":61,"sourceCode":"        if df_train.empty or df_valid.empty:\n            raise ValueError(\"Empty data from dataset, please check your dataset config.\")\n        x_train, y_train = df_train[\"feature\"], df_train[\"label\"]\n        x_valid, y_valid = df_valid[\"feature\"], df_valid[\"label\"]\n\n        # CatBoost needs 1D array as its label\n        if y_train.values.ndim == 2 and y_train.values.shape[1] == 1:\n            y_train_1d, y_valid_1d = np.squeeze(y_train.values), np.squeeze(y_valid.values)\n        else:\n            raise ValueError(\"CatBoost doesn't support multi-label training\")\n\n        if reweighter is None:\n            w_train = None\n            w_valid = None\n        elif isinstance(reweighter, Reweighter):\n            w_train = reweighter.reweight(df_train).values\n            w_valid = reweighter.reweight(df_valid).values\n        else:\n            raise ValueError(\"Unsupported reweighter type.\")\n\n        train_pool = Pool(data=x_train, label=y_train_1d, weight=w_train)\n        valid_pool = Pool(data=x_valid, label=y_valid_1d, weight=w_valid)\n\n        # Initialize the catboost model\n        self._params[\"iterations\"] = num_boost_round\n        self._params[\"early_stopping_rounds\"] = early_stopping_rounds\n        self._params[\"verbose_eval\"] = verbose_eval\n        self._params[\"task_type\"] = \"GPU\" if get_gpu_device_count() > 0 else \"CPU\"\n        self.model = CatBoost(self._params, **kwargs)\n\n        # train the model\n        self.model.fit(train_pool, eval_set=valid_pool, use_best_model=True, **kwargs)\n\n        evals_result = self.model.get_evals_result()\n        evals_result[\"train\"] = list(evals_result[\"learn\"].values())[0]\n        evals_result[\"valid\"] = list(evals_result[\"validation\"].values())[0]\n","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/model/catboost_model.py#L43-L79","documentation":"Thrown by CatBoostModel.fit when the reweighter argument is neither None nor an instance of qlib.model.base.Reweighter. The fit signature only accepts those two options; arbitrary callables (e.g. sklearn-style sample_weight functions) are not supported and rejected before training.","triggerScenarios":"Calling fit(dataset, reweighter=my_func) where my_func is a plain function or lambda; passing a custom class that duck-types reweight() but does not subclass Reweighter; passing a numpy array of weights.","commonSituations":"Porting code from another framework that takes sample_weight arrays directly; implementing a custom sample-weighting scheme without knowing qlib's Reweighter contract.","solutions":["Wrap custom logic in a qlib Reweighter subclass implementing reweight(df) -> pd.Series","Pass reweighter=None if no reweighting is needed"],"exampleFix":"# before\nmodel.fit(dataset, reweighter=lambda df: np.ones(len(df)))\n\n# after\nfrom qlib.model.base import Reweighter\n\nclass OnesReweighter(Reweighter):\n    def reweight(self, df):\n        return pd.Series(np.ones(len(df)), index=df.index)\n\nmodel.fit(dataset, reweighter=OnesReweighter())","handlingStrategy":"type-guard","validationCode":"from qlib.model.base import Reweighter\nassert reweighter is None or isinstance(reweighter, Reweighter), \"reweighter must be None or Reweighter\"","typeGuard":"from qlib.model.base import Reweighter\n\ndef is_valid_reweighter(r) -> bool:\n    return r is None or isinstance(r, Reweighter)","tryCatchPattern":null,"preventionTips":["Always subclass qlib.model.base.Reweighter for custom weighting","Do not pass numpy arrays or raw functions as reweighter"],"tags":["catboost","reweighter","type-check","qlib"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}