/*! * Copyright 2014-2019 by Contributors * \file objective.h * \brief interface of objective function used by xgboost. * \author Tianqi Chen, Kailong Chen */ #ifndef XGBOOST_OBJECTIVE_H_ #define XGBOOST_OBJECTIVE_H_ #include #include #include #include #include #include #include #include #include #include namespace xgboost { /*! \brief interface of objective function */ class ObjFunction : public Configurable { protected: GenericParameter const* tparam_; public: /*! \brief virtual destructor */ ~ObjFunction() override = default; /*! * \brief Configure the objective with the specified parameters. * \param args arguments to the objective function. */ virtual void Configure(const std::vector >& args) = 0; /*! * \brief Get gradient over each of predictions, given existing information. * \param preds prediction of current round * \param info information about labels, weights, groups in rank * \param iteration current iteration number. * \param out_gpair output of get gradient, saves gradient and second order gradient in */ virtual void GetGradient(const HostDeviceVector& preds, const MetaInfo& info, int iteration, HostDeviceVector* out_gpair) = 0; /*! \return the default evaluation metric for the objective */ virtual const char* DefaultEvalMetric() const = 0; // the following functions are optional, most of time default implementation is good enough /*! * \brief transform prediction values, this is only called when Prediction is called * \param io_preds prediction values, saves to this vector as well */ virtual void PredTransform(HostDeviceVector*) {} /*! * \brief transform prediction values, this is only called when Eval is called, * usually it redirect to PredTransform * \param io_preds prediction values, saves to this vector as well */ virtual void EvalTransform(HostDeviceVector *io_preds) { this->PredTransform(io_preds); } /*! * \brief transform probability value back to margin * this is used to transform user-set base_score back to margin * used by gradient boosting * \return transformed value */ virtual bst_float ProbToMargin(bst_float base_score) const { return base_score; } /*! * \brief Create an objective function according to name. * \param tparam Generic parameters. * \param name Name of the objective. */ static ObjFunction* Create(const std::string& name, GenericParameter const* tparam); }; /*! * \brief Registry entry for objective factory functions. */ struct ObjFunctionReg : public dmlc::FunctionRegEntryBase > { }; /*! * \brief Macro to register objective function. * * \code * // example of registering a objective * XGBOOST_REGISTER_OBJECTIVE(LinearRegression, "reg:squarederror") * .describe("Linear regression objective") * .set_body([]() { * return new RegLossObj(LossType::kLinearSquare); * }); * \endcode */ #define XGBOOST_REGISTER_OBJECTIVE(UniqueId, Name) \ static DMLC_ATTRIBUTE_UNUSED ::xgboost::ObjFunctionReg & \ __make_ ## ObjFunctionReg ## _ ## UniqueId ## __ = \ ::dmlc::Registry< ::xgboost::ObjFunctionReg>::Get()->__REGISTER__(Name) } // namespace xgboost #endif // XGBOOST_OBJECTIVE_H_