TypeError:sklearn.feature_extraction.FeatureHasher中需要一个float

时间:2015-11-29 12:23:13

标签: python hash scikit-learn feature-extraction

我使用的是sklearn版本0.16.1。似乎FeatureHasher不支持字符串(如DictVectorizer所做的那样)。 例如:

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

但收到以下错误:

    _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

我无法使用DictVectorizer因为我的数据集很大而且功能具有很高的基数,所以我得到了一个MemoryError。 有什么建议吗?

更新(2016年10月):

正如NirIzr评论的那样,现在支持这一点,因为sklearn开发团队在https://github.com/scikit-learn/scikit-learn/pull/6173

中解决了这个问题

FeatureHasher应该正确处理版本0.18的字符串字典值。

3 个答案:

答案 0 :(得分:2)

对于非数字功能,最好的选择是自己转换键,类似于DictVectorizer的做法。

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

您可以使用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

使用示例:

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

答案 1 :(得分:1)

现在支持此功能,因为sklearn开发团队在https://github.com/scikit-learn/scikit-learn/pull/6173

中解决了此问题

NSDate应该正确处理版本0.18的字符串字典值。

请注意,FeatureHasherFeatureHasher之间仍有差异。也就是说,DictVectorizer仍会处理DictVectorizer值(虽然我很好奇),而None明确抱怨它与OP遇到的错误相同。

如果您仍然遇到" TypeError:需要浮动"使用sklearn版本> = 0.18,可能是由于此问题,您的值为FeatureHasher

没有简单的方法来调试它,我最终修改了sklearn的代码以捕获TypeError异常并打印提供的最后一项。 我是通过修改None

顶部的_iteritems()函数完成的

答案 2 :(得分:0)

这是一个众所周知的问题: FeatureHasher当前不支持其dict输入格式的字符串值

https://github.com/scikit-learn/scikit-learn/issues/4878