ENH: Add overlay_dx_score metric for regression evaluation

### Describe the workflow you want to enable

## Current Problem

When evaluating regression models, especially for time series forecasting, existing metrics (MAE, RMSE, R²) don't capture how well predictions align visually with actual values across different tolerance levels.

## Desired Workflow
```python
from sklearn.metrics import overlay_dx_score
from sklearn.model_selection import cross_val_score

# Simple evaluation
score = overlay_dx_score(y_true, y_pred)

# Cross-validation with custom scorer
from sklearn.metrics import make_scorer
scorer = make_scorer(overlay_dx_score)
scores = cross_val_score(model, X, y, scoring=scorer, cv=5)

# GridSearchCV
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(model, param_grid, scoring=scorer)
grid.fit(X, y)
```

## Use Cases

1. Time series forecasting evaluation where visual alignment matters
2. Scenarios where outlier sensitivity of MSE/RMSE is problematic
3. Understanding prediction quality at multiple tolerance levels
4. Model selection when alignment is more important than absolute error


## Proposed Implementation

Add `overlay_dx_score()` function to `sklearn.metrics`.

### Function Signature
```python
def overlay_dx_score(y_true, y_pred, *,
                     sample_weight=None,
                     multioutput='uniform_average',
                     max_percentage=100.0,
                     min_percentage=0.1,
                     step=0.1):
    """
    Overlay DX metric for evaluating regression predictions.
    
    Measures alignment by computing area under curve showing percentage 
    of predictions within tolerance intervals of varying sizes.
    
    Returns float between 0 and 1, higher is better.
    """
```

### How It Works

1. Define tolerance intervals as percentages of the data range
2. For each tolerance level, compute percentage of predictions within tolerance
3. Calculate area under the resulting curve
4. Normalize by maximum possible area

### Mathematical Formula
```
overlay_dx = A / A_max
```

where:
- A = area under the overlay percentage curve
- A_max = maximum possible area (max_percentage × 100)

### Key Features

- Supports `sample_weight` (sklearn standard)
- Supports `multioutput` regression
- Less sensitive to outliers than MSE/RMSE
- Provides interpretable score (0 to 1 range)

### Implementation Details

- Pure NumPy implementation, no external dependencies
- Vectorized operations for efficiency
- Follows sklearn API conventions
- Complete numpydoc documentation
- 95%+ test coverage ready

## References

- Repository: https://github.com/Smile-SA/overlay_dx
- Currently used internally for time series forecasting evaluation
- Compatible implementation exists: works with cross_val_score, GridSearchCV, Pipeline

### Describe alternatives you've considered, if relevant

_No response_

### Additional context

_No response_

COMMENT:
@lesteve please allow me to answer on behalf of Boumedienne who is my colleague. 

> @boumediene77, I know nothing about the use case, but it looks like your package https://github.com/Smile-SA/overlay_dx has a nice README. I couldn't figure out whether it was on PyPI or not.

Overlay_dx is not on PyPi but we are considering deploying it as a package.

> Just curious, could you add a few details about your motivation behind having this functionality in scikit-learn rather than keep working on your package?

We believe, overlay_dx to be a benefitial contribution to Scikit Learn default evaluation metrics.

> If in your package overlay_dx is a callable that follows the [metric scikit-learn API](https://scikit-learn.org/stable/glossary.html#term-evaluation-metric), it seems like it could already be used with scikit-learn?

 As an external package, overlay_dx is already working with sklearn tools:

```python
from overlay_dx.metrics import make_overlay_dx_scorer
from sklearn.model_selection import cross_val_score

scorer = make_overlay_dx_scorer()
scores = cross_val_score(model, X, y, scoring=scorer, cv=5)
```

> Other than this, do you have an article that presents this overlay_dx and compares it to other metrics for forecasting?

We published "Overlay_dx - Automating forecasting evaluation" at OLA 2025 (4th International Conference on Optimization and Learning Algorithms) which proceedings were published in Springer Nature.

[Overlay_d____Automating_forecasting_evaluation-1.pdf](https://github.com/user-attachments/files/23393648/Overlay_d____Automating_forecasting_evaluation-1.pdf)

The paper benchmarks overlay_dx against MAE, RMSE, MSE, MAPE, WMAPE, and NRMSE on three public datasets (Beijing Air Quality, ETT, ELD) using 8 different models (Linear Regression, Random Forest, XGBoost, LightGBM, etc.). Overlay_dx shows strong negative correlation (-0.5 to -0.62) with absolute error metrics, suggesting it captures different performance aspects. It's also less sensitive to outliers and provides visual interpretation through overlay curves.

> Including a new feature in scikit-learn is generally not an easy task because we need to decide whether the new functionality is worth the maintenance cost, see [related FAQ for algorithms](https://scikit-learn.org/stable/faq.html#what-are-the-inclusion-criteria-for-new-algorithms). Metrics are arguably easier to add than a new algorithm (aka estimator in scikit-learn jargon) but still.

Currently overlay_dx already works with sklearn tools. What we have so far:
- Working sklearn integration (cross_val_score, GridSearchCV compatible)
- Evidence it captures different performance aspects than MAE/RMSE
- Peer-reviewed paper with empirical validation on public datasets (published in Springer Nature through the OLA conference)

Even tough we perfectly understand the open source dynamics and difficulties in mainstream projects, it is in our belief that overla_dx can provide relevant insights to the community, and sometimes lower the difficulty into asserting results quality, and other times improve the iterative development effort with meaningful measurements.

Labels: New Feature, Needs Info