Talip7/scikit-learn-issues-multilabel huggingface dataset:
DOC: type annotation for model returned from fit methods is "object"

### Describe the bug

I noticed that the type annotation for model returned from fit methods is "object". This makes IDE like pycharm unable to perform type hints:

![image](https://user-images.githubusercontent.com/48577571/206979644-9185bff3-e22f-47b0-b07d-d67e52776490.png)

![image](https://user-images.githubusercontent.com/48577571/206980081-21b877f7-b624-426d-9ce4-8ad39b08c6f1.png)


### Steps/Code to Reproduce

.

### Expected Results

The type of returned model should be the class itself.

### Actual Results

.

### Versions

```shell
System:
    python: 3.10.4 (main, Mar 31 2022, 08:41:55) [GCC 7.5.0]
executable: /home/auderson/miniconda3/envs/py3.10/bin/python
   machine: Linux-5.8.0-63-generic-x86_64-with-glibc2.32

Python dependencies:
      sklearn: 1.1.1
          pip: 22.3.1
   setuptools: 65.5.1
        numpy: 1.22.3
        scipy: 1.8.1
       Cython: 0.29.32
       pandas: 1.5.0
   matplotlib: 3.5.1
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /home/auderson/miniconda3/envs/py3.10/lib/libopenblasp-r0.3.21.so
        version: 0.3.21
threading_layer: pthreads
   architecture: Zen
    num_threads: 96

       user_api: openmp
   internal_api: openmp
         prefix: libomp
       filepath: /home/auderson/miniconda3/envs/py3.10/lib/libomp.so
        version: None
    num_threads: 1
```

COMMENT:
I'm not very keen on going down that path. Are you? 😁

Labels: Bug, Needs Triage
DOC: type annotation for model returned from fit methods is "object"

### Describe the bug

I noticed that the type annotation for model returned from fit methods is "object". This makes IDE like pycharm unable to perform type hints:

![image](https://user-images.githubusercontent.com/48577571/206979644-9185bff3-e22f-47b0-b07d-d67e52776490.png)

![image](https://user-images.githubusercontent.com/48577571/206980081-21b877f7-b624-426d-9ce4-8ad39b08c6f1.png)


### Steps/Code to Reproduce

.

### Expected Results

The type of returned model should be the class itself.

### Actual Results

.

### Versions

```shell
System:
    python: 3.10.4 (main, Mar 31 2022, 08:41:55) [GCC 7.5.0]
executable: /home/auderson/miniconda3/envs/py3.10/bin/python
   machine: Linux-5.8.0-63-generic-x86_64-with-glibc2.32

Python dependencies:
      sklearn: 1.1.1
          pip: 22.3.1
   setuptools: 65.5.1
        numpy: 1.22.3
        scipy: 1.8.1
       Cython: 0.29.32
       pandas: 1.5.0
   matplotlib: 3.5.1
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /home/auderson/miniconda3/envs/py3.10/lib/libopenblasp-r0.3.21.so
        version: 0.3.21
threading_layer: pthreads
   architecture: Zen
    num_threads: 96

       user_api: openmp
   internal_api: openmp
         prefix: libomp
       filepath: /home/auderson/miniconda3/envs/py3.10/lib/libomp.so
        version: None
    num_threads: 1
```

COMMENT:
Until we are not ready for type annotation in our code base, I would not go this path as well.
Maybe in the future, when we will decide that type hints would be helpful.

Labels: Bug, Needs Triage
Possible unintended behavior in sklearn.feature_extraction.image.extract_patches_2d

### Describe the bug

When running extract_patches_2d with `max_patches = 0`, it appears that the max number of patches is returned (same as calling with `max_patches = None`). I believe this is unintended since in the docs it's stated that "If max_patches is a float between 0 and 1, it is taken to be a proportion of the total number of patches"

I think this happens because after calling extract_patches_2d, `_compute_n_patches` is called and in the functions code `if max_patches` fails since max_patches is 0. Maybe a simple fix would be to change `if max_patches` to `if max_patches is not None` ?
``` Python
if max_patches:
    if isinstance(max_patches, (Integral)) and max_patches < all_patches:
        return max_patches
    elif isinstance(max_patches, (Integral)) and max_patches >= all_patches:
        return all_patches
    elif isinstance(max_patches, (Real)) and 0 < max_patches < 1:
        return int(max_patches * all_patches)
    else:
        raise ValueError("Invalid value for max_patches: %r" % max_patches)
else:
    return all_patches
```

### Steps/Code to Reproduce

``` Python
from sklearn.feature_extraction import image
import numpy as np
img = np.arange(9).reshape(3, 3)
patches = image.extract_patches_2d(img, (2, 2), max_patches = 0)
print(patches.shape) # outputs (4, 2, 2)
```

### Expected Results

Either an error or an empty array (when providing a very small float between 0 and 1 an empty array is returned).

### Actual Results

Output is identical to `max_patches = None`, all possible patches are returned.

### Versions

```shell
System:
    python: 3.8.16 (default, Dec  7 2022, 01:12:13)  [GCC 7.5.0]
executable: /usr/bin/python3
   machine: Linux-5.10.133+-x86_64-with-glibc2.27

Python dependencies:
          pip: 21.1.3
   setuptools: 57.4.0
      sklearn: 1.0.2
        numpy: 1.21.6
        scipy: 1.7.3
       Cython: 0.29.32
       pandas: 1.3.5
   matplotlib: 3.2.2
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True
```

COMMENT:
Indeed this seems like a bug ... 

Would you be willing to do a PR to:
- replace `if max_patches` by `if max_patches is not None`?
- add a test in `sklearn/feature_extraction/tests/test_image.py` that checks that if `max_patches=0` it returns no patches (i.e. the first dimension of the returned array is 0).

Labels: Bug, good first issue, help wanted
Possible unintended behavior in sklearn.feature_extraction.image.extract_patches_2d

### Describe the bug

When running extract_patches_2d with `max_patches = 0`, it appears that the max number of patches is returned (same as calling with `max_patches = None`). I believe this is unintended since in the docs it's stated that "If max_patches is a float between 0 and 1, it is taken to be a proportion of the total number of patches"

I think this happens because after calling extract_patches_2d, `_compute_n_patches` is called and in the functions code `if max_patches` fails since max_patches is 0. Maybe a simple fix would be to change `if max_patches` to `if max_patches is not None` ?
``` Python
if max_patches:
    if isinstance(max_patches, (Integral)) and max_patches < all_patches:
        return max_patches
    elif isinstance(max_patches, (Integral)) and max_patches >= all_patches:
        return all_patches
    elif isinstance(max_patches, (Real)) and 0 < max_patches < 1:
        return int(max_patches * all_patches)
    else:
        raise ValueError("Invalid value for max_patches: %r" % max_patches)
else:
    return all_patches
```

### Steps/Code to Reproduce

``` Python
from sklearn.feature_extraction import image
import numpy as np
img = np.arange(9).reshape(3, 3)
patches = image.extract_patches_2d(img, (2, 2), max_patches = 0)
print(patches.shape) # outputs (4, 2, 2)
```

### Expected Results

Either an error or an empty array (when providing a very small float between 0 and 1 an empty array is returned).

### Actual Results

Output is identical to `max_patches = None`, all possible patches are returned.

### Versions

```shell
System:
    python: 3.8.16 (default, Dec  7 2022, 01:12:13)  [GCC 7.5.0]
executable: /usr/bin/python3
   machine: Linux-5.10.133+-x86_64-with-glibc2.27

Python dependencies:
          pip: 21.1.3
   setuptools: 57.4.0
      sklearn: 1.0.2
        numpy: 1.21.6
        scipy: 1.7.3
       Cython: 0.29.32
       pandas: 1.3.5
   matplotlib: 3.2.2
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True
```

COMMENT:
Yes I'd love to! Will make a PR in the coming days.

Labels: Bug, good first issue, help wanted
Possible unintended behavior in sklearn.feature_extraction.image.extract_patches_2d

### Describe the bug

When running extract_patches_2d with `max_patches = 0`, it appears that the max number of patches is returned (same as calling with `max_patches = None`). I believe this is unintended since in the docs it's stated that "If max_patches is a float between 0 and 1, it is taken to be a proportion of the total number of patches"

I think this happens because after calling extract_patches_2d, `_compute_n_patches` is called and in the functions code `if max_patches` fails since max_patches is 0. Maybe a simple fix would be to change `if max_patches` to `if max_patches is not None` ?
``` Python
if max_patches:
    if isinstance(max_patches, (Integral)) and max_patches < all_patches:
        return max_patches
    elif isinstance(max_patches, (Integral)) and max_patches >= all_patches:
        return all_patches
    elif isinstance(max_patches, (Real)) and 0 < max_patches < 1:
        return int(max_patches * all_patches)
    else:
        raise ValueError("Invalid value for max_patches: %r" % max_patches)
else:
    return all_patches
```

### Steps/Code to Reproduce

``` Python
from sklearn.feature_extraction import image
import numpy as np
img = np.arange(9).reshape(3, 3)
patches = image.extract_patches_2d(img, (2, 2), max_patches = 0)
print(patches.shape) # outputs (4, 2, 2)
```

### Expected Results

Either an error or an empty array (when providing a very small float between 0 and 1 an empty array is returned).

### Actual Results

Output is identical to `max_patches = None`, all possible patches are returned.

### Versions

```shell
System:
    python: 3.8.16 (default, Dec  7 2022, 01:12:13)  [GCC 7.5.0]
executable: /usr/bin/python3
   machine: Linux-5.10.133+-x86_64-with-glibc2.27

Python dependencies:
          pip: 21.1.3
   setuptools: 57.4.0
      sklearn: 1.0.2
        numpy: 1.21.6
        scipy: 1.7.3
       Cython: 0.29.32
       pandas: 1.3.5
   matplotlib: 3.2.2
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True
```

COMMENT:
From #25149 and #25161 it seems like the direction is to have `max_patches=0` yield an error, so let's close this one.

Labels: Bug, good first issue, help wanted
Improving IsolationForest predict time

### Discussed in https://github.com/scikit-learn/scikit-learn/discussions/25142

<div type='discussions-op-text'>

<sup>Originally posted by **fsiola** December  8, 2022</sup>
Hi, 

When using [IsolationForest predict](https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/ensemble/_iforest.py#L341), we go down the path to [_compute_score_samples](https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/ensemble/_iforest.py#L464). This executes `tree.apply` and `tree.decision_path`. Both calls will iterate over the tree for each sample in `X`. So we are evaluation the tree 2 times.

`tree.decision_path` returns a [csr matrix](https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/tree/_tree.pyx#L962) containing the nodes indexes that were visited in the tree, to them later just have the [count of indexes summed later](https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/ensemble/_iforest.py#L488).

We can save time in predict if instead of calling `tree.decision_path`, a `tree.decision_path_length` that return an integer exists. But that would required  changing the `_tree.pyx` file. Some changes could also avoid the call to `tree.apply`, avoiding 2 times iterating on the tree.

Is this something that would be accepted as PR, or changing the tree cpython files for this would not be accepted?</div>

COMMENT:
I will take this one them

Labels: Performance, module:tree
`check_array` unexpectedly upcasts numeric types in pandas Series

### Describe the bug

This is an unexpected (and I would argue undesirable) behavior change introduced in 1.2.0 by https://github.com/scikit-learn/scikit-learn/pull/25080

The issue is that `check_array` applied to a pandas series of dtype `bool` upcasts the returned series to dtype `float64`. I would guess that there is related upcasting behavior for other numeric dtypes. This is a change from version 1.1.3 with the potential to cause unexpected downstream failures (I found it because I tried to use the invert operator `~` on the series returned by `check_array`, which works for `bool` but not `float64`).

### Steps/Code to Reproduce

```python
from sklearn.utils import check_array
import pandas as pd

ser = pd.Series([False, True])
```

### Expected Results

I would expect the dtype to be preserved (it is preserved in `1.1.3`)

```python
> print(check_array(ser, ensure_2d=False, force_all_finite=False, dtype=None).dtype)
bool
```

### Actual Results

The series is upcast from `bool` to `float64`:

```python
> print(check_array(ser, ensure_2d=False, force_all_finite=False, dtype=None).dtype)
float64
```

### Versions

```shell
System:
    python: 3.9.14 (main, Oct 14 2022, 16:22:46)  [Clang 14.0.0 (clang-1400.0.29.102)]
executable: /Users/ben.fogelson/.pyenv/versions/sklearn-bug/bin/python
   machine: macOS-12.6.1-x86_64-i386-64bit

Python dependencies:
      sklearn: 1.2.0
          pip: 22.3.1
   setuptools: 65.6.3
        numpy: 1.23.5
        scipy: 1.9.3
       Cython: None
       pandas: 1.5.2
   matplotlib: None
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: openmp
   internal_api: openmp
         prefix: libomp
       filepath: /Users/ben.fogelson/.pyenv/versions/3.9.14/envs/sklearn-bug/lib/python3.9/site-packages/sklearn/.dylibs/libomp.dylib
        version: None
    num_threads: 12

       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /Users/ben.fogelson/.pyenv/versions/3.9.14/envs/sklearn-bug/lib/python3.9/site-packages/numpy/.dylibs/libopenblas64_.0.dylib
        version: 0.3.20
threading_layer: pthreads
   architecture: Haswell
    num_threads: 6

       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /Users/ben.fogelson/.pyenv/versions/3.9.14/envs/sklearn-bug/lib/python3.9/site-packages/scipy/.dylibs/libopenblas.0.dylib
        version: 0.3.18
threading_layer: pthreads
   architecture: Haswell
    num_threads: 6
```

COMMENT:
Thanks for reporting this. I can reproduce it.

It does seem weird to produce an output that uses `float64`, when the input is a "normal" bool (no way to have NA in it).

The goal of the linked PR that introduced this was to make `pd.Series` and `pd.DataFrame` behave the same. However, with `df = pd.DataFrame([True, False])` the dtype remains `bool`. But if you use `df = pd.DataFrame({'a': [True, False], 'b':[4,3]})` then you get `int64`.

Overall I think we did introduce a bug and/or some inconsistency that needs fixing up.

Labels: Bug
`check_array` unexpectedly upcasts numeric types in pandas Series

### Describe the bug

This is an unexpected (and I would argue undesirable) behavior change introduced in 1.2.0 by https://github.com/scikit-learn/scikit-learn/pull/25080

The issue is that `check_array` applied to a pandas series of dtype `bool` upcasts the returned series to dtype `float64`. I would guess that there is related upcasting behavior for other numeric dtypes. This is a change from version 1.1.3 with the potential to cause unexpected downstream failures (I found it because I tried to use the invert operator `~` on the series returned by `check_array`, which works for `bool` but not `float64`).

### Steps/Code to Reproduce

```python
from sklearn.utils import check_array
import pandas as pd

ser = pd.Series([False, True])
```

### Expected Results

I would expect the dtype to be preserved (it is preserved in `1.1.3`)

```python
> print(check_array(ser, ensure_2d=False, force_all_finite=False, dtype=None).dtype)
bool
```

### Actual Results

The series is upcast from `bool` to `float64`:

```python
> print(check_array(ser, ensure_2d=False, force_all_finite=False, dtype=None).dtype)
float64
```

### Versions

```shell
System:
    python: 3.9.14 (main, Oct 14 2022, 16:22:46)  [Clang 14.0.0 (clang-1400.0.29.102)]
executable: /Users/ben.fogelson/.pyenv/versions/sklearn-bug/bin/python
   machine: macOS-12.6.1-x86_64-i386-64bit

Python dependencies:
      sklearn: 1.2.0
          pip: 22.3.1
   setuptools: 65.6.3
        numpy: 1.23.5
        scipy: 1.9.3
       Cython: None
       pandas: 1.5.2
   matplotlib: None
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True

threadpoolctl info:
       user_api: openmp
   internal_api: openmp
         prefix: libomp
       filepath: /Users/ben.fogelson/.pyenv/versions/3.9.14/envs/sklearn-bug/lib/python3.9/site-packages/sklearn/.dylibs/libomp.dylib
        version: None
    num_threads: 12

       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /Users/ben.fogelson/.pyenv/versions/3.9.14/envs/sklearn-bug/lib/python3.9/site-packages/numpy/.dylibs/libopenblas64_.0.dylib
        version: 0.3.20
threading_layer: pthreads
   architecture: Haswell
    num_threads: 6

       user_api: blas
   internal_api: openblas
         prefix: libopenblas
       filepath: /Users/ben.fogelson/.pyenv/versions/3.9.14/envs/sklearn-bug/lib/python3.9/site-packages/scipy/.dylibs/libopenblas.0.dylib
        version: 0.3.18
threading_layer: pthreads
   architecture: Haswell
    num_threads: 6
```

COMMENT:
I'll make a PR to try and fix this.

Labels: Bug
RandomizedSearchCV does not stratify folds

### Describe the bug

The documentation states that supplying an integer to cv will, by default, use stratified folds: "For integer/None inputs, if the estimator is a classifier and y is either binary or multiclass, [StratifiedKFold] is used."

I am using this as an estimator:

```
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier  #wrap Keras model builder
model_builder = KerasClassifier(build_fn=ann_build_binary_model, verbose=0)  #used as estimator.
```

I do not get stratified folds using `cv=5`. Perhaps KerasClassifier is not recognized as a classifier so get KFold instead?

### Steps/Code to Reproduce


```
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier  #wrap Keras model builder
model_builder = KerasClassifier(build_fn=ann_build_binary_model, verbose=0)  #used as estimator.
```

### Expected Results

5 stratified folds. Instead get warning that one fold has labels of all 1s. This should not be given there is a roughly even balance of 0s and 1s in 600 rows. Looking at the rows, all the 0s are in first half and 1s in second.

### Actual Results

I get warnings that one fold contains all 1s as labels.

### Versions

```shell
System:
    python: 3.8.16 (default, Dec  7 2022, 01:12:13)  [GCC 7.5.0]
executable: /usr/bin/python3
   machine: Linux-5.10.133+-x86_64-with-glibc2.27

Python dependencies:
          pip: 21.1.3
   setuptools: 57.4.0
      sklearn: 1.0.2
        numpy: 1.21.6
        scipy: 1.7.3
       Cython: 0.29.32
       pandas: 1.3.5
   matplotlib: 3.2.2
       joblib: 1.2.0
threadpoolctl: 3.1.0

Built with OpenMP: True
```

COMMENT:
You should be using scikeras (https://github.com/adriangb/scikeras) instead,which should work. If it doesn't please let us know.

Labels: Bug, Needs Triage
⚠️ CI failed on Linux_Nightly_PyPy.pypy3 ⚠️

**CI is still failing on [Linux_Nightly_PyPy.pypy3](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=59274&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66)** (Sep 18, 2023)
Unable to find junit file. Please see link for details.

COMMENT:
## CI is no longer failing! ✅

[Successful run](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=52689&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66) on Mar 09, 2023

Labels: Bug, Needs Investigation
⚠️ CI failed on Linux_Nightly_PyPy.pypy3 ⚠️

**CI is still failing on [Linux_Nightly_PyPy.pypy3](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=59274&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66)** (Sep 18, 2023)
Unable to find junit file. Please see link for details.

COMMENT:
Until tomorrow @scikit-learn-bot

Labels: Bug, Needs Investigation
⚠️ CI failed on Linux_Nightly_PyPy.pypy3 ⚠️

**CI is still failing on [Linux_Nightly_PyPy.pypy3](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=59274&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66)** (Sep 18, 2023)
Unable to find junit file. Please see link for details.

COMMENT:
Looking over the other recent pypy failures, they all excited with 137, which is a error code for using too much memory.

Labels: Bug, Needs Investigation
⚠️ CI failed on Linux_Nightly_PyPy.pypy3 ⚠️

**CI is still failing on [Linux_Nightly_PyPy.pypy3](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=59274&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66)** (Sep 18, 2023)
Unable to find junit file. Please see link for details.

COMMENT:
The weird stuff this is always on the last per cent of the test.

Labels: Bug, Needs Investigation
⚠️ CI failed on Linux_Nightly_PyPy.pypy3 ⚠️

**CI is still failing on [Linux_Nightly_PyPy.pypy3](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=59274&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66)** (Sep 18, 2023)
Unable to find junit file. Please see link for details.

COMMENT:
In a recent run, this was a crash of a pytest-xdist worker instead of a problem happening at test collection time as original reported by the bot in the description of this issue.

Here is a snippet of yesterday's failure:

```
........................................................................ [ 99%]
........................................................................ [ 99%]
...................
=================================== FAILURES ===================================
______________________ tests/test_kernel_approximation.py ______________________
[gw0] linux -- Python 3.9.16 /opt/conda/envs/testvenv/bin/python
worker 'gw0' crashed while running 'tests/test_kernel_approximation.py::test_polynomial_count_sketch[0-3-5000-1]'
```

I suspect a memory usage problem. Maybe we could decrease memory pressure by disabling `pytest-xdist` for pypy?

I am currently running the scikit-learn test suite with pytest-memray on CPython on my laptop to see if `test_polynomial_count_sketch[0-3-5000-1]` is one of the largest memory user.

Labels: Bug, Needs Investigation
⚠️ CI failed on Linux_Nightly_PyPy.pypy3 ⚠️

**CI is still failing on [Linux_Nightly_PyPy.pypy3](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=59274&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66)** (Sep 18, 2023)
Unable to find junit file. Please see link for details.

COMMENT:
> Looking over the other recent pypy failures, they all excited with 137, which is a error code for using too much memory.

Where do you see this? I cannot see it on the last run.

Labels: Bug, Needs Investigation
⚠️ CI failed on Linux_Nightly_PyPy.pypy3 ⚠️

**CI is still failing on [Linux_Nightly_PyPy.pypy3](https://dev.azure.com/scikit-learn/scikit-learn/_build/results?buildId=59274&view=logs&j=0b16f832-29d6-5b92-1c23-eb006f606a66)** (Sep 18, 2023)
Unable to find junit file. Please see link for details.

COMMENT:
Let me close this one. The PyPy build is still failing but with another error. So let's close this and instead open a new issue dedicated to the new problem.

Labels: Bug, Needs Investigation
Add link to license in the readme

### Describe the issue linked to the documentation

Thought it would be helpful/convenient to link the license from the readme

### Suggest a potential alternative/fix

It is already available in the top right hand corner of the repository but this is often missed

COMMENT:
The licence has is own file: https://github.com/scikit-learn/scikit-learn/blob/main/COPYING

Labels: Documentation, Needs Triage