-
Notifications
You must be signed in to change notification settings - Fork 0
Metrics pinballloss score
Development build. This page describes
main, not a released package. The latest published Lodestar.Metrics is 0.3.0 — read its documentation.
The mean pinball loss at the quantile alpha.
public static double Score(ReadOnlySpan<double> yTrue, ReadOnlySpan<double> yPred, double alpha = 0.5, 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. alpha is the quantile being scored, in [0, 1], 0.5 by default.
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, or
alpha is outside [0, 1] — including NaN.
Example — the same four predictions, scored at the median and at the 90th percentile. The model over-predicts twice and under-predicts twice, so asking for a high quantile forgives it.
using Lodestar.Metrics;
double[] yTrue = [3.0, -0.5, 2.0, 7.0];
double[] yPred = [2.5, 0.0, 2.0, 8.0];
double median = PinballLoss.Score(yTrue, yPred); // => 0.25
double ninetieth = PinballLoss.Score(yTrue, yPred, 0.9); // => 0.15Remarks — this is the metric for prediction intervals rather than point forecasts. If you
are
training a model to output "the 90th percentile of tomorrow's demand", no symmetric error can
score
it: the model is supposed to over-predict most of the time, and mean absolute error would punish
it
for doing its job. Pinball loss charges an under-prediction alpha per unit and an
over-prediction
1 - alpha, so it is minimised exactly by the true quantile.
alpha = 0.5 charges both sides at 0.5, which makes it precisely half the mean absolute error
—
0.25 above against MeanAbsoluteError.Score's 0.5. That factor of two is not a normalization
anyone chose; it falls out of the definition, and it means the default is not interchangeable with
mean absolute error even though it ranks models identically.
Two traps. alpha is the quantile you asked the model for, not a tuning knob: scoring a median
forecast at alpha = 0.9 produces a smaller number and tells you nothing. And the number is only
comparable between models asked for the same quantile — a 0.9 loss and a 0.5 loss on the same
data
are different scales, as the example shows.
The name drops Python's mean_ prefix to match the other ten types here; alpha outside [0, 1]
raises ArgumentOutOfRangeException where scikit-learn raises InvalidParameterError.
Applies to — net10.0, netstandard2.0.
See also — PinballLoss.PerOutput, MeanAbsoluteError.Score, MedianAbsoluteError.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