python vectorize TypeError: un float est requis dans sklearn.feature_extraction.FeatureHasher




tfidftransformer (3)

J'utilise Sklearn version 0.16.1. Il semble que FeatureHasher ne supporte pas les chaînes (comme le fait DictVectorizer). Par exemple:

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

Mais l'erreur suivante est reçue:

    _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

Je ne peux pas utiliser DictVectorizer car mon jeu de données est très grand et les fonctionnalités sont avec une cardinalité élevée, donc je reçois un MemoryError. Aucune suggestion?

Mise à jour (octobre 2016):

Comme l'a commenté NirIzr, ceci est maintenant supporté, car l'équipe de sklearn dev a abordé ce problème sur https://github.com/scikit-learn/scikit-learn/pull/6173

FeatureHasher doit gérer correctement les valeurs de dictionnaire de chaînes à partir de la version 0.18.


Votre meilleur pari pour les fonctionnalités non numériques est de transformer les clés vous-même de la même manière que DictVectorizer .

values = [
      {'city_Dubai':1., 'temperature': 33.},
      {'city_London':1., 'temperature': 12.},
      {'city_San Fransisco':1., 'temperature': 18.}
      ]

Vous pourriez le faire avec une fonction python.

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

Exemple d'utilisation:

transform_features({'city_Dubai':1., 'temperature': 33.})
# Returns {'city_Dubai': 1.0, 'temperature': 33.0}


Ceci est maintenant supporté, car l'équipe de sklearn dev a abordé ce problème sur https://github.com/scikit-learn/scikit-learn/pull/6173

FeatureHasher doit gérer correctement les valeurs de dictionnaire de chaînes à partir de la version 0.18.

Gardez à l'esprit qu'il existe toujours des différences entre FeatureHasher et DictVectorizer . A savoir, DictVectorizer gère toujours les valeurs None (bien que je suis curieux de savoir comment), tandis que FeatureHasher plaint explicitement à ce sujet avec la même erreur OP expérimenté.

Si vous rencontrez toujours le "TypeError: un float est requis" avec sklearn version> = 0.18, il est probablement dû à ce problème, et vous avez une valeur None .

Il n'y a pas de moyen facile de déboguer ceci, et j'ai fini par modifier le code de sklearn pour attraper l'exception TypeError et imprimer le dernier élément fourni. Je l'ai fait en éditant la fonction _iteritems() en haut de sklearn/feature_extraction/hashing.py







feature-extraction