-
Notifications
You must be signed in to change notification settings - Fork 0
Metrics rootmeansquarederror score
The square root of the mean squared error, taken per output before the outputs are reduced.
public static double Score(ReadOnlySpan<double> yTrue, ReadOnlySpan<double> yPred, int outputCount = 1, ReadOnlySpan<double> sampleWeight = default, ReadOnlySpan<double> outputWeights = default)Parameters — yTrue and yPred are the true and predicted values, row-major when there is
more
than one output. outputCount is how many outputs each row holds, sampleWeight weights the
rows,
and outputWeights weights the outputs in the reduction.
Returns — double, never negative, 0 only for an exact prediction. In the target's own
units.
Exceptions — ArgumentException when a length disagrees with the shape, the input is empty,
or
it holds a non-finite value; ArgumentOutOfRangeException when outputCount is below one.
Example — two outputs, showing that the root is taken per output: taking it after the reduction instead gives a different number.
using System;
using Lodestar.Metrics;
double[] yTrue = [0.5, 1.0, -1.0, 1.0, 7.0, -6.0];
double[] yPred = [0.0, 2.0, -1.0, 2.0, 8.0, -5.0];
double rootThenMean = RootMeanSquaredError.Score(yTrue, yPred, outputCount: 2); // => 0.8227…
double meanThenRoot = Math.Sqrt(MeanSquaredError.Score(yTrue, yPred, outputCount: 2)); // => 0.8416…Remarks — this is the number to report. It is in the same units as the target, so "the model
is
out by about 0.6 metres" is a sentence, and it is still dominated by large errors the way squared
error is — which is usually what you want a headline number to be. Beside
MeanAbsoluteError.Score
it also carries information: the gap between the two grows with the spread of the errors, so
RootMeanSquaredError.Score much larger than mean absolute error says the errors are uneven
rather
than uniformly middling.
A type of its own rather than a flag on MeanSquaredError, because scikit-learn deprecated
mean_squared_error(squared=False) in 1.4 and removed it in 1.6 in favour of a second function; a
squared parameter here would transcribe an API that no longer exists.
The trap is the order of operations on more than one output, which the example measures: the root is taken per output and the reduction runs on the roots. That is scikit-learn's order, and it is not the same number as the root of the reduced mean squared error whenever the outputs differ. On one output the two coincide, which is why the difference goes unnoticed until a multioutput target appears.
Applies to — net10.0, netstandard2.0.
See also — RootMeanSquaredError.PerOutput, MeanSquaredError.Score,
MeanAbsoluteError.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