具有不同特征维度的特征联合



我想用sklearn对一些句子进行分类。这些句子存储在 Pandas 数据帧中。

首先,我想使用句子的长度和它的 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.

必须执行哪些操作才能使此功能组合正常工作?

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

数据中应该有 494 行(样本),这些行(样本)来自TfidfVectorizerLengthAnalyzer只报告一行。因此错误。

如果可以将其更改为

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

然后管道成功安装。

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

相关内容

  • 没有找到相关文章

最新更新