-
Notifications
You must be signed in to change notification settings - Fork 0
Metrics 0.2.0 rocauc multiclass
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.
Area under the ROC curve for more than two classes, by reducing to binary problems.
public static double MultiClass(ReadOnlySpan<int> yTrue, ReadOnlySpan<double> yScore, int classCount, MultiClassRocOptions options = default)Parameters — yTrue holds one true label per sample. yScore holds the class probabilities
row-major — sample 0's classes, then sample 1's — so its length is classCount times the sample
count, and each row must sum to 1. classCount is how many classes each row scores. options
carries the strategy, the averaging, the label set, the sample weights and the worker count;
default is scikit-learn's own defaults, on one thread.
Returns — double in [0, 1], larger meaning a better ranking.
Exceptions — ArgumentException when any of the shape rules is broken — a length that does
not
match, a row that does not sum to 1, a NaN, a sample weight under one-vs-one;
ArgumentOutOfRangeException when classCount is below two or
MultiClassRocOptions.MaxDegreeOfParallelism is negative.
Example — six samples over three classes, one probability row each.
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,
];
double auc = RocAuc.MultiClass(yTrue, yScore, 3); // => 0.7824…Remarks — a separate method rather than an overload of RocAuc.Score, because the two
parameter
lists would be indistinguishable to the C# compiler and a call like Score(y, s, 3) would stop
compiling in consumer code. Everything optional lives in MultiClassRocOptions.
Three traps, and the first two are about the shape of yScore. It is probabilities, not
scores:
each row has to sum to 1, and the call refuses it otherwise, so a raw logit or a decision-function
output has to go through a softmax first. And it is row-major — one sample's classes are
contiguous — which is the transpose of what you get from a column-per-class table; there is no
two-dimensional overload because a span cannot carry one.
The third is the class-to-column mapping. With Labels left empty the columns are matched to the
sorted distinct labels of yTrue, so a class the model knows about but this evaluation set
happens
not to contain will shift every later column. Pass MultiClassRocOptions.Labels whenever the
label
set comes from the model rather than from the data.
The exception behaviour is worth one line for anyone raising MaxDegreeOfParallelism: the
parallel
path rethrows the original exception instance — same type, message and ParamName, from the
lowest-numbered class or pair that failed — so a catch written against the sequential path keeps
working, and no AggregateException ever escapes.
Applies to — net10.0, netstandard2.0.
See also — RocAuc.Score, MultiClassRocOptions, MultiClassStrategy,
decision 0018,
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