Объединить функции в Sklearn Pipeline - PullRequest
1 голос
/ 24 сентября 2019

Я хотел бы использовать конвейер, включающий 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), однако в моем случае к моим данным будут добавлены дополнительные функции.Должен ли мой пользовательский класс наследоваться от другого базового класса или существует другой подход для решения этой проблемы?

1 Ответ

1 голос
/ 24 сентября 2019

Вы можете комбинировать несколько объектов, используя Sklearn * FeatureUnion , и преобразовывать определенные столбцы, используя ColumnTransformer :

из документы :

FeatureUnion

Объединяет результаты нескольких объектов преобразователя.

Этот оценщик применяет список преобразователяобъекты параллельно с входными данными, затем объединяет результаты.Это полезно для объединения нескольких механизмов извлечения признаков в один трансформатор.

ColumnTransformer

Применяет преобразователи к столбцам массива или панд DataFrame.

Этот оценщик позволяет преобразовывать разные столбцы или подмножества входных данных по отдельности, а объекты, генерируемые каждым преобразователем, будут объединяться для формирования единого пространства признаков.Это полезно для разнородных или столбчатых данных, чтобы объединить несколько механизмов или преобразований в один трансформатор.

В вашем случае вы можете сделать это, используя make_column_transformer

from sklearn.compose import make_column_transformer
pipeline = Pipeline([
    ('transformer',  make_column_transformer((TfidfVectorizer(), ['text_column']),
                                             (OneHotEncoder(), ['categorical_column']),)),
    ('clf', MultinomialNB()),
])

РЕДАКТИРОВАТЬ:

установить remainder в 'passthrough' в make_column_transformer так что все остальныестолбцы, которые не были указаны в преобразователях, будут автоматически пропущены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...