Это потому, что вы используете специальный трансформер под названием 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
каждым из ваших преобразователей. вот почему вы получаете сообщение об ошибке, если один или несколько ваших трансформаторов не имеют этого метода.
Однако я вижу, что это само по себе не решит вашу проблему, поскольку в объектах конвейера нет get_feature_names
метода, а у вас есть вложенные конвейеры (конвейеры в рамках Feature Unions). Итак, у вас есть два варианта:
Создайте подкласс Pipeline и добавьте его get_feature_names
метод, который получает имена функций из последнего преобразователя в цепочке.
Извлеките сами имена функций из каждого из трансформаторов, что потребует от вас самого вытащить эти трансформаторы из конвейера и вызвать на них get_feature_names
.
Кроме того, имейте в виду, что многие встроенные в преобразователи sklearn не работают с DataFrame, а передают множество массивов, поэтому просто следите за этим, если вы собираетесь объединять множество преобразователей вместе. Но я думаю, что это дает вам достаточно информации, чтобы дать вам представление о том, что происходит.
Еще одна вещь, взгляните на sklearn-pandas. Я сам не использовал его, но он может предоставить вам решение.
person
hamel
schedule
09.08.2017
union.get_feature_names()
? - person Vivek Kumar   schedule 27.02.2017