【问题标题】:TypeError: a float is required in sklearn.feature_extraction.FeatureHasherTypeError:sklearn.feature_extraction.FeatureHasher 中需要浮点数
【发布时间】:2016-10-13 14:56:46
【问题描述】:

我使用的是 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 版起应正确处理字符串字典值。

【问题讨论】:

    标签: python hash scikit-learn feature-extraction


    【解决方案1】:

    非数字功能的最佳选择是自己转换键,类似于 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}
    

    【讨论】:

    • 不幸的是,这个解决方案不是低内存替代方案,也不适合我的大规模(在线)学习。
    • 其实,如果你使用的是稀疏系数向量,内存使用量只取决于使用的特征数量,而不是整个空间。如果您使用的是 SGDClassifier / SGDRegressor,这可能是一个选项。
    【解决方案2】:

    现在支持这一点,因为 sklearn 开发团队在 https://github.com/scikit-learn/scikit-learn/pull/6173 中解决了这个问题

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

    请记住,FeatureHasherDictVectorizer 之间仍然存在差异。即,DictVectorizer 仍然处理 None 值(尽管我很好奇如何处理),而 FeatureHasher 明确地抱怨它,并遇到同样的错误 OP。

    如果您在 sklearn 版本 >= 0.18 时仍然遇到“TypeError: a float is required”,这可能是由于这个问题,并且您有一个 None 值。

    没有简单的方法来调试它,我最终修改了 sklearn 的代码以捕获 TypeError 异常并打印提供的最后一项。 我通过编辑 sklearn/feature_extraction/hashing.py 顶部的 _iteritems() 函数来做到这一点

    【讨论】:

      【解决方案3】:

      这是一个已知的 sklearn 问题: FeatureHasher 目前不支持其 dict 输入格式的字符串值

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 2019-10-16
        相关资源
        最近更新 更多