提前为我的期望道歉将是一个简单的问题/答案。这是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'
答案 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”搜索结果中具有较高的优先级,因此我认为它可能会对某些人有所帮助。如果可能,请发表评论以解决问题。