我使用的是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 (sklearnfeature_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版本的字符串字典值。
对于非数字功能,最好的选择是像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}
由于sklearn开发团队在https://github.com/scikit-learn/scikit-learn/pull/6173
FeatureHasher
应正确处理0.18版本的字符串字典值。
请记住,FeatureHasher
和DictVectorizer
之间仍然存在差异。也就是说,DictVectorizer
仍然处理None
值(尽管我很好奇如何处理),而FeatureHasher
则明确地抱怨它遇到了相同的错误OP。
如果您仍然遇到sklearn版本>=0.18的"TypeError:a float is required",则可能是由于此问题,并且您有一个None
值。
没有简单的方法来调试它,我最终修改了sklearn的代码,以捕获TypeError异常并打印提供的最后一项。我通过编辑sklearn/feature_extraction/hashing.py
顶部的_iteritems()
函数来实现这一点
这是一个已知的sklearn问题:FeatureHasher当前不支持dict输入格式的字符串值
https://github.com/scikit-learn/scikit-learn/issues/4878