Metrics fbeta score - CyrilB1531/lodestar GitHub Wiki
Development build. This page describes
main, not a released package. The latest published Lodestar.Metrics is 0.4.0 β read its documentation.
Home βΊ Metrics βΊ Classification metrics
The weighted harmonic mean of precision and recall, beta being what recall is worth relative to
precision.
public static double Score(ConfusionMatrix cm, double beta, Averaging average = Averaging.Binary, int posLabel = 1, ZeroDivision zeroDivision = ZeroDivision.Zero)
public static double Score(ReadOnlySpan<int> yTrue, ReadOnlySpan<int> yPred, double beta, Averaging average = Averaging.Binary, int posLabel = 1, ZeroDivision zeroDivision = ZeroDivision.Zero, ReadOnlySpan<int> labels = default, ReadOnlySpan<double> sampleWeight = default)Parameters β cm is a matrix already counted, or pass yTrue and yPred. beta is the
weight
of recall relative to precision and must be finite and non-negative. average reduces the
per-class
scores, posLabel is the class reported under Averaging.Binary, zeroDivision decides an
undefined score, labels fixes the label set and its order, and sampleWeight weights the
samples.
Returns β double in [0, 1], larger meaning better.
Exceptions β ArgumentOutOfRangeException when beta is negative or NaN β positive infinity scores the recall, as fbeta_score does
(#1466) β and when beta is finite but its
square overflows, past βdouble.MaxValue β 1.3407807929942596e154, where fbeta_score's beta ** 2
raises OverflowError (#1540);
ArgumentNullException when cm is null; ArgumentException when Averaging.Binary meets
more than two classes, or two without posLabel β an absent positive class takes the zeroDivision
value instead, and labels is not read on a binary target β or sampleWeight holds a non-finite value or is zero throughout; UndefinedMetricException when the metric is
undefined and zeroDivision is ZeroDivision.Throw.
Example β the same filter scored twice: once as if a missed spam cost twice a false alarm, once the other way round.
using Lodestar.Metrics;
int[] yTrue = [1, 1, 1, 1, 0, 0, 0, 0];
int[] yPred = [1, 1, 0, 0, 1, 0, 0, 0];
double recallHeavy = FBeta.Score(yTrue, yPred, 2.0); // => 0.5263β¦
double precisionHeavy = FBeta.Score(yTrue, yPred, 0.5); // => 0.625Remarks β beta has a reading that makes it easy to choose: it is how many times more you
care
about recall than about precision. beta = 2 is the standard "a miss is worse than a false alarm"
setting β screening for a disease, catching fraud β and beta = 0.5 the standard opposite, where
a
false alarm is the expensive one, as in a filter that deletes mail. beta = 1 is exactly F1,
and
F1.Score is the same call with the argument spelled into the name.
The two numbers above are the whole idea in one line: the recall-heavy score is below F1 because this filter's recall is its weak side, and the precision-heavy score is above it.
Two traps. beta = 0 is legal and collapses the metric to plain precision, which is a surprising
amount of nothing to get from a call that looks like it is measuring both; if that is what you
want,
say Precision.Score so the reader knows. And scikit-learn accepts beta = inf β the limit that
collapses to recall β where this refuses it with ArgumentOutOfRangeException; use
Recall.Score.
Applies to β net10.0, netstandard2.0.
See also β FBeta.PerClass, F1.Score, Precision.Score, Recall.Score,
the Python equivalence table.