Repository: probabl-ai/skore

Issue:
Adding extra scores
### Describe the bug

I am using [this guide](https://scikit-learn.org/dev/modules/model_evaluation.html#r2-score) to figure out extra metric names for `cross_validate`. However, when I run this: 

```python
from skore import cross_validate

cross_validate(HistGradientBoostingRegressor(), X, y, cv=5, project=my_project, scoring=["neg_mean_absolute_error", "r2", "explained_variance"])
```

Then I see this: 

```python
Traceback (most recent call last):
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/marimo/_runtime/executor.py", line 158, in execute_cell
    return eval(cell.last_expr, glbls)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Cell marimo:///workspaces/solah/overview.py#cell=cell-9, line 3, in <module>
    cross_validate(HistGradientBoostingRegressor(), X, y, cv=5, project=my_project, scoring=["neg_mean_absolute_error", "r2", "explained_variance"])
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/skore/sklearn/cross_validate.py", line 268, in cross_validate
    agg_cross_validation_item = CrossValidationAggregationItem.factory(
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/skore/item/cross_validation_item.py", line 421, in factory
    plot = plot_cross_validation_aggregation(cv_results_items_versions)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/skore/item/cross_validation_item.py", line 167, in plot_cross_validation_aggregation
    df = df.apply(pandas.Series.explode)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/frame.py", line 10374, in apply
    return op.apply().__finalize__(self, method="apply")
           ^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/apply.py", line 916, in apply
    return self.apply_standard()
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/apply.py", line 1068, in apply_standard
    return self.wrap_results(results, res_index)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/apply.py", line 1107, in wrap_results
    return self.wrap_results_for_axis(results, res_index)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/apply.py", line 1219, in wrap_results_for_axis
    result = self.obj._constructor(data=results)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/frame.py", line 778, in __init__
    mgr = dict_to_mgr(data, index, columns, dtype=dtype, copy=copy, typ=manager)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/internals/construction.py", line 503, in dict_to_mgr
    return arrays_to_mgr(arrays, columns, index, dtype=dtype, typ=typ, consolidate=copy)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/internals/construction.py", line 119, in arrays_to_mgr
    arrays, refs = _homogenize(arrays, index, dtype)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/internals/construction.py", line 611, in _homogenize
    val = val.reindex(index, copy=False)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/series.py", line 5153, in reindex
    return super().reindex(
           ^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/generic.py", line 5610, in reindex
    return self._reindex_axes(
           ^^^^^^^^^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/generic.py", line 5633, in _reindex_axes
    new_index, indexer = ax.reindex(
                         ^^^^^^^^^^^
  File "/home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/lib/python3.12/site-packages/pandas/core/indexes/base.py", line 4429, in reindex
    raise ValueError("cannot reindex on an axis with duplicate labels")
ValueError: cannot reindex on an axis with duplicate labels
```

The docs suggest that a list/tuple can be an input, but running the code suggests otherwise. 

### Steps/Code to Reproduce

You can also mock it easily. 

```python
from skore import cross_validate
import numpy as np

cross_validate(HistGradientBoostingRegressor(), np.array([1,2,3,4,5]).reshape(-1, 1), [1,2,3,4,5], cv=3, project=my_project, scoring=("r2", ))
```

### Expected Behavior

No error. 

### Actual Behavior

Error. 

### Environment

```shell
System:
    python: 3.12.1 (main, Sep 30 2024, 17:05:21) [GCC 9.4.0]
executable: /home/codespace/.cache/uv/archive-v0/YOp_16Z6MvqhVvqkrfuya/bin/python
   machine: Linux-6.5.0-1025-azure-x86_64-with-glibc2.31

Python dependencies:
        skore: 0.4.1
          pip: None
   setuptools: None
    diskcache: 5.6.3
      fastapi: 0.115.6
 plotly<6,>=5: None
      pyarrow: 18.1.0
         rich: 13.9.4
        skops: 0.11.0
      uvicorn: 0.32.1
```


Discussion:
github-actions[bot]: <!-- Pytest Coverage Comment: coverage-skore -->
<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/README.md"><img alt="Coverage" src="https://img.shields.io/badge/Coverage-91%25-brightgreen.svg" /></a><details><summary>pytest coverage report </summary><table><tr><th>File</th><th>Stmts</th><th>Miss</th><th>Cover</th><th>Missing</th></tr><tbody><tr><td colspan="5"><b>src/skore</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/__init__.py">\_\_init\_\_.py</a></td><td>18</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/__main__.py">\_\_main\_\_.py</a></td><td>8</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/__main__.py#L 80%"> 80%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/exceptions.py">exceptions.py</a></td><td>4</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>src/skore/cli</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/cli/__init__.py">\_\_init\_\_.py</a></td><td>8</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/cli/cli.py">cli.py</a></td><td>32</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/cli/launch_dashboard.py">launch_dashboard.py</a></td><td>22</td><td>12</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/cli/launch_dashboard.py#L 42%"> 42%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/cli/quickstart_command.py">quickstart_command.py</a></td><td>12</td><td>2</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/cli/quickstart_command.py#L 83%"> 83%</a></td></tr><tr><td colspan="5"><b>src/skore/item</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/__init__.py">\_\_init\_\_.py</a></td><td>22</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/cross_validation_aggregation_item.py">cross_validation_aggregation_item.py</a></td><td>54</td><td>1</td><td>3</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/cross_validation_aggregation_item.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/cross_validation_item.py">cross_validation_item.py</a></td><td>48</td><td>1</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/cross_validation_item.py#L 98%"> 98%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/item.py">item.py</a></td><td>22</td><td>1</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/item.py#L 95%"> 95%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/item_repository.py">item_repository.py</a></td><td>43</td><td>2</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/item_repository.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/media_item.py">media_item.py</a></td><td>60</td><td>4</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/media_item.py#L 93%"> 93%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/numpy_array_item.py">numpy_array_item.py</a></td><td>21</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/numpy_array_item.py#L 92%"> 92%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/pandas_dataframe_item.py">pandas_dataframe_item.py</a></td><td>30</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/pandas_dataframe_item.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/pandas_series_item.py">pandas_series_item.py</a></td><td>30</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/pandas_series_item.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/polars_dataframe_item.py">polars_dataframe_item.py</a></td><td>28</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/polars_dataframe_item.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/polars_series_item.py">polars_series_item.py</a></td><td>23</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/polars_series_item.py#L 93%"> 93%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/primitive_item.py">primitive_item.py</a></td><td>23</td><td>2</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/primitive_item.py#L 91%"> 91%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/sklearn_base_estimator_item.py">sklearn_base_estimator_item.py</a></td><td>29</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/sklearn_base_estimator_item.py#L 94%"> 94%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/skrub_table_report_item.py">skrub_table_report_item.py</a></td><td>10</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/item/skrub_table_report_item.py#L 86%"> 86%</a></td></tr><tr><td colspan="5"><b>src/skore/persistence</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/persistence/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/persistence/abstract_storage.py">abstract_storage.py</a></td><td>22</td><td>1</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/persistence/abstract_storage.py#L 95%"> 95%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/persistence/disk_cache_storage.py">disk_cache_storage.py</a></td><td>33</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/persistence/disk_cache_storage.py#L 95%"> 95%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/persistence/in_memory_storage.py">in_memory_storage.py</a></td><td>20</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>src/skore/project</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/project/__init__.py">\_\_init\_\_.py</a></td><td>4</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/project/create.py">create.py</a></td><td>50</td><td>8</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/project/create.py#L 88%"> 88%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/project/load.py">load.py</a></td><td>23</td><td>3</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/project/load.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/project/project.py">project.py</a></td><td>62</td><td>4</td><td>4</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/project/project.py#L 91%"> 91%</a></td></tr><tr><td colspan="5"><b>src/skore/sklearn</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/__init__.py">\_\_init\_\_.py</a></td><td>3</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/find_ml_task.py">find_ml_task.py</a></td><td>19</td><td>2</td><td>3</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/find_ml_task.py#L 85%"> 85%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/types.py">types.py</a></td><td>2</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>src/skore/sklearn/cross_validation</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/cross_validation/__init__.py">\_\_init\_\_.py</a></td><td>2</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/cross_validation/cross_validation_helpers.py">cross_validation_helpers.py</a></td><td>40</td><td>4</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/cross_validation/cross_validation_helpers.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/cross_validation/cross_validation_reporter.py">cross_validation_reporter.py</a></td><td>27</td><td>2</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/cross_validation/cross_validation_reporter.py#L 90%"> 90%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/cross_validation/plot.py">plot.py</a></td><td>38</td><td>1</td><td>3</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/cross_validation/plot.py#L 92%"> 92%</a></td></tr><tr><td colspan="5"><b>src/skore/sklearn/train_test_split</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/train_test_split.py">train_test_split.py</a></td><td>34</td><td>2</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/train_test_split.py#L 94%"> 94%</a></td></tr><tr><td colspan="5"><b>src/skore/sklearn/train_test_split/warning</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/__init__.py">\_\_init\_\_.py</a></td><td>8</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/high_class_imbalance_too_few_examples_warning.py">high_class_imbalance_too_few_examples_warning.py</a></td><td>17</td><td>3</td><td>2</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/high_class_imbalance_too_few_examples_warning.py#L 78%"> 78%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/high_class_imbalance_warning.py">high_class_imbalance_warning.py</a></td><td>18</td><td>2</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/high_class_imbalance_warning.py#L 88%"> 88%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/random_state_unset_warning.py">random_state_unset_warning.py</a></td><td>11</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/random_state_unset_warning.py#L 87%"> 87%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/shuffle_true_warning.py">shuffle_true_warning.py</a></td><td>9</td><td>0</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/shuffle_true_warning.py#L 91%"> 91%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/stratify_is_set_warning.py">stratify_is_set_warning.py</a></td><td>11</td><td>1</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/stratify_is_set_warning.py#L 87%"> 87%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/time_based_column_warning.py">time_based_column_warning.py</a></td><td>22</td><td>1</td><td>2</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/time_based_column_warning.py#L 89%"> 89%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/train_test_split_warning.py">train_test_split_warning.py</a></td><td>5</td><td>1</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/sklearn/train_test_split/warning/train_test_split_warning.py#L 80%"> 80%</a></td></tr><tr><td colspan="5"><b>src/skore/ui</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/ui/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/ui/app.py">app.py</a></td><td>25</td><td>5</td><td>2</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/ui/app.py#L 71%"> 71%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/ui/dependencies.py">dependencies.py</a></td><td>7</td><td>1</td><td>0</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/ui/dependencies.py#L 86%"> 86%</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/ui/project_routes.py">project_routes.py</a></td><td>85</td><td>5</td><td>2</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/ui/project_routes.py#L 92%"> 92%</a></td></tr><tr><td colspan="5"><b>src/skore/utils</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/utils/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/utils/_show_versions.py">_show_versions.py</a></td><td>29</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>src/skore/view</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/view/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/view/view.py">view.py</a></td><td>5</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/view/view_repository.py">view_repository.py</a></td><td>16</td><td>2</td><td>1</td><td><a href="https://github.com/probabl-ai/skore/blob/03d0d6c21c0494deffa2f6e0b9fc331b577455b6/src/skore/view/view_repository.py#L 83%"> 83%</a></td></tr><tr><td><b>TOTAL</b></td><td><b>1194</b></td><td><b>83</b></td><td><b>91%</b></td><td>&nbsp;</td></tr></tbody></table></details>

| Tests | Skipped | Failures | Errors | Time |
| ----- | ------- | -------- | -------- | ------------------ |
| 172 | 0 :zzz: | 0 :x: | 0 :fire: | 39.198s :stopwatch: |


Patch:
diff --git a/skore/src/skore/item/cross_validation_aggregation_item.py b/skore/src/skore/item/cross_validation_aggregation_item.py
index adfb036..ae29ae9 100644
--- a/skore/src/skore/item/cross_validation_aggregation_item.py
+++ b/skore/src/skore/item/cross_validation_aggregation_item.py
@@ -5,6 +5,7 @@ This class represents the aggregation of several cross-validation runs.
 
 from __future__ import annotations
 
+import contextlib
 from functools import cached_property
 
 import plotly.graph_objects
@@ -36,10 +37,19 @@ def plot_cross_validation_aggregation(
 
     _cv_results = cv_results_items_versions.copy()
 
-    df = pandas.DataFrame([v.cv_results_serialized for v in _cv_results])
-    df = df.drop(columns=["indices", "estimator"], errors="ignore")
-    df = df.apply(pandas.Series.explode)
-    df = df.reset_index(names="run_number")
+    cv_list = [v.cv_results_serialized for v in _cv_results]
+    df_list = []
+    for run, cv in enumerate(cv_list):
+        for key in ["indices","estimator"]:
+            with contextlib.suppress(KeyError):
+                del cv[key]
+
+        df_run = pandas.DataFrame(cv_list[run])
+        df_run = df_run.reset_index(names="fold_number")
+        df_run["run_number"] = run
+        df_list.append(df_run)
+
+    df = pandas.concat(df_list)
 
     # Move time columns to last and "test_score" to first
     if "fit_time" in df.columns:


Test patch:
diff --git a/skore/tests/integration/sklearn/test_cross_validate.py b/skore/tests/integration/sklearn/test_cross_validate.py
index 2f5e1d3..bfc11f0 100644
--- a/skore/tests/integration/sklearn/test_cross_validate.py
+++ b/skore/tests/integration/sklearn/test_cross_validate.py
@@ -8,7 +8,10 @@ from sklearn.ensemble import RandomForestClassifier
 from sklearn.multiclass import OneVsOneClassifier
 from sklearn.svm import SVC
 from skore import CrossValidationReporter
-from skore.item.cross_validation_aggregation_item import CrossValidationAggregationItem
+from skore.item.cross_validation_aggregation_item import (
+    CrossValidationAggregationItem,
+    plot_cross_validation_aggregation,
+)
 from skore.item.cross_validation_item import CrossValidationItem
 
 
@@ -167,6 +170,21 @@ def test_aggregated_cross_validation(rf, in_memory_project):
     CrossValidationAggregationItem.factory(project.get_item_versions("cv"))
 
 
+def test_plot_aggregated_cross_validation(rf, in_memory_project):
+    """Cross-validation runs with different metrics can be aggregated."""
+    project = in_memory_project
+    args = rf
+    reporter1 = CrossValidationReporter(*args)
+    reporter2 = CrossValidationReporter(
+        *args, scoring=["neg_mean_absolute_error", "r2", "explained_variance"]
+    )
+
+    project.put("cv", reporter1)
+    project.put("cv", reporter2)
+
+    plot_cross_validation_aggregation(project.get_item_versions("cv"))
+
+
 def prepare_cv():
     from sklearn import datasets, linear_model