Clarification of output array type when metrics accept multiclass/multioutput

Clarification of how we should handle array output type when a metric outputs several values (i.e. accepts multiclass or multioutput input).

The issue was summarised succinctly in https://github.com/scikit-learn/scikit-learn/pull/30439#issuecomment-2532238196:

> Not sure what should be the output namespace / device in case we output an array, e.g. roc_auc_score with average=None on multiclass problems...

Currently all regression/classification metrics that support array API and multiclass or multioutput, all output an array in the same namespace and device as the input (checked code and manually). Summary of these metrics :

### Regression metrics

Returns array in same namespace/device:
* [explained_variance_score](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.explained_variance_score.html#sklearn.metrics.explained_variance_score)
* [r2_score](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.r2_score.html#sklearn.metrics.r2_score) 
* [mean_absolute_error](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.mean_absolute_error.html#sklearn.metrics.mean_absolute_error)
* [mean_absolute_percentage_error](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.mean_absolute_percentage_error.html#sklearn.metrics.mean_absolute_percentage_error)
* [mean_pinball_loss](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.mean_pinball_loss.html#sklearn.metrics.mean_pinball_loss)
* [mean_squared_error](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.mean_squared_error.html#sklearn.metrics.mean_squared_error)
* [mean_squared_log_error](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.mean_squared_log_error.html#sklearn.metrics.mean_squared_log_error)
* [root_mean_squared_error](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.root_mean_squared_error.html#sklearn.metrics.root_mean_squared_error)
* [root_mean_squared_log_error](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.root_mean_squared_log_error.html#sklearn.metrics.root_mean_squared_log_error)

### Classification metrics
Returns array in same namespace/device:

* [precision_recall_fscore_support](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.precision_recall_fscore_support.html#sklearn.metrics.precision_recall_fscore_support) and family ([f1_score](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.f1_score.html#sklearn.metrics.f1_score), [fbeta_score](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.fbeta_score.html#sklearn.metrics.fbeta_score), [precision_score](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.precision_score.html#sklearn.metrics.precision_score), [recall_score](https://scikit-learn.org/dev/modules/generated/sklearn.metrics.recall_score.html#sklearn.metrics.recall_score))

Looking at the metrics code, if we wanted to support a list of scalars, we'd generally have to do extra processing to convert an array (often output of an xp.** function) to a list of scalars.

Once we arrive at a consensus we should update the array API documentation and update the `check_array_api_metric` in tests such that when the output is array/list - we check that the output type etc is correct.

cc @ogrisel @betatim

COMMENT:
> I think @ogrisel pointed out that returning metrics in the same namespace and device would be useful if they were used within a complete pipeline.

I wouldn't say useful, but less surprising for people who expect scikit-learn to behave more than other array API consuming libraries such as SciPy: in SciPy the general contract for array API capable functions is: namespace in, namespace out.

Our metric functions would not follow this contract. But as team said, I don't really see the case where it would be beneficial to stay in the original namespace. The metric values will not be used as inputs for any kind of complex computation but rather be displayed in jupyter cell outputs (after some simple post-processing such as rounding to remove non-significant digits or computing some simple summary/descriptive statistics such as mean, standard deviation, quantiles and co), or plotted with matplotlib and friends.

> So basically if you train models using HuggingFace and you want to compute metrics you need to move the arrays to cpu and convert to numpy before this can be done.

So you mean that huggingface's trainer pytorch support automatically convert metric values to numpy on CPU so scikit-learn doing the same would not feel odd in that respect?

Labels: Needs Decision, Array API