es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error al realizar la codificación OneHot en un DataFrame que tiene categorías como “números” y “cadenas”.

Aquí está el código:

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

one_hot = OneHotEncoder()
transformer = ColumnTransformer([("one_hot", 
                                  one_hot,
                                  cat_features)],
                                  remainder="passthrough")

transformed_X = transformer.fit_transform(mmp_filled)

transformed_X

Las características “cat_features” incluyen columnas con números (que se consideran categorías) y cadenas de caracteres:

Aquí está el DataFrame “mmp_filled” imagen.

El error es el siguiente:

TypeError                                 Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/sklearn/utils/encode.py in _unique_python(values, return_inverse)
    134 
--> 135         uniques = sorted(uniques_set)
    136         uniques.extend(missing_values.tolist())

TypeError: '<' not supported between instances of 'str' and 'float'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
17 frames
/usr/local/lib/python3.7/dist-packages/sklearn/utils/encode.py in _unique_python(values, return_inverse)
    139         types = sorted(t.qualname for t in set(type(v) for v in values))
    140         raise TypeError(
--> 141             "Encoders require their input to be uniformly "
    142             f"strings or numbers. Got {types}"
    143         )

TypeError: Encoders require their input to be uniformly strings or numbers. Got ['float', 'str']
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que la(s) columna(s) especificada(s) como cat_features contiene tanto cadenas de texto como números decimales, lo cual no es admitido por el codificador OneHotEncoder. El codificador requiere que la entrada sea uniformemente cadenas de texto o números.

    Para resolver este error, debes asegurarte de que las características categóricas en el DataFrame consistan en cadenas de texto o valores numéricos. Puedes verificar los tipos de datos de las columnas en el DataFrame utilizando el método dtype:

    mmp_filled.dtypes
    

    Si alguna de las columnas contiene tanto cadenas de texto como números, debes convertirlas a un tipo de datos consistente antes de aplicar la codificación one-hot. Un enfoque es convertir todas las columnas en cadenas de texto:

    mmp_filled = mmp_filled.astype(str)
    

    Alternativamente, puedes separar las columnas que contienen cadenas de texto de aquellas que contienen números y aplicar un preprocesamiento por separado a cada conjunto de columnas. Por ejemplo, puedes usar el método select_dtypes para seleccionar columnas de ciertos tipos de datos:

    num_cols = mmp_filled.select_dtypes(include=['int', 'float']).columns
    cat_cols = mmp_filled.select_dtypes(include=['object']).columns
    

    Luego, puedes aplicar preprocesamiento numérico (escalado, imputación, etc.) a las columnas numéricas y codificación one-hot a las columnas categóricas.

Comments are closed.