由于维度不同,无法在scikitlearn中使用FeatureUnion

2024-10-01 11:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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学习问题跟踪器中描述了here。在

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


问题

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


Tags: 数据结构datagetpipelinetransform特征结构向量
2条回答

以下是对我有效的方法:

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())
          ])
        )])

我不知道这是否适用于你的问题,但我们在稍微不同的情况下遇到了同样的错误,就解决了。在

我们的f1条目是15个数值的列表,我们需要对f2执行tf idf。这就产生了关于不兼容行维度的相同错误。在

在调试器中运行它之后,我们发现在hstack()调用FeatureUnion:(2569,)(2659, 706)时,矩阵的形状有细微的不同。在

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

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

相关问题 更多 >