FeatureUnion использует операцию numpy или scipy разреженную, чтобы объединить выходные данные каждой функции в нем. Следовательно, вы не можете иметь никакого шага в FeatureUnion, который может возвращать нечисловые значения.
Если я изменю ваш pipeline2
, чтобы он возвращал количество символов в данной строке, он начнет работать.
Примечание: вы можете использовать ColumnTransformer
из sklearn.compose
.
import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline, FeatureUnion
class ColumnSelector(BaseEstimator, TransformerMixin):
def __init__(self, key, transform_function=None):
self.key = key
self.transform_function = transform_function
def fit(self, X, y=None, *parg, **kwarg):
return self
def transform(self, X):
result = X[self.key]
if self.transform_function:
result = self.transform_function(result)
return result
data = [
{'col1': 'hello my friend', 'col2': 'somestring_'},
{'col1': 'my friend', 'col2': 'somestring__'},
{'col1': 'hello friend', 'col2': 'somestring___'}
]
df = pd.DataFrame(data)
pipeline_1 = Pipeline([
('selector', ColumnSelector(key='col1')),
('vectorizer', CountVectorizer())
])
pipeline_2 = Pipeline([
('test', ColumnSelector(key='col2',transform_function=lambda x: [[len(i)] for i in x]))#, transform_function=lambda col: col.to_frame())),
])
feats = FeatureUnion([('count_vectorize', pipeline_1), ('original_column', pipeline_2)])
feats.fit_transform(df)