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 问题跟踪器中进行了描述。

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


问题

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

4

2 回答 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())
          ])
        )])
于 2016-10-14T03:23:37.797 回答
3

我不知道这是否适用于您的问题,但我们在稍有不同的情况下遇到了相同的错误并解决了它。

我们的f1条目都是 15 个数值的列表,我们需要在 tf-idf 上执行f2。这对不兼容的行尺寸产生了相同的错误。

在通过调试器运行它之后,我们发现我们的矩阵的形状在hstack()调用FeatureUnion: (2569,)(2659, 706).

如果我们f1转换为 2D numpy 数组,则形状更改为(2659, 15)并且hstack调用有效。

演员阵容是这样的:f1 = np.array(list(f1))

于 2016-02-05T22:09:30.910 回答