(Python)使用带有字符串的sklearn类的DictVectoriser

时间:2016-09-20 10:48:07

标签: python pandas scikit-learn

提前为我的期望道歉将是一个简单的问题/答案。这是python和sklearn的新手。我有一个变量(pandas数据帧列),它是一个unicode字符串列表。我想使用sklearn中的DictVectorizer类将其解压缩为一个热编码矩阵,其中每列是可能的字符串值之一,矩阵中的每个值都是一个二进制值,表示该值是否存在于那份清单。

DictVectorizer文档中的示例如下:

    # example from docs from sklearn.feature_extraction import DictVectorizer 
    v = DictVectorizer(sparse=False) 
    D = [{'foo': 1, 'bar': 2}, {'foo': 3, 'baz': 1}] 
    X = v.fit_transform(D) 
    X

这会按照承诺返回矢量化数组,但在我的情况下,我想传递一个unicode字符串列表,例如:

   # my case
   D = [[u"foo", u"bar"], [u"foo"]]
   X = v.fit_transform(D)

在这里我收到了一个错误。

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-48-6a41384fcd8f> in <module>()
      1 # my case
      2 D = [[u"foo", u"bar"], [u"foo"]]
----> 3 X = v.fit_transform(D)

/opt/conda/lib/python2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.pyc in fit_transform(self, X, y)
    224             Feature vectors; always 2-d.
    225         """
--> 226         return self._transform(X, fitting=True)
    227 
    228     def inverse_transform(self, X, dict_type=dict):

/opt/conda/lib/python2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.pyc in _transform(self, X, fitting)
    160         # same time
    161         for x in X:
--> 162             for f, v in six.iteritems(x):
    163                 if isinstance(v, six.string_types):
    164                     f = "%s%s%s" % (f, self.separator, v)

/opt/conda/lib/python2.7/site-packages/sklearn/externals/six.pyc in iteritems(d, **kw)
    437 def iteritems(d, **kw):
    438     """Return an iterator over the (key, value) pairs of a dictionary."""
--> 439     return iter(getattr(d, _iteritems)(**kw))
    440 
    441 def iterlists(d, **kw):

AttributeError: 'list' object has no attribute 'iteritems'

2 个答案:

答案 0 :(得分:1)

如评论和@Muthu的答案中所述,x=[1:10]; y=x.^2; plot(x,y); xline(4); 的输入格式为dict。

如果元素计数使用DictVectorizer,否则,如果需要将其作为一种热编码,请在Counter函数中使用set

lambda

答案 1 :(得分:0)

@EdChum的回复帮助我弄清了问题所在。我认为以下方法可以解决问题。

D = [[u"foo", u"bar"], [u"foo"]]
from collections import Counter
q=dict(Counter(x for xs in D for x in set(xs)))
X = v.fit_transform(q)

我将类型更改为fit_transform期望的类型,即字典。我知道它很晚,但是由于该线程在“ DictVectorizer fit_transform”搜索结果中具有较高的优先级,因此我认为它可能会对某些人有所帮助。如果可能,请发表评论以解决问题。