TypeError: a float is required in sklearn.feature_extraction.FeatureHasher
TypeError: a float is required in sklearn.feature_extraction.FeatureHasher
我正在使用 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
中解决了这个问题
从 0.18 版开始,FeatureHasher 应该可以正确处理字符串字典值。
非数字特征的最佳选择是像 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 问题:
FeatureHasher 目前不支持其字典输入格式的字符串值
现在支持,因为 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 版本 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
中解决了这个问题从 0.18 版开始,FeatureHasher 应该可以正确处理字符串字典值。
非数字特征的最佳选择是像 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 问题: FeatureHasher 目前不支持其字典输入格式的字符串值
现在支持,因为 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()
函数来做到这一点