1#ifndef LIGHTGBM_METRIC_REGRESSION_METRIC_HPP_
2#define LIGHTGBM_METRIC_REGRESSION_METRIC_HPP_
4#include <LightGBM/metric.h>
6#include <LightGBM/utils/log.h>
15template<
typename Po
intWiseLossCalculator>
24 const std::vector<std::string>& GetName()
const override {
28 double factor_to_bigger_better()
const override {
33 name_.emplace_back(PointWiseLossCalculator::Name());
36 label_ = metadata.
label();
39 if (weights_ ==
nullptr) {
40 sum_weights_ =
static_cast<double>(num_data_);
44 sum_weights_ += weights_[i];
48 PointWiseLossCalculator::CheckLabel(label_[i]);
53 double sum_loss = 0.0f;
54 if (objective ==
nullptr) {
55 if (weights_ ==
nullptr) {
56 #pragma omp parallel for schedule(static) reduction(+:sum_loss)
59 sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], score[i], config_);
62 #pragma omp parallel for schedule(static) reduction(+:sum_loss)
65 sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], score[i], config_) * weights_[i];
69 if (weights_ ==
nullptr) {
70 #pragma omp parallel for schedule(static) reduction(+:sum_loss)
74 objective->ConvertOutput(&score[i], &t);
75 sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], t, config_);
78 #pragma omp parallel for schedule(static) reduction(+:sum_loss)
82 objective->ConvertOutput(&score[i], &t);
83 sum_loss += PointWiseLossCalculator::LossOnPoint(label_[i], t, config_) * weights_[i];
87 double loss = PointWiseLossCalculator::AverageLoss(sum_loss, sum_weights_);
88 return std::vector<double>(1, loss);
91 inline static double AverageLoss(
double sum_loss,
double sum_weights) {
92 return sum_loss / sum_weights;
95 inline static void CheckLabel(
label_t) {
109 std::vector<std::string> name_;
117 inline static double LossOnPoint(
label_t label,
double score,
const Config&) {
118 return (score - label)*(score - label);
121 inline static double AverageLoss(
double sum_loss,
double sum_weights) {
123 return std::sqrt(sum_loss / sum_weights);
126 inline static const char* Name() {
136 inline static double LossOnPoint(
label_t label,
double score,
const Config&) {
137 return (score - label)*(score - label);
140 inline static const char* Name() {
151 inline static double LossOnPoint(
label_t label,
double score,
const Config& config) {
152 double delta = label - score;
154 return (config.alpha - 1.0f) * delta;
156 return config.alpha * delta;
160 inline static const char* Name() {
171 inline static double LossOnPoint(
label_t label,
double score,
const Config&) {
172 return std::fabs(score - label);
174 inline static const char* Name() {
185 inline static double LossOnPoint(
label_t label,
double score,
const Config& config) {
186 const double diff = score - label;
187 if (std::abs(diff) <= config.alpha) {
188 return 0.5f * diff * diff;
190 return config.alpha * (std::abs(diff) - 0.5f * config.alpha);
194 inline static const char* Name() {
206 inline static double LossOnPoint(
label_t label,
double score,
const Config& config) {
207 const double x = std::fabs(score - label);
208 const double c = config.fair_c;
209 return c * x - c * c * std::log(1.0f + x / c);
212 inline static const char* Name() {
223 inline static double LossOnPoint(
label_t label,
double score,
const Config&) {
224 const double eps = 1e-10f;
228 return score - label * std::log(score);
230 inline static const char* Name() {
242 inline static double LossOnPoint(
label_t label,
double score,
const Config&) {
243 return std::fabs((label - score)) / std::max(1.0f, std::fabs(label));
245 inline static const char* Name() {
255 inline static double LossOnPoint(
label_t label,
double score,
const Config&) {
256 const double psi = 1.0;
257 const double theta = -1.0 / score;
258 const double a = psi;
259 const double b = -Common::SafeLog(-theta);
260 const double c = 1. / psi * Common::SafeLog(label / psi) - Common::SafeLog(label) - 0;
261 return -((label * theta - b) / a + c);
263 inline static const char* Name() {
267 inline static void CheckLabel(
label_t label) {
278 inline static double LossOnPoint(
label_t label,
double score,
const Config&) {
279 const double epsilon = 1.0e-9;
280 const double tmp = label / (score + epsilon);
281 return tmp - Common::SafeLog(tmp) - 1;
283 inline static const char* Name() {
284 return "gamma-deviance";
286 inline static double AverageLoss(
double sum_loss,
double) {
289 inline static void CheckLabel(
label_t label) {
299 inline static double LossOnPoint(
label_t label,
double score,
const Config& config) {
300 const double rho = config.tweedie_variance_power;
301 const double eps = 1e-10f;
305 const double a = label * std::exp((1 - rho) * std::log(score)) / (1 - rho);
306 const double b = std::exp((2 - rho) * std::log(score)) / (2 - rho);
309 inline static const char* Name() {
Fair loss for regression task.
Definition regression_metric.hpp:201
Definition regression_metric.hpp:273
Definition regression_metric.hpp:250
Huber loss for regression task.
Definition regression_metric.hpp:180
L1 loss for regression task.
Definition regression_metric.hpp:167
L2 loss for regression task.
Definition regression_metric.hpp:132
Mape regression loss for regression task.
Definition regression_metric.hpp:237
The interface of metric. Metric is used to calculate metric result.
Definition metric.h:20
The interface of Objective Function.
Definition objective_function.h:13
Poisson regression loss for regression task.
Definition regression_metric.hpp:218
L2 loss for regression task.
Definition regression_metric.hpp:146
RMSE loss for regression task.
Definition regression_metric.hpp:113
Metric for regression task. Use static class "PointWiseLossCalculator" to calculate loss point-wise.
Definition regression_metric.hpp:16
void Init(const Metadata &metadata, data_size_t num_data) override
Initialize.
Definition regression_metric.hpp:32
std::vector< double > Eval(const double *score, const ObjectiveFunction *objective) const override
Calcaluting and printing metric result.
Definition regression_metric.hpp:52
Definition regression_metric.hpp:294
desc and descl2 fields must be written in reStructuredText format
Definition application.h:10
float label_t
Type of metadata, include weight and label.
Definition meta.h:33
int32_t data_size_t
Type of data size, it is better to use signed type.
Definition meta.h:14