由于维度不同,无法在scikit-learn中使用FeatureUnion

14

我正在尝试使用FeatureUnion从数据结构中提取不同的特征,但由于维度不同而失败:ValueError: blocks[0,:] has incompatible row dimensions


实现

我的FeatureUnion是这样构建的:

    features = FeatureUnion([
        ('f1', Pipeline([
            ('get', GetItemTransformer('f1')),
            ('transform', vectorizer_f1)
        ])),
        ('f2', Pipeline([
            ('get', GetItemTransformer('f2')),
            ('transform', vectorizer_f1)
        ]))
    ])

GetItemTransformer 用于从相同结构的数据中获取不同部分。这个想法在 scikit-learn 的问题追踪器here中有描述。

结构本身存储为{'f1': data_f1, 'f2': data_f2},其中data_f1是具有不同长度的不同列表。


问题

由于 Y 向量与数据字段不同,我假设错误发生了,但是如何将向量缩放以适应两种情况?


一个简短而不太好的解决方案是将“data_f1”和“data_f2”连接到“data_f2”的长度,并将Y向量的长度设置为“data_f2”。 - jwacalex
2个回答

7
这是我做过的有效方法:
class ArrayCaster(BaseEstimator, TransformerMixin):
  def fit(self, x, y=None):
    return self

  def transform(self, data):
    print data.shape
    print np.transpose(np.matrix(data)).shape
    return np.transpose(np.matrix(data))

FeatureUnion([('text', Pipeline([
            ('selector', ItemSelector(key='text')),
            ('vect', CountVectorizer(ngram_range=(1,1), binary=True, min_df=3)),
            ('tfidf', TfidfTransformer())
          ])
        ),

        ('other data', Pipeline([
            ('selector', ItemSelector(key='has_foriegn_char')),
            ('caster', ArrayCaster())
          ])
        )])

3
我不知道这是否适用于你的问题,但我们在稍微不同的情况下遇到了相同的错误,并解决了它。
我们的f1条目每个都是由15个数字值组成的列表,我们需要对f2进行tf-idf。这产生了关于不兼容行维度的相同错误。
在通过调试器运行后,我们发现进入FeatureUnion中的hstack()调用之前,矩阵的形状略有不同:(2569,)(2659, 706)
如果我们将f1转换为2D numpy数组,则形状将更改为(2659, 15),并且hstack调用将起作用。
转换类似于这样:f1 = np.array(list(f1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接