python - tfidftransformer - TypeError: se requiere un float en sklearn.feature_extraction.FeatureHasher
tfidfvectorizer (3)
Estoy usando sklearn versión 0.16.1. Parece que FeatureHasher no admite cadenas (como lo hace DictVectorizer). Por ejemplo:
values = [
{''city'': ''Dubai'', ''temperature'': 33.},
{''city'': ''London'', ''temperature'': 12.},
{''city'': ''San Fransisco'', ''temperature'': 18.}
]
print("Starting FeatureHasher ...")
hasher = FeatureHasher(n_features=2)
X = hasher.transform(values).toarray()
print X
Pero se recibe el siguiente error:
_hashing.transform(raw_X, self.n_features, self.dtype)
File "_hashing.pyx", line 46, in sklearn.feature_extraction._hashing.transform (sklearn/feature_extraction/_hashing.c:1762)
TypeError: a float is required
No puedo usar DictVectorizer ya que mi conjunto de datos es muy grande y las características son con alta cardinalidad, así que obtengo un MemoryError. ¿Alguna sugerencia?
Actualización (octubre de 2016):
Como comentó NirIzr, esto ahora es compatible, ya que el equipo de desarrollo de sklearn abordó este problema en https://github.com/scikit-learn/scikit-learn/pull/6173.
FeatureHasher debe manejar correctamente los valores del diccionario de cadenas a partir de la versión 0.18.
Su mejor apuesta para las características no numéricas es transformar las teclas usted mismo de forma similar a como DictVectorizer
hace DictVectorizer
.
values = [
{''city_Dubai'':1., ''temperature'': 33.},
{''city_London'':1., ''temperature'': 12.},
{''city_San Fransisco'':1., ''temperature'': 18.}
]
Podrías hacer esto con una función de pitón.
def transform_features(orig_dict):
transformed_dict = dict()
for name, value in orig_dict.iteritems():
if isinstance(value , str):
name = "%s_%s" % (name,value)
value = 1.
transformed_dict[name] = value
return transformed_dict
Ejemplo de uso:
transform_features({''city_Dubai'':1., ''temperature'': 33.})
# Returns {''city_Dubai'': 1.0, ''temperature'': 33.0}
Es un problema conocido de sklearn: FeatureHasher no admite actualmente valores de cadena para su formato de entrada dict
Esto ahora es compatible, ya que el equipo de desarrollo de sklearn abordó este problema en https://github.com/scikit-learn/scikit-learn/pull/6173
FeatureHasher
debe manejar correctamente los valores del diccionario de cadenas a partir de la versión 0.18.
Tenga en cuenta que aún existen diferencias entre FeatureHasher
y DictVectorizer
. A saber, DictVectorizer
todavía maneja None
valores (aunque tengo curiosidad de cómo), mientras que FeatureHasher
explícitamente se queja con el mismo error experimentado OP.
Si todavía está experimentando el "TypeError: se requiere un float" con la versión de sklearn> = 0.18, es probable que se deba a este problema, y tiene un valor None
.
No hay una manera fácil de depurar esto, y terminé modificando el código de sklearn para atrapar la excepción TypeError e imprimir el último elemento proporcionado. Lo hice editando la función _iteritems()
en la parte superior de sklearn/feature_extraction/hashing.py