Unable to pass categorical feature columns into DecisionTreeClassifier

### Describe the bug

Heyy devs of scikit-learn,

While working with the famous penguins dataset to predict the species of a penguin based on a number of features, I was getting the error:
`ValueError: could not convert string to float: 'Torgersen'`
(Togersen is one of the island names)
Further investigation led me to find out that sklearn does not currently support categorical feature columns as strings. 
I'm not sure I understand why it's possible to predict string categorical labels but not take string categorical features.
Thank you and have a great day!

### Steps/Code to Reproduce

```
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv('../DATA/penguins_size.csv') # specify file path to penguins dataset
X, y = df.drop(columns='species'), df['species']
clf = DecisionTreeClassifier()
clf.fit(X, y)
```

### Expected Results

No error is thrown.

### Actual Results

```ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_10096\2664437121.py in ?()
      2 from sklearn.tree import DecisionTreeClassifier
      3 df = pd.read_csv('../DATA/penguins_size.csv') # specify file path to penguins dataset
      4 X, y = df.drop(columns='species'), df['species']
      5 clf = DecisionTreeClassifier()
----> 6 clf.fit(X, y)

~\anaconda3\Lib\site-packages\sklearn\base.py in ?(estimator, *args, **kwargs)
   1470                 skip_parameter_validation=(
   1471                     prefer_skip_nested_validation or global_skip_validation
   1472                 )
   1473             ):
-> 1474                 return fit_method(estimator, *args, **kwargs)

~\anaconda3\Lib\site-packages\sklearn\tree\_classes.py in ?(self, X, y, sample_weight, check_input)
   1005         self : DecisionTreeClassifier
   1006             Fitted estimator.
   1007         """
   1008 
-> 1009         super()._fit(
   1010             X,
   1011             y,
   1012             sample_weight=sample_weight,

~\anaconda3\Lib\site-packages\sklearn\tree\_classes.py in ?(self, X, y, sample_weight, check_input, missing_values_in_feature_mask)
    248             check_X_params = dict(
    249                 dtype=DTYPE, accept_sparse="csc", force_all_finite=False
    250             )
    251             check_y_params = dict(ensure_2d=False, dtype=None)
--> 252             X, y = self._validate_data(
    253                 X, y, validate_separately=(check_X_params, check_y_params)
    254             )
    255 

~\anaconda3\Lib\site-packages\sklearn\base.py in ?(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)
    641                 # :(
    642                 check_X_params, check_y_params = validate_separately
    643                 if "estimator" not in check_X_params:
    644                     check_X_params = {**default_check_params, **check_X_params}
--> 645                 X = check_array(X, input_name="X", **check_X_params)
    646                 if "estimator" not in check_y_params:
    647                     check_y_params = {**default_check_params, **check_y_params}
    648                 y = check_array(y, input_name="y", **check_y_params)

~\anaconda3\Lib\site-packages\sklearn\utils\validation.py in ?(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)
    994                         )
    995                     array = xp.astype(array, dtype, copy=False)
    996                 else:
    997                     array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)
--> 998             except ComplexWarning as complex_warning:
    999                 raise ValueError(
   1000                     "Complex data not supported\n{}\n".format(array)
   1001                 ) from complex_warning

~\anaconda3\Lib\site-packages\sklearn\utils\_array_api.py in ?(array, dtype, order, copy, xp)
    517         # Use NumPy API to support order
    518         if copy is True:
    519             array = numpy.array(array, order=order, dtype=dtype)
    520         else:
--> 521             array = numpy.asarray(array, order=order, dtype=dtype)
    522 
    523         # At this point array is a NumPy ndarray. We convert it to an array
    524         # container that is consistent with the input's namespace.

~\anaconda3\Lib\site-packages\pandas\core\generic.py in ?(self, dtype, copy)
   2149     def __array__(
   2150         self, dtype: npt.DTypeLike | None = None, copy: bool_t | None = None
   2151     ) -> np.ndarray:
   2152         values = self._values
-> 2153         arr = np.asarray(values, dtype=dtype)
   2154         if (
   2155             astype_is_view(values.dtype, arr.dtype)
   2156             and using_copy_on_write()

ValueError: could not convert string to float: 'Torgersen'
```

### Versions

```shell
System:
    python: 3.11.5 | packaged by Anaconda, Inc. | (main, Sep 11 2023, 13:26:23) [MSC v.1916 64 bit (AMD64)]
executable: C:\Users\praji\anaconda3\python.exe
   machine: Windows-10-10.0.19045-SP0

Python dependencies:
      sklearn: 1.4.2
          pip: 23.2.1
   setuptools: 68.0.0
        numpy: 1.26.4
        scipy: 1.13.1
       Cython: None
       pandas: 2.2.2
   matplotlib: 3.8.4
       joblib: 1.4.2
threadpoolctl: 2.2.0

Built with OpenMP: True

threadpoolctl info:
       filepath: C:\Users\praji\anaconda3\Library\bin\mkl_rt.2.dll
         prefix: mkl_rt
       user_api: blas
   internal_api: mkl
        version: 2023.1-Product
    num_threads: 4
threading_layer: intel

       filepath: C:\Users\praji\anaconda3\vcomp140.dll
         prefix: vcomp
       user_api: openmp
   internal_api: openmp
        version: None
    num_threads: 8
```

COMMENT:
Categorical features need to be encoded, I guess you would need to use `OrdinalEncoder`, `ColumnTransformer` to select categorical variables and `Pipeline` for these purposes. Since Tim mentioned the scikit-learn MOOC, you may want to have a look at https://inria.github.io/scikit-learn-mooc/python_scripts/03_categorical_pipeline.html and the following sections.

I am going to close this issue since this is more of a scikit-learn usage question rather than a problem in scikit-learn.

@Hari-Shankar-Karthik general piece of advice for next time, when you provide a code snippet make sure it can be run easily by someone else. In your original snippet I don't have access to your local `penguins_size.csv`. For more details, have a look at https://scikit-learn.org/stable/developers/minimal_reproducer.html.

Here is an example how I adapted your snippet so that anyone can run it and reproduce the issue:
```py
import pandas as pd
from sklearn.tree import DecisionTreeClassifier

df = pd.read_csv("https://raw.githubusercontent.com/dickoa/penguins/master/data/penguins_size.csv")
X, y = df.drop(columns='species'), df['species']

clf = DecisionTreeClassifier()
clf.fit(X, y)
```

Labels: Bug, Needs Triage