Ответ 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. Я не использовал его сам, но он мог бы предложить вам решение.