Получение имен функций из конвейера FeatureUnion +

Я использую FeatureUnion для объединения функций, найденных в заголовке и описании событий:

union = FeatureUnion(
    transformer_list=[
    # Pipeline for pulling features from the event title
        ('title', Pipeline([
            ('selector', TextSelector(key='title')),
            ('count', CountVectorizer(stop_words='english')),
        ])),

        # Pipeline for standard bag-of-words model for description
        ('description', Pipeline([
            ('selector', TextSelector(key='description_snippet')),
            ('count', TfidfVectorizer(stop_words='english')),
        ])),
    ],

    transformer_weights ={
            'title': 1.0,
            'description': 0.2
    },
)

Однако вызов union.get_feature_names() дает мне ошибку: "Заголовок трансформатора (тип Pipeline) не предоставляет get_feature_names". Я хотел бы увидеть некоторые из функций, которые генерируются моими разными Vectorizers. Как это сделать?

Ответ 1

Это потому, что вы используете настраиваемый трансфоктор под названием TextSelector. Вы реализовали get_feature_names в TextSelector?

Вам нужно будет реализовать этот метод в своем пользовательском преобразовании, если вы хотите, чтобы это работало.

Вот вам конкретный пример:

from sklearn.datasets import load_boston
from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.base import TransformerMixin
import pandas as pd

dat = load_boston()
X = pd.DataFrame(dat['data'], columns=dat['feature_names'])
y = dat['target']

# define first custom transformer
class first_transform(TransformerMixin):
    def transform(self, df):
        return df

    def get_feature_names(self):
        return df.columns.tolist()


class second_transform(TransformerMixin):
    def transform(self, df):
        return df

    def get_feature_names(self):
        return df.columns.tolist()



pipe = Pipeline([
       ('features', FeatureUnion([
                    ('custom_transform_first', first_transform()),
                    ('custom_transform_second', second_transform())
                ])
        )])

>>> pipe.named_steps['features']_.get_feature_names()
['custom_transform_first__CRIM',
 'custom_transform_first__ZN',
 'custom_transform_first__INDUS',
 'custom_transform_first__CHAS',
 'custom_transform_first__NOX',
 'custom_transform_first__RM',
 'custom_transform_first__AGE',
 'custom_transform_first__DIS',
 'custom_transform_first__RAD',
 'custom_transform_first__TAX',
 'custom_transform_first__PTRATIO',
 'custom_transform_first__B',
 'custom_transform_first__LSTAT',
 'custom_transform_second__CRIM',
 'custom_transform_second__ZN',
 'custom_transform_second__INDUS',
 'custom_transform_second__CHAS',
 'custom_transform_second__NOX',
 'custom_transform_second__RM',
 'custom_transform_second__AGE',
 'custom_transform_second__DIS',
 'custom_transform_second__RAD',
 'custom_transform_second__TAX',
 'custom_transform_second__PTRATIO',
 'custom_transform_second__B',
 'custom_transform_second__LSTAT']

Имейте в виду, что Feature Union собирается объединить два списка, испускаемых из соответствующего get_feature_names от каждого из ваших трансформаторов. поэтому вы получаете сообщение об ошибке, когда один или несколько ваших трансформаторов не имеют этого метода.

Однако я вижу, что это само по себе не будет устранять вашу проблему, поскольку объекты Pipeline не имеют в них метода get_feature_names, и у вас есть вложенные конвейеры (конвейеры внутри Feature Unions.). Таким образом, у вас есть два варианта:

  • Подклассы и добавьте его get_feature_names метод самостоятельно, который получает имена функций из последнего трансформатора в цепочке.

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

Кроме того, имейте в виду, что многие sklearn, встроенные в трансформаторы, не работают с DataFrame, но передают массивы numpy вокруг, поэтому просто следите за этим, если вы собираетесь объединять множество трансформаторов вместе. Но я думаю, что это дает вам достаточно информации, чтобы дать вам представление о том, что происходит.

Еще одна вещь, посмотрите sklearn-pandas. Я не использовал его сам, но он мог бы предложить вам решение.