def METHOD_NAME(self, data_dictionary: Dict[str, Any], dk: FreqaiDataKitchen, **kwargs):
    """
    User customizable fit method
    :param data_dictionary: dict = common data dictionary containing all train/test
        features/labels/weights.
    :param dk: FreqaiDatakitchen = data kitchen for current pair.
    :return:
    model Any = trained model to be used for inference in dry/live/backtesting
    """
    train_df = data_dictionary["train_features"]
    total_timesteps = self.freqai_info["rl_config"]["train_cycles"] * len(train_df)
    policy_kwargs = dict(activation_fn=th.nn.ReLU,
                         net_arch=self.net_arch)
    if self.activate_tensorboard:
        tb_path = Path(dk.full_path / "tensorboard" / dk.pair.split('/')[0])
    else:
        tb_path = None
    if dk.pair not in self.dd.model_dictionary or not self.continual_learning:
        model = self.MODELCLASS(self.policy_type, self.train_env, policy_kwargs=policy_kwargs,
                                tensorboard_log=tb_path,
                                **self.freqai_info.get('model_training_parameters', {})
                                )
    else:
        logger.info('Continual training activated - starting training from previously '
                    'trained agent.')
        model = self.dd.model_dictionary[dk.pair]
        model.set_env(self.train_env)
    model.learn(
        total_timesteps=int(total_timesteps),
        callback=[self.eval_callback, self.tensorboard_callback],
        progress_bar=self.rl_config.get('progress_bar', False)
    )
    if Path(dk.data_path / "best_model.zip").is_file():
        logger.info('Callback found a best model.')
        best_model = self.MODELCLASS.load(dk.data_path / "best_model")
        return best_model
    logger.info('Couldnt find best model, using final model instead.')
    return model