我正在尝试使用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-Vector与数据字段不同,我认为发生了错误,但是如何缩放矢量以适应两种情况呢?
答案 0 :(得分:5)
这对我有用:
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())
])
)])
答案 1 :(得分:2)
我不知道这是否适用于您的问题,但我们在稍微不同的情况下遇到了同样的错误并且解决了它。
我们的f1
条目是每个包含15个数值的列表,我们需要在f2
上执行tf-idf。这会产生与不兼容的行维度相同的错误。
通过调试器运行后,我们发现我们的矩阵形状与hstack()
:FeatureUnion
(2569,)
和(2659, 706)
中的f1
调用略有不同。
如果我们将(2659, 15)
转换为2D numpy数组,则形状更改为hstack
并且f1 = np.array(list(f1))
调用有效。
演员阵容是这样的:my_first_reg[0]
。