Я хотел бы использовать конвейер, включающий TfidfVectorizer
и SVC
.Однако между ними я хотел бы объединить некоторые функции, извлеченные из нетекстовых данных, с выходными данными TfidfVectorizer
.
. Я попытался создать собственный класс (подход, основанный на этом учебном пособии ) чтобы сделать это, но это, похоже, не работает.
Вот что я пробовал до сих пор:
pipeline = Pipeline([
('tfidf', TfidfVectorizer()),
('transformer', CustomTransformer(one_hot_feats)),
('clf', MultinomialNB()),
])
parameters = {
'tfidf__min_df': (5, 10, 15, 20, 25, 30),
'tfidf__max_df': (0.8, 0.9, 1.0),
'tfidf__ngram_range': ((1, 1), (1, 2)),
'tfidf__norm': ('l1', 'l2'),
'clf__alpha': np.linspace(0.1, 1.5, 15),
'clf__fit_prior': [True, False],
}
grid_search = GridSearchCV(pipeline, parameters, cv=5, n_jobs=-1, verbose=1)
grid_search.fit(df["short description"], labels)
Вот класс CustomTransformer
class CustomTransformer(TransformerMixin):
"""Class that concatenates the one hot encode category feature with the tfidf data."""
def __init__(self, one_hot_features):
"""Initializes an instance of our custom transformer."""
self.one_hot_features = one_hot_features
def fit(self, X, y=None, **kwargs):
"""Dummy fit function that does nothing particular."""
return self
def transform(self, X, y=None, **kwargs):
"""Adds our external features"""
return numpy.hstack((one_hot_feats, X))
Этот подход работает до тех пор, пока X не изменяет измерения внутри пользовательского класса (возможно, это связано с TransformerMixin), однако в моем случае к моим данным будут добавлены дополнительные функции.Должен ли мой пользовательский класс наследоваться от другого базового класса или существует другой подход для решения этой проблемы?