-
Notifications
You must be signed in to change notification settings - Fork 0
Metrics 0.3.0 averageprecision score
Lodestar.Metrics 0.3.0. This page is frozen at that release. Read the current documentation for what
mainsays now. A link to a decision or a migration page followsmain, and leaves the archive.
The step sum over the precision-recall curve — sklearn.metrics.average_precision_score, binary or
over a label matrix.
public static double Score(ReadOnlySpan<int> yTrue, ReadOnlySpan<double> yScore, int posLabel = 1, ReadOnlySpan<double> sampleWeight = default)
public static double Score(ReadOnlySpan<bool> yTrue, ReadOnlySpan<double> yScore, int labelCount, Averaging averaging = Averaging.Macro, ReadOnlySpan<double> sampleWeight = default)Parameters — the binary overload takes yTrue, one label per sample, and yScore, one score
per sample: the higher, the more the model believes posLabel. posLabel is the label counted as
positive, 1 by default — scikit-learn infers it from the labels present, and this asks instead.
The matrix overload takes yTrue as one boolean per label per sample and yScore of the same
shape, both row-major with labelCount values per row, and averaging decides how the per-label
scores are combined. sampleWeight is one weight per sample — per row, not per label — or
empty, the default, to weight every sample by 1.
Returns — double in [0, 1] for non-negative weights. 1 when every positive sample outranks
every negative one.
0 when no sample carries posLabel. scikit-learn warns "No positive class found in y_true,
recall is set to one for all thresholds" and returns a value rather than refusing, and that value is
reproduced here — where RocAuc.Score on the same walk throws,
because a ROC area genuinely has no value without both classes and this has one.
Exceptions — ArgumentException when yTrue and yScore disagree in length, when they are
empty, when a score is NaN, or — on the matrix overload — when labelCount is below 1, when
yTrue is not a whole number of rows of labelCount, or when a non-empty sampleWeight is not one
per row. ArgumentOutOfRangeException when averaging is Averaging.Binary, which scores one
positive label of two and has no meaning over a matrix, or is not a declared member at all.
Example — the worked binary case, where the sum and the trapezoid part company.
using Lodestar.Metrics;
int[] truth = [0, 0, 1, 1];
double[] scores = [0.1, 0.4, 0.35, 0.8];
double ap = AveragePrecision.Score(truth, scores); // => 0.8333…The trapezoid over the same curve is 0.7916…. And the same two samples over three labels, as a
matrix:
using Lodestar.Metrics;
bool[] relevant = [true, false, false, false, false, true];
double[] labelScores = [0.75, 0.5, 1.0, 1.0, 0.2, 0.1];
double macro = AveragePrecision.Score(relevant, labelScores, labelCount: 3); // => 0.3333…Two of the three labels score 0.5 and the third is carried by no sample and scores 0, so the
plain mean is 0.3333…. Averaging.Weighted gives 0.5 on the same input, because the empty
column carries no positive weight and drops out of the average.
Remarks — three weight vectors take the answer outside what either side defines, and all six numbers below are measured rather than reasoned about.
| input | scikit-learn 1.9.0 | here |
|---|---|---|
a weight vector summing to zero, [1, 1, 1, -3]
|
0.5, through a numpy "divide by zero encountered" warning |
-0 |
every weight 0
|
ValueError, "Sample weights must contain at least one non-zero number." |
0 |
a posLabel no sample carries |
ValueError, "pos_label=7 is not a valid label." |
0 |
The first two are the same defect seen twice: the running total of weight reaches zero, and the
precision at that threshold is a division the reference performs under a warning and this one
guards. The third is the package's standing position rather than an accident — posLabel is a
parameter here where scikit-learn infers it, so a label no sample carries is the no-positive case
and answers 0, exactly as TopKAccuracy.Score accepts a class no sample
carries. A negative weight that leaves the total positive is accepted by both and agrees:
[-1, 2, 1, 1] scores 0.75 on either side.
Applies to — net10.0, netstandard2.0.
See also — AveragePrecision.PerLabel,
RocAuc.Score,
LabelRankingAveragePrecision.Score, the
Python equivalence table.
- 0001-target-framework
- 0002-unicode-comparison-unit
- 0003-provenance-and-licensing
- 0004-levenshtein-myers-backlog
- 0005-hamming-jellyfish-divergence
- 0006-ratcliff-autojunk
- 0007-metaphone-scope
- 0008-italian-enza-nltk-divergence
- 0009-sample-consumes-a-local-feed
- 0010-stop-word-list-provenance
- 0011-persistence-format
- 0012-per-package-versioning
- 0013-sentencepiece-parity-scope
- 0014-precompiled-normalizer
- 0015-sonar-rules-in-the-build
- 0016-metrics-package-placement
- 0017-bpe-parity-scope
- 0018-multiclass-roc-auc-parallelism-is-opt-in
- 0019-the-net-analysers-run-in-the-build-too
- 0020-normalize-is-a-projection-not-a-parameter
- 0021-multioutput-is-a-method-not-an-enum
- 0022-added-token-matching-flags
- 0023-byte-level-decode-substitutes
- 0024-weighted-median-averages-within-scikit-learns-epsilon
- 0025-quickselect-replaces-a-full-sort-for-the-median
- 0026-r2-and-explainedvariance-split-their-undefined-cases-differently
- 0027-r2-and-explainedvariance-vectorize-only-a-single-output
- 0028-log1p-is-kahans-identity-not-math-log-1-plus-x
- 0029-balanced-accuracy-adjusted-is-left-to-ieee-754-at-the-edge
- 0030-cohen-kappa-keeps-scikit-learns-expected-matrix-orientation
- 0031-nosamplecorrect-mirrors-numpys-float64-upcast
- 0032-fbeta-substitutes-tp-predicted-and-support-algebraically
- 0033-compensated-sum-is-neumaiers-variant
- 0034-dropout-is-refused-for-want-of-a-user
- 0035-a-null-pre-split-is-removed-with-invert-not-isolated
- 0036-a-member-may-ship-without-an-oracle-if-it-says-so
- 0037-the-guards-run-before-the-commit
- 0038-the-gate-confronts-an-exception-tag-with-the-page-that-documents-it
- 0039-mutual-information-returns-zero-on-an-empty-input
- 0040-a-curve-is-a-sealed-class-per-curve
- 0041-one-sample-file-per-public-class
- 0042-phonetic-encoders-refuse-a-null-word
- 0043-the-equality-table-is-sized-to-the-pattern
- 0044-compression-belongs-to-the-caller
- 0045-a-console-call-carries-its-reason-on-the-line
- 0046-check-adr-immutable-runs-in-ci-only
- 0047-one-gate-per-kernel-not-one-per-alphabet
- 0048-the-gate-depends-on-the-kernel-and-the-alphabet
- 0049-two-gates-per-kernel-tested-where-the-width-is-known
- 0050-the-sentencepiece-bpe-lineage-stays-a-bpe-model
- benchmark_latest
- decisions
- equivalence
- matplotlib
- migration
- nightly_run
- numpy
- pandas
- performance
- pytorch
- seaborn
- sklearn
- statsmodels