FeatureUnion具有不同的要素尺寸

时间:2017-10-13 10:41:34

标签: python scipy scikit-learn

我想用sklearn对一些句子进行分类。句子存储在Pandas DataFrame中。

首先,我想使用句子的长度和它的TF-IDF向量作为特征,所以我创建了这个管道:

pipeline = Pipeline([
    ('features', FeatureUnion([
        ('meta', Pipeline([
            ('length', LengthAnalyzer())
        ])),
        ('bag-of-words', Pipeline([
            ('tfidf', TfidfVectorizer())
        ]))
    ])),
    ('model', LogisticRegression())

其中LengthAnalyzer是自定义TransformerMixin,其中包含:

    def transform(self, documents):
        for document in documents:
            yield len(document)

因此,LengthAnalyzer返回一个数字(1维),而TfidfVectorizer返回一个n维列表。

当我尝试运行时,我得到了

ValueError: blocks[0,:] has incompatible row dimensions. Got blocks[0,1].shape[0] == 494, expected 1.

要使此功能组合有效,需要做些什么?

1 个答案:

答案 0 :(得分:2)

似乎问题源自transform()中使用的yield。也许由于yield报告给scipy hstack方法的行数为1而不是documents中的实际样本数。

您的数据中应该有494行(样本)来自TfidfVectorizer,但LengthAnalyzer只报告一行。因此错误。

如果您可以将其更改为

return np.array([len(document) for document in documents]).reshape(-1,1)

然后管道适合成功。

注意: 我尝试在scikit-learn github上找到任何相关问题,但没有成功。您可以在此处发布此问题,以获得有关用法的实际反馈。