41namespace multi_metrics_ {
48inline std::tuple<int, int, int, int> all_metrics_(
const std::vector<double>& y,
49 const std::vector<double>& y_pred) {
50 assert(y.size() == y_pred.size());
51 int tp = 0, tn = 0, fp = 0, fn = 0;
52 for (
size_t i = 0; i < y.size(); i++) {
53 if (y_pred[i] == y[i] && y[i] == 1) {
55 }
else if (y_pred[i] == y[i] && y[i] == 0) {
57 }
else if (y_pred[i] != y[i] && y[i] == 1) {
59 }
else if (y_pred[i] != y[i] && y[i] == 0) {
64 return {tp, tn, fp, fn};
72inline double recall(
const std::vector<double>& y,
const std::vector<double>& y_pred) {
73 auto [tp, tn, fp, fn] = multi_metrics_::all_metrics_(y, y_pred);
74 return 1.0 * (tp) / (tp + fn);
81inline double accuracy_score(
const std::vector<double>& y,
const std::vector<double>& y_pred) {
82 auto [tp, tn, fp, fn] = multi_metrics_::all_metrics_(y, y_pred);
83 return 1.0 * (tp + tn) / (tp + tn + fp + fn);
90inline double precision(
const std::vector<double>& y,
const std::vector<double>& y_pred) {
91 auto [tp, tn, fp, fn] = multi_metrics_::all_metrics_(y, y_pred);
92 return 1.0 * tp / (tp + fp);
99inline double f1_score(
const std::vector<double>& y,
const std::vector<double>& y_pred) {
100 auto [tp, tn, fp, fn] = multi_metrics_::all_metrics_(y, y_pred);
102 return 2.0 * (prec * rec) / (prec + rec);
112 assert(x.size() == y.size());
115 for (
size_t i = 0; i < x.size(); i++) {
116 _dist += std::powf(y[i] - x[i], 2);
119 return std::sqrt(_dist);
129 assert(x.size() == y.size());
132 for (
size_t i = 0; i < x.size(); i++) {
133 _dist += std::abs(y[i] - x[i]);
148 assert(x.size() == y.size());
151 for (
size_t i = 0; i < x.size(); i++) {
152 _dist += std::abs(y[i] - x[i]);
155 return std::powf(_dist, 1.0 / p);
165inline double mean_squared_error(std::vector<double>
const& y, std::vector<double>
const& y_hat) {
166 assert(y.size() == y_hat.size());
169 for (
size_t i = 0; i < n; i++) {
170 mse += powf(y[i] - y_hat[i], 2);
172 return mse / double(n);
181inline double root_mean_squared_error(std::vector<double>
const& y,
182 std::vector<double>
const& y_hat) {
183 return std::sqrt(mean_squared_error(y, y_hat));
192inline double mean_absolute_error(std::vector<double>
const& y, std::vector<double>
const& y_hat) {
193 assert(y.size() == y_hat.size());
196 for (
size_t i = 0; i < n; i++) {
197 mae += std::abs(y[i] - y_hat[i]);
199 return mae / double(n);
228inline double binary_crossentropy_loss(std::vector<double>
const& y,
229 std::vector<double>
const& y_hat) {
230 assert(y.size() == y_hat.size());
232 assert(x == 0.0 || x == 1.0);
236 double bce = 0.0, eps = 1e-15;
237 for (
size_t i = 0; i < n; i++) {
238 double prob = _metrics_utils::sigmoid(y_hat[i]);
239 double clipped_y_hat = std::clamp(prob, eps, 1 - eps);
240 bce += (y[i] * log(clipped_y_hat) + (1 - y[i]) * log(1 - clipped_y_hat));
242 return -bce / double(n);
double f1_score(const std::vector< double > &y, const std::vector< double > &y_pred)
f1 score function: [2 * precision * recall / precision + recall]
Definition metrics.h:99
double accuracy_score(const std::vector< double > &y, const std::vector< double > &y_pred)
accuracy score function[(tp + tn) / (tp + tn + fp + fn)]
Definition metrics.h:81