-
Notifications
You must be signed in to change notification settings - Fork 0
Metrics multiclassstrategy
ROC-AUC is defined for two classes. This says how a problem with more gets reduced to problems with two.
public enum MultiClassStrategy { OneVsRest, OneVsOne }Members — OneVsRest scores each class against everything else and averages the results.
OneVsOne scores every pair of classes against each other and averages those, the Hand and Till
formulation.
Example — the two on the same scores; see MultiClassRocOptions for the data.
using Lodestar.Metrics;
int[] yTrue = [0, 1, 2, 2, 2, 1];
double[] yScore =
[
0.6, 0.3, 0.1,
0.3, 0.5, 0.2,
0.2, 0.5, 0.3,
0.1, 0.2, 0.7,
0.4, 0.4, 0.2,
0.2, 0.3, 0.5,
];
MultiClassRocOptions oneVsRest = new() { Strategy = MultiClassStrategy.OneVsRest };
MultiClassRocOptions oneVsOne = new() { Strategy = MultiClassStrategy.OneVsOne };
double rest = RocAuc.MultiClass(yTrue, yScore, 3, oneVsRest); // => 0.7824…
double pairs = RocAuc.MultiClass(yTrue, yScore, 3, oneVsOne); // => 0.8194…Remarks — OneVsRest is the default and the cheaper of the two: it runs one binary problem
per
class, so k of them, and it is the one whose per-class numbers you can also look at
individually.
OneVsOne runs k(k-1)/2 binary problems, and its selling point is that each pair is judged
without the other classes' samples in the way, which makes it insensitive to how common the
classes
are.
The trap is comparing the two numbers, as above: 0.7824… and 0.8194… are the same model on the
same scores, and neither is more correct. Pick one, and say which one the number is.
SampleWeight is refused with OneVsOne — scikit-learn refuses it too, because a pairwise
average
has no agreed weighting.
Applies to — net10.0, netstandard2.0.
See also — RocAuc.MultiClass, MultiClassRocOptions,
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