提前道歉,因为我预计这将是一个简单的问题/答案。这里是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'
正如评论和@Muthu的回答所提到的,DictVectorizer
的输入格式是dict。
如果您使用Counter
的元素计数,如果您需要它作为一个热编码,在lambda
函数中使用set
。
import pandas as pd
from collections import Counter
from sklearn.feature_extraction import DictVectorizer
D = [[u"foo", u"bar"], [u"foo"]]
df = pd.DataFrame({'my_col': D})
x = df['my_col'].apply(lambda x: dict(Counter(x)))
DictVectorizer(sparse=False).fit_transform(x)
#array([[1., 1.],
# [0., 1.]])
@EdChum的回复帮助我找到了问题所在。我想下面的方法可以解决这个问题。
from collections import Counter
D = [[u"foo", u"bar"], [u"foo"]]
q = dict(Counter(x for xs in D for x in set(xs)))
X = v.fit_transform(q)
我正在将类型更改为fit_transform
期望的类型。, a dictionary
。我知道它晚了,但因为这个线程打开了"DictVectorizer fit_transform"搜索结果的高优先级,我想它可能会帮助一些人。如果可能,请评论是否解决了问题。