Talip7/scikit-learn-issues-multilabel huggingface dataset:
ENH: Random Forest Classifier oob scaling/parallel

My team, working on a bioinformatics problem with high feature count (columns/dimensions in `X`), noticed that the `RandomForestClassifier` out of bag scoring doesn't scale with `n_jobs`. To be fair, `n_jobs` clearly says what it does support, though I do wonder if the out of bag predictions under the hood might also benefit from parallel support. Someone on my team seems to have found that it does help, but implemented externally to sklearn using the exposed base estimators. I suppose it might be nice to have that internally at some point, if there are no design reasons not to?

Sample reproducer code with latest stable release (`1.3.2`) on 16 cores/x86_64 Linux box (`i9-13900K`) is below the fold, and the scaling plot is underneath that. We also use far more estimators and features than that, so the delta is much greater, but the scaling trend is the main observation in any case.

<details>

```python
from time import perf_counter
import numpy as np
# sklearn 1.3.2
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt


timings_oob = []
timings_base = []
feature_counts = np.linspace(10, 180_000, 20, dtype=np.int64)

for feature_count in feature_counts:
    X, y = make_classification(n_samples=1_000,
                               n_features=feature_count,
                               random_state=0)
    for use_oob, timing_list in zip([True, False], [timings_oob, timings_base]):
        start = perf_counter()
        clf = RandomForestClassifier(n_estimators=50,
                                     random_state=0,
                                     oob_score=use_oob,
                                     n_jobs=16)
        clf.fit(X, y)
        timing_list.append(perf_counter() - start)

fig, ax = plt.subplots(1, 1)
ax.set_title(f"Random Forest OOB scaling performance")
ax.plot(feature_counts,
        timings_oob,
        label="WITH OOB",
        marker=".")
ax.plot(feature_counts,
        timings_base,
        label="NO oob",
        marker=".")
ax.set_xlabel("num features")
ax.set_ylabel("Time (s)")
ax.legend()
fig.savefig("bench_feat.png", dpi=300)
```

</details>

![image](https://github.com/scikit-learn/scikit-learn/assets/7903078/d07a173a-d847-4980-aa6b-02bc0cfc0f9a)

COMMENT:
@tylerjereddy just to clarify: Is the issue that the `oob` predictions are occurring without joblib parallelization?

Do you have a  link to your fix, and are interested in submitting a PR? I would be interested in reviewing and getting this performance improvement into `main`.

Or if not, I am happy to submit a PR if you describe the idea. I also observed recently qualitatively that oob runtime was worse than non-oob.

Labels: Enhancement
Infinite Loop in K-means when relocating empty clusters

### Describe the bug

Relocating empty clusters in Kmeans is not working as expected in this edge case, where :
- There is duplicate entries.
- The number of clusters is equal to the number of entries.
- Very particular initial positions.

Kmeans is stuck in a infinite loop, and the only way to end it is the max number of iterations. 

I have suggestions to improve the relocation of empty clusters : 
- When selecting an entry to fill an empty cluster (the entry that has max_dist), we should not select an entry in a cluster that contains only 1 entry.
- After each relocation of an empty clusters, Centers needs to be updated.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
    [100, 100], [100, 102], [106, 100], [107, 101], [107, 101], [108, 100]
])
init = np.array([
    [98, 104], [103, 100], [109, 102], [110, 100], [111, 100], [112, 100]
])
kmeans = KMeans(
    n_clusters=6,
    init=init,
    random_state=0,
    verbose=True,
    algorithm='lloyd',
    max_iter=10_000
).fit(X)
```

### Expected Results

We should only perform 1 iteration

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
```

### Actual Results

Kmeans is stuck in an infinite loop

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
Iteration 2, inertia 0.0.
Iteration 3, inertia 0.0.
Iteration 4, inertia 0.0.
Iteration 5, inertia 0.0.
Iteration 6, inertia 0.0.
Iteration 7, inertia 0.0.
Iteration 8, inertia 0.0.
Iteration 9, inertia 0.0.
Iteration 10, inertia 0.0.
Iteration 11, inertia 0.0.
Iteration 12, inertia 0.0.
Iteration 13, inertia 0.0.
Iteration 14, inertia 0.0.
Iteration 15, inertia 0.0.
Iteration 16, inertia 0.0.
Iteration 17, inertia 0.0.
Iteration 18, inertia 0.0.
Iteration 19, inertia 0.0.
```

### Versions

```shell
System:
   python: 3.9.0
   machine: Windows-10

Python dependencies:
      sklearn: 1.3.2
          pip: 20.2.3
   setuptools: 49.2.1
        numpy: 1.25.1
        scipy: 1.11.4
       Cython: None
       pandas: 2.0.3
   matplotlib: 3.7.2
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.23
threading_layer: pthreads

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: vcomp
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.21.dev
threading_layer: pthreads
```

COMMENT:
@brmel omds that makes me look so dumb 😅. 

Yeah, you make a valid point that the algorithm should stop when inertia becomes 0, it doesn't make sense to keep going.

Labels: Bug
Infinite Loop in K-means when relocating empty clusters

### Describe the bug

Relocating empty clusters in Kmeans is not working as expected in this edge case, where :
- There is duplicate entries.
- The number of clusters is equal to the number of entries.
- Very particular initial positions.

Kmeans is stuck in a infinite loop, and the only way to end it is the max number of iterations. 

I have suggestions to improve the relocation of empty clusters : 
- When selecting an entry to fill an empty cluster (the entry that has max_dist), we should not select an entry in a cluster that contains only 1 entry.
- After each relocation of an empty clusters, Centers needs to be updated.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
    [100, 100], [100, 102], [106, 100], [107, 101], [107, 101], [108, 100]
])
init = np.array([
    [98, 104], [103, 100], [109, 102], [110, 100], [111, 100], [112, 100]
])
kmeans = KMeans(
    n_clusters=6,
    init=init,
    random_state=0,
    verbose=True,
    algorithm='lloyd',
    max_iter=10_000
).fit(X)
```

### Expected Results

We should only perform 1 iteration

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
```

### Actual Results

Kmeans is stuck in an infinite loop

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
Iteration 2, inertia 0.0.
Iteration 3, inertia 0.0.
Iteration 4, inertia 0.0.
Iteration 5, inertia 0.0.
Iteration 6, inertia 0.0.
Iteration 7, inertia 0.0.
Iteration 8, inertia 0.0.
Iteration 9, inertia 0.0.
Iteration 10, inertia 0.0.
Iteration 11, inertia 0.0.
Iteration 12, inertia 0.0.
Iteration 13, inertia 0.0.
Iteration 14, inertia 0.0.
Iteration 15, inertia 0.0.
Iteration 16, inertia 0.0.
Iteration 17, inertia 0.0.
Iteration 18, inertia 0.0.
Iteration 19, inertia 0.0.
```

### Versions

```shell
System:
   python: 3.9.0
   machine: Windows-10

Python dependencies:
      sklearn: 1.3.2
          pip: 20.2.3
   setuptools: 49.2.1
        numpy: 1.25.1
        scipy: 1.11.4
       Cython: None
       pandas: 2.0.3
   matplotlib: 3.7.2
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.23
threading_layer: pthreads

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: vcomp
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.21.dev
threading_layer: pthreads
```

COMMENT:
Can we stop the algorithm when we get inertia 0? could this be a viable solution?

Labels: Bug
Infinite Loop in K-means when relocating empty clusters

### Describe the bug

Relocating empty clusters in Kmeans is not working as expected in this edge case, where :
- There is duplicate entries.
- The number of clusters is equal to the number of entries.
- Very particular initial positions.

Kmeans is stuck in a infinite loop, and the only way to end it is the max number of iterations. 

I have suggestions to improve the relocation of empty clusters : 
- When selecting an entry to fill an empty cluster (the entry that has max_dist), we should not select an entry in a cluster that contains only 1 entry.
- After each relocation of an empty clusters, Centers needs to be updated.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
    [100, 100], [100, 102], [106, 100], [107, 101], [107, 101], [108, 100]
])
init = np.array([
    [98, 104], [103, 100], [109, 102], [110, 100], [111, 100], [112, 100]
])
kmeans = KMeans(
    n_clusters=6,
    init=init,
    random_state=0,
    verbose=True,
    algorithm='lloyd',
    max_iter=10_000
).fit(X)
```

### Expected Results

We should only perform 1 iteration

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
```

### Actual Results

Kmeans is stuck in an infinite loop

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
Iteration 2, inertia 0.0.
Iteration 3, inertia 0.0.
Iteration 4, inertia 0.0.
Iteration 5, inertia 0.0.
Iteration 6, inertia 0.0.
Iteration 7, inertia 0.0.
Iteration 8, inertia 0.0.
Iteration 9, inertia 0.0.
Iteration 10, inertia 0.0.
Iteration 11, inertia 0.0.
Iteration 12, inertia 0.0.
Iteration 13, inertia 0.0.
Iteration 14, inertia 0.0.
Iteration 15, inertia 0.0.
Iteration 16, inertia 0.0.
Iteration 17, inertia 0.0.
Iteration 18, inertia 0.0.
Iteration 19, inertia 0.0.
```

### Versions

```shell
System:
   python: 3.9.0
   machine: Windows-10

Python dependencies:
      sklearn: 1.3.2
          pip: 20.2.3
   setuptools: 49.2.1
        numpy: 1.25.1
        scipy: 1.11.4
       Cython: None
       pandas: 2.0.3
   matplotlib: 3.7.2
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.23
threading_layer: pthreads

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: vcomp
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.21.dev
threading_layer: pthreads
```

COMMENT:
> Can we stop the algorithm when we get inertia 0? could this be a viable solution?

A simple `if` statement should do the trick, right?

Labels: Bug
Infinite Loop in K-means when relocating empty clusters

### Describe the bug

Relocating empty clusters in Kmeans is not working as expected in this edge case, where :
- There is duplicate entries.
- The number of clusters is equal to the number of entries.
- Very particular initial positions.

Kmeans is stuck in a infinite loop, and the only way to end it is the max number of iterations. 

I have suggestions to improve the relocation of empty clusters : 
- When selecting an entry to fill an empty cluster (the entry that has max_dist), we should not select an entry in a cluster that contains only 1 entry.
- After each relocation of an empty clusters, Centers needs to be updated.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
    [100, 100], [100, 102], [106, 100], [107, 101], [107, 101], [108, 100]
])
init = np.array([
    [98, 104], [103, 100], [109, 102], [110, 100], [111, 100], [112, 100]
])
kmeans = KMeans(
    n_clusters=6,
    init=init,
    random_state=0,
    verbose=True,
    algorithm='lloyd',
    max_iter=10_000
).fit(X)
```

### Expected Results

We should only perform 1 iteration

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
```

### Actual Results

Kmeans is stuck in an infinite loop

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
Iteration 2, inertia 0.0.
Iteration 3, inertia 0.0.
Iteration 4, inertia 0.0.
Iteration 5, inertia 0.0.
Iteration 6, inertia 0.0.
Iteration 7, inertia 0.0.
Iteration 8, inertia 0.0.
Iteration 9, inertia 0.0.
Iteration 10, inertia 0.0.
Iteration 11, inertia 0.0.
Iteration 12, inertia 0.0.
Iteration 13, inertia 0.0.
Iteration 14, inertia 0.0.
Iteration 15, inertia 0.0.
Iteration 16, inertia 0.0.
Iteration 17, inertia 0.0.
Iteration 18, inertia 0.0.
Iteration 19, inertia 0.0.
```

### Versions

```shell
System:
   python: 3.9.0
   machine: Windows-10

Python dependencies:
      sklearn: 1.3.2
          pip: 20.2.3
   setuptools: 49.2.1
        numpy: 1.25.1
        scipy: 1.11.4
       Cython: None
       pandas: 2.0.3
   matplotlib: 3.7.2
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.23
threading_layer: pthreads

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: vcomp
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.21.dev
threading_layer: pthreads
```

COMMENT:
We can try

Labels: Bug
Infinite Loop in K-means when relocating empty clusters

### Describe the bug

Relocating empty clusters in Kmeans is not working as expected in this edge case, where :
- There is duplicate entries.
- The number of clusters is equal to the number of entries.
- Very particular initial positions.

Kmeans is stuck in a infinite loop, and the only way to end it is the max number of iterations. 

I have suggestions to improve the relocation of empty clusters : 
- When selecting an entry to fill an empty cluster (the entry that has max_dist), we should not select an entry in a cluster that contains only 1 entry.
- After each relocation of an empty clusters, Centers needs to be updated.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
    [100, 100], [100, 102], [106, 100], [107, 101], [107, 101], [108, 100]
])
init = np.array([
    [98, 104], [103, 100], [109, 102], [110, 100], [111, 100], [112, 100]
])
kmeans = KMeans(
    n_clusters=6,
    init=init,
    random_state=0,
    verbose=True,
    algorithm='lloyd',
    max_iter=10_000
).fit(X)
```

### Expected Results

We should only perform 1 iteration

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
```

### Actual Results

Kmeans is stuck in an infinite loop

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
Iteration 2, inertia 0.0.
Iteration 3, inertia 0.0.
Iteration 4, inertia 0.0.
Iteration 5, inertia 0.0.
Iteration 6, inertia 0.0.
Iteration 7, inertia 0.0.
Iteration 8, inertia 0.0.
Iteration 9, inertia 0.0.
Iteration 10, inertia 0.0.
Iteration 11, inertia 0.0.
Iteration 12, inertia 0.0.
Iteration 13, inertia 0.0.
Iteration 14, inertia 0.0.
Iteration 15, inertia 0.0.
Iteration 16, inertia 0.0.
Iteration 17, inertia 0.0.
Iteration 18, inertia 0.0.
Iteration 19, inertia 0.0.
```

### Versions

```shell
System:
   python: 3.9.0
   machine: Windows-10

Python dependencies:
      sklearn: 1.3.2
          pip: 20.2.3
   setuptools: 49.2.1
        numpy: 1.25.1
        scipy: 1.11.4
       Cython: None
       pandas: 2.0.3
   matplotlib: 3.7.2
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.23
threading_layer: pthreads

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: vcomp
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.21.dev
threading_layer: pthreads
```

COMMENT:
Indeed this is a bug. Thanks @brmel for the minimal reproducer.

Labels: Bug
Infinite Loop in K-means when relocating empty clusters

### Describe the bug

Relocating empty clusters in Kmeans is not working as expected in this edge case, where :
- There is duplicate entries.
- The number of clusters is equal to the number of entries.
- Very particular initial positions.

Kmeans is stuck in a infinite loop, and the only way to end it is the max number of iterations. 

I have suggestions to improve the relocation of empty clusters : 
- When selecting an entry to fill an empty cluster (the entry that has max_dist), we should not select an entry in a cluster that contains only 1 entry.
- After each relocation of an empty clusters, Centers needs to be updated.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
    [100, 100], [100, 102], [106, 100], [107, 101], [107, 101], [108, 100]
])
init = np.array([
    [98, 104], [103, 100], [109, 102], [110, 100], [111, 100], [112, 100]
])
kmeans = KMeans(
    n_clusters=6,
    init=init,
    random_state=0,
    verbose=True,
    algorithm='lloyd',
    max_iter=10_000
).fit(X)
```

### Expected Results

We should only perform 1 iteration

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
```

### Actual Results

Kmeans is stuck in an infinite loop

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
Iteration 2, inertia 0.0.
Iteration 3, inertia 0.0.
Iteration 4, inertia 0.0.
Iteration 5, inertia 0.0.
Iteration 6, inertia 0.0.
Iteration 7, inertia 0.0.
Iteration 8, inertia 0.0.
Iteration 9, inertia 0.0.
Iteration 10, inertia 0.0.
Iteration 11, inertia 0.0.
Iteration 12, inertia 0.0.
Iteration 13, inertia 0.0.
Iteration 14, inertia 0.0.
Iteration 15, inertia 0.0.
Iteration 16, inertia 0.0.
Iteration 17, inertia 0.0.
Iteration 18, inertia 0.0.
Iteration 19, inertia 0.0.
```

### Versions

```shell
System:
   python: 3.9.0
   machine: Windows-10

Python dependencies:
      sklearn: 1.3.2
          pip: 20.2.3
   setuptools: 49.2.1
        numpy: 1.25.1
        scipy: 1.11.4
       Cython: None
       pandas: 2.0.3
   matplotlib: 3.7.2
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.23
threading_layer: pthreads

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: vcomp
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.21.dev
threading_layer: pthreads
```

COMMENT:
The fact that you duplicated samples makes that we are in the ill-conditioned case where `n_clusters > n_samples`. Normally, we raise an error for this case so I'm not surprise that the algorithm does not work properly.

Then, I'm not sure if we can easily detect it without making a very expensive check to check for sample duplication.

Labels: Bug
Infinite Loop in K-means when relocating empty clusters

### Describe the bug

Relocating empty clusters in Kmeans is not working as expected in this edge case, where :
- There is duplicate entries.
- The number of clusters is equal to the number of entries.
- Very particular initial positions.

Kmeans is stuck in a infinite loop, and the only way to end it is the max number of iterations. 

I have suggestions to improve the relocation of empty clusters : 
- When selecting an entry to fill an empty cluster (the entry that has max_dist), we should not select an entry in a cluster that contains only 1 entry.
- After each relocation of an empty clusters, Centers needs to be updated.

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.cluster import KMeans

X = np.array([
    [100, 100], [100, 102], [106, 100], [107, 101], [107, 101], [108, 100]
])
init = np.array([
    [98, 104], [103, 100], [109, 102], [110, 100], [111, 100], [112, 100]
])
kmeans = KMeans(
    n_clusters=6,
    init=init,
    random_state=0,
    verbose=True,
    algorithm='lloyd',
    max_iter=10_000
).fit(X)
```

### Expected Results

We should only perform 1 iteration

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
```

### Actual Results

Kmeans is stuck in an infinite loop

```
Initialization complete
Iteration 0, inertia 40.0.
Iteration 1, inertia 0.0.
Iteration 2, inertia 0.0.
Iteration 3, inertia 0.0.
Iteration 4, inertia 0.0.
Iteration 5, inertia 0.0.
Iteration 6, inertia 0.0.
Iteration 7, inertia 0.0.
Iteration 8, inertia 0.0.
Iteration 9, inertia 0.0.
Iteration 10, inertia 0.0.
Iteration 11, inertia 0.0.
Iteration 12, inertia 0.0.
Iteration 13, inertia 0.0.
Iteration 14, inertia 0.0.
Iteration 15, inertia 0.0.
Iteration 16, inertia 0.0.
Iteration 17, inertia 0.0.
Iteration 18, inertia 0.0.
Iteration 19, inertia 0.0.
```

### Versions

```shell
System:
   python: 3.9.0
   machine: Windows-10

Python dependencies:
      sklearn: 1.3.2
          pip: 20.2.3
   setuptools: 49.2.1
        numpy: 1.25.1
        scipy: 1.11.4
       Cython: None
       pandas: 2.0.3
   matplotlib: 3.7.2
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.23
threading_layer: pthreads

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: vcomp
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libopenblas
        version: 0.3.21.dev
threading_layer: pthreads
```

COMMENT:
The jumpy "empty" centroids could come from the initialization to 0.

Labels: Bug
Plan for SGD and SAGA loss function migration

As a result of #15123, we now have a common private loss function module under `sklearn._loss`. In `sklearn.linear_models` we have 2 algorithms that need Cython version that calculate losses and gradients on single values (not on arrays), namely
- `_plain_sgd` as used in `SGDClassifier`, `SGDRegressor` and `SGDOneClassSVM`; and
- `sag_solver` as used in `LogisticRegression`.

My plan is to break this migration into smaller steps:
1. #27979 Deprecate `loss_function_` attribute in v1.4 which gives access to the Cython loss functions that we want to replace.
2. #27999 change order of Cython loss function arguments to align with the ones in `sklearn._loss`.
3. Carry out the deprecation after release 1.5 (to be released with 1.6)
   #29095
4. #28029 Replace Cython losses with the ones from `sklearn._loss`, except multinomial one
5. #28037 Replace the multinomial loss

COMMENT:
@thomasjpfan ping

Labels: module:linear_model