10binaryRocAuc(
const Eigen::VectorXd& scores,
const Eigen::VectorXd& labels)
12 int n = scores.rows();
13 std::vector<std::pair<double, bool>> pairs(n);
15 for (
int i = 0; i < n; ++i) {
16 pairs[i] = { scores(i), labels(i) > 0.5 };
19 std::sort(pairs.begin(), pairs.end(), [](
const auto& a,
const auto& b) {
20 return a.first > b.first;
23 int pos_count = labels.sum();
24 int neg_count = n - pos_count;
26 if (pos_count == 0 || neg_count == 0)
30 double fp = 0, tp = 0;
31 double fp_prev = 0, tp_prev = 0;
33 for (
size_t i = 0; i < pairs.size(); ++i) {
34 if (pairs[i].second) {
40 if (i < pairs.size() - 1 && pairs[i].first != pairs[i + 1].first) {
41 double fp_rate = fp / neg_count;
42 double tp_rate = tp / pos_count;
43 auc += (fp_rate - fp_prev) * (tp_rate + tp_prev) * 0.5;
49 auc += (1 - fp_prev) * (1 + tp_prev) * 0.5;
10binaryRocAuc(
const Eigen::VectorXd& scores,
const Eigen::VectorXd& labels) {
…}
54rocAuc(
const Eigen::MatrixXd& scores,
const Eigen::MatrixXd& labels)
56 int n = scores.rows();
57 int m = scores.cols();
60 if (scores.rows() != labels.rows() || scores.cols() != labels.cols()) {
61 throw std::invalid_argument(
"scores and labels dimensions must match");
70 double total_auc = 0.0;
71 int valid_classes = 0;
73 for (
int c = 0; c < m; ++c) {
75 Eigen::VectorXd class_scores = scores.col(c);
79 Eigen::VectorXd binary_labels = Eigen::VectorXd::Zero(n);
80 for (
int i = 0; i < n; ++i) {
81 binary_labels(i) = (labels(i, c) > 0.5) ? 1.0 : 0.0;
85 if (binary_labels.sum() == 0 || binary_labels.sum() == n) {
93 return valid_classes > 0 ? total_auc / valid_classes : 0.5;
54rocAuc(
const Eigen::MatrixXd& scores,
const Eigen::MatrixXd& labels) {
…}
96std::function<bool(
double,
double)>
99 return [
this](
double a,
double b) {
return this->
isWorse(a, b); };
128 const Eigen::MatrixXd& y,
129 const std::unique_ptr<Loss>&)
const
131 return (y - eta).squaredNorm() / y.rows();
136 const Eigen::MatrixXd& y,
137 const std::unique_ptr<Loss>&)
const
139 return (y - eta).cwiseAbs().mean();
144 const Eigen::MatrixXd& y,
145 const std::unique_ptr<Loss>& loss)
const
147 Eigen::MatrixXd y_pred = loss->predict(eta);
150 Eigen::MatrixXd comparison = (y_pred.array() == y.array()).cast<double>();
151 return comparison.sum() / y.rows();
156 const Eigen::MatrixXd& y,
157 const std::unique_ptr<Loss>& loss)
const
159 Eigen::MatrixXd y_pred = loss->predict(eta);
160 Eigen::MatrixXd comparison = (y_pred.array() == y.array()).cast<double>();
161 return 1 - comparison.sum() / y.rows();
166 const Eigen::MatrixXd& y,
167 const std::unique_ptr<Loss>& loss)
const
169 return loss->deviance(eta, y);
174 const Eigen::MatrixXd& y,
175 const std::unique_ptr<Loss>& loss)
const
177 Eigen::MatrixXd probs = loss->inverseLink(eta);
181std::unique_ptr<Score>
185 return std::make_unique<MSE>();
187 return std::make_unique<MAE>();
188 if (metric ==
"accuracy")
189 return std::make_unique<Accuracy>();
190 if (metric ==
"misclass")
191 return std::make_unique<MisClass>();
192 if (metric ==
"deviance")
193 return std::make_unique<Deviance>();
195 return std::make_unique<AUC>();
197 throw std::invalid_argument(
"Unknown metric: " + metric);
double eval(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const std::unique_ptr< Loss > &loss) const override
double eval(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const std::unique_ptr< Loss > &loss) const override
double eval(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const std::unique_ptr< Loss > &loss) const override
double eval(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const std::unique_ptr< Loss > &) const override
double eval(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const std::unique_ptr< Loss > &) const override
bool isWorse(double a, double b) const override
double initValue() const override
double initValue() const override
bool isWorse(double a, double b) const override
double eval(const Eigen::MatrixXd &eta, const Eigen::MatrixXd &y, const std::unique_ptr< Loss > &loss) const override
std::function< bool(double, double)> getComparator() const
virtual bool isWorse(double other, double current) const =0
static std::unique_ptr< Score > create(const std::string &metric)
Definitions of constants used in libslope.
constexpr double POS_INF
Representation of positive infinity using maximum double value.
constexpr double NEG_INF
Representation of negative infinity using lowest double value.
Namespace containing SLOPE regression implementation.
double binaryRocAuc(const Eigen::VectorXd &scores, const Eigen::VectorXd &labels)
double rocAuc(const Eigen::MatrixXd &scores, const Eigen::MatrixXd &labels)
Scoring metrics for model evaluation.