-
Notifications
You must be signed in to change notification settings - Fork 0
Metrics confusionmatrix compute
Development build. This page describes
main, not a released package. The latest published Lodestar.Metrics is 0.3.0 — read its documentation.
Counts the samples into a table whose rows are true labels and whose columns are predicted ones.
public static ConfusionMatrix Compute(ReadOnlySpan<int> yTrue, ReadOnlySpan<int> yPred, ReadOnlySpan<int> labels = default, ReadOnlySpan<double> sampleWeight = default)Parameters — yTrue and yPred are the true and predicted labels, one per sample and the
same
length. labels fixes which labels get a row and a column, and in what order; omit it for the
sorted union of both inputs. sampleWeight gives each sample its own weight, so a cell holds a
weight rather than a count.
Returns — a ConfusionMatrix, whose Labels gives the row and column order, whose indexer
reads a cell, and whose TotalWeight is what it counted.
Exceptions — ArgumentException when the spans disagree in length, are empty, contain
duplicate
labels, or no supplied label occurs in yTrue.
Example — the four cells of the spam filter, read by index.
using Lodestar.Metrics;
int[] yTrue = [1, 1, 1, 1, 0, 0, 0, 0];
int[] yPred = [1, 1, 0, 0, 1, 0, 0, 0];
ConfusionMatrix cm = ConfusionMatrix.Compute(yTrue, yPred);
double missed = cm[1, 0]; // => 2
double caught = cm[1, 1]; // => 2
double falseAlarms = cm[0, 1]; // => 1Remarks — compute this once and pass it to every metric you are reporting. All of Accuracy,
Precision, Recall, F1, FBeta, BalancedAccuracy, CohenKappa, MatthewsCorrelation and
ClassificationReport have an overload that takes it, and the counting pass is the expensive
part.
Two properties of the shape are worth fixing in your head, because both directions exist in the
wild. Rows are truth, columns are prediction — scikit-learn's orientation, and the transpose
of
what some textbooks draw. And the index is a position in Labels, not a label value: on labels
[3, 7], cm[0, 1] means "truly 3, predicted 7". Labels is the sorted union when labels was
omitted, and the caller's order left unsorted when it was given, which is also scikit-learn's
rule and the one that lets a diagonal be moved on purpose.
Cells are double rather than int because sampleWeight exists. Unweighted counts stay exact
up
to 2^53, so nothing is lost by it.
The trap is labels as a filter. A sample whose true or predicted label falls outside the set is
not counted anywhere — not in a row, not in a total — so the matrix's TotalWeight can be
less
than the number of samples you passed, and every metric read off it inherits that. That is
confusion_matrix(labels=…)'s own behaviour; it just surprises people who expected a filter on
rows
rather than on samples.
Applies to — net10.0, netstandard2.0.
See also — ConfusionMatrix.ToArray, Normalization, ClassificationReport.Compute,
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