tfidfvectorizer tfidftransformer spanish idf fit_transform countvectorizer python hash scikit-learn feature-extraction

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}



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