-
Notifications
You must be signed in to change notification settings - Fork 0
Metrics 0.2.0 averaging
Lodestar.Metrics 0.2.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.
A per-class metric gives one number per class. This says how those numbers become one.
public enum Averaging { Binary, Micro, Macro, Weighted }Members — Binary reports the positive class only, and is the default because it is
scikit-learn's; it is valid only when there are two classes. Micro pools the true positives,
false positives and false negatives over every class and divides once. Macro takes the plain
unweighted mean of the per-class scores. Weighted takes the mean weighted by each class's
support.
Example — the same predictions read three ways.
using Lodestar.Metrics;
int[] yTrue = [0, 0, 1, 1, 2, 2, 2];
int[] yPred = [0, 1, 1, 1, 2, 2, 0];
double macro = Precision.Score(yTrue, yPred, Averaging.Macro); // => 0.7222…
double weighted = Precision.Score(yTrue, yPred, Averaging.Weighted); // => 0.7619…
double micro = Precision.Score(yTrue, yPred, Averaging.Micro); // => 0.7142…Remarks — the choice between Macro and Weighted is a choice about what a class is worth.
Macro says every class counts once, so a class with three samples moves the score as much as one
with three thousand — which is what you want when the rare classes are the interesting ones, and
misleading when they are noise. Weighted says every sample counts once, which keeps the score
close to what a user experiences and lets a rare class be ignored entirely.
Micro is the odd one. Pooling the counts before dividing makes micro-precision, micro-recall and
micro-F1 all equal to each other and, when every class is included, all equal to accuracy — the
0.7142… above is exactly Accuracy.Score on the same data. It is worth computing only when an
explicit label subset has left some samples out, which is the case it exists for.
Two traps. Binary is the default, so a call written for two classes and later fed three
throws
rather than silently averaging; that is deliberate, and the fix is to name the averaging you
meant.
And scikit-learn's average=None has no member here: it changes the return type rather than the
value, so it is a separate method — Precision.PerClass and its siblings.
Applies to — net10.0, netstandard2.0.
See also — Precision.Score, Precision.PerClass, BalancedAccuracy.Score,
the Python equivalence table.
| Member | What it does |
|---|
- 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