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']
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
: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:
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: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.