Scikit-learn TransformerMixin: объект 'numpy.ndarray' не имеет атрибута 'fit' - PullRequest
0 голосов
/ 25 января 2019

Я хочу построить трубопровод Sklearn (часть более крупного трубопровода), который:

  1. кодировать категориальные столбцы (OneHotEncoder)
  2. уменьшить размер (СВД)
  3. добавить числовые столбцы (без преобразования)
  4. Сводные строки (pandas groupby)

Я использовал этот пример конвейера:

и это пример для пользовательского TranformerMixin:

На шаге 4 появляется ошибка (нет ошибки, если я комментирую шаг 4):

AttributeError Traceback (самый последний вызов последний) в () ----> 1 X_train_transformed = pipe.fit_transform (X_train) .... AttributeError: у объекта 'numpy.ndarray' нет атрибута 'fit'

Мой код:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.decomposition import TruncatedSVD
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.compose import ColumnTransformer

# does nothing, but is here to collect numerical columns
class nothing(BaseEstimator, TransformerMixin):

    def fit(self, X, y=None):       

        return self

    def transform(self, X):          

        return X


class Aggregator(BaseEstimator, TransformerMixin):

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        X = pd.DataFrame(X)
        X = X.rename(columns = {0 :'InvoiceNo', 1 : 'amount', 2:'Quantity', 
                                3:'UnitPrice',4:'CustomerID' })
        X['InvoiceNo'] =  X['InvoiceNo'].astype('int')
        X['Quantity'] = X['Quantity'].astype('float64')
        X['UnitPrice'] = X['UnitPrice'].astype('float64')
        aggregations = dict()
        for col in range(5, X.shape[1]-1) :
            aggregations[col] = 'max'

        aggregations.update({ 'CustomerID' : 'first',
                            'amount' : "sum",'Quantity' : 'mean', 'UnitPrice' : 'mean'})

        # aggregating all basket lines
        result = X.groupby('InvoiceNo').agg(aggregations)

        # add number of lines in the basket
        result['lines_nb'] = X.groupby('InvoiceNo').size()
        return result

        numeric_features = ['InvoiceNo','amount', 'Quantity', 'UnitPrice', 
                           'CustomerID']
        numeric_transformer = Pipeline(steps=[('nothing', nothing())])

        categorical_features = ['StockCode', 'Country']   

        preprocessor =  ColumnTransformer(
        [
        # 'num' transformer does nothing, but is here to  
        # collect numerical columns
        ('num', numeric_transformer ,numeric_features ),
        ('cat', Pipeline([
            ('onehot', OneHotEncoder(handle_unknown='ignore')),
            ('best', TruncatedSVD(n_components=100)),
         ]), categorical_features)        
          ]
          )

# edit with Artem solution
# aggregator = ('agg', Aggregator())

pipe = Pipeline(steps=[
                      ('preprocessor', preprocessor),
                      # edit with Artem solution
                      # ('aggregator', aggregator),
                      ('aggregator', Aggregator())
                     ])

X_train_transformed = pipe.fit_transform(X_train)

1 Ответ

0 голосов
/ 25 января 2019

Шаги конвейера взяты из ('name', Class), но исходное задание имело:

aggregator = ('agg', Aggregator())`

pipe = Pipeline(steps=[
                      ('preprocessor', preprocessor),
                      ('aggregator', aggregator),
])

который сделал это ('aggregator', ('agg', Aggregator()))

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