Почему self не является экземпляром класса при использовании конвейеров scikit-learn? - PullRequest
0 голосов
/ 06 апреля 2020

Как видно из заголовка, self из экземпляра класса не является самим экземпляром класса.

Это происходит, когда я использую пользовательский класс с конвейерами scikit-learn, но не когда я использую тот же пользовательский класс отдельно.

import pandas as pd
import numpy as np

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import OneHotEncoder

class multi_feature_OHE(BaseEstimator, TransformerMixin):
    ''' Encode multiple redundant features as one, usign One-Hot-Encoder. '''
    def __init__(self):
        self.encoder = OneHotEncoder(handle_unknown='ignore')

    def fit(self, X):
        #self.encoder.fit(X)
        print(type(self))    # <--- We print the type of self here!
        return self

    def transform(self, X):
        ...

Здесь он печатает <class 'numpy.ndarray'>

pipeline = make_pipeline(...,
                         multi_feature_OHE)
pipeline.fit(data)

В методе fit, self == X и X = = None.

Но здесь он печатает <class '__main__.multi_feature_OHE'>

a = multi_feature_OHE()
a.fit(data)

1 Ответ

0 голосов
/ 06 апреля 2020

Вы должны передать экземпляр класса в конвейер, вы передаете сам объект класса, нет экземпляра . Так что сделайте что-то вроде:

pipeline = make_pipeline(...,
                         multi_feature_OHE())
pipeline.fit(data)

Посмотрите на пример в документах

По сути, конвейер возьмет любой объект и вызовет .fit(X). Если вы передаете только объект класса, то multi_feature_OHE.fit - это просто обычная функция, поэтому первый аргумент будет извлекать массив из последнего преобразования.

Посмотрите на пример в документах

>>> from sklearn.naive_bayes import GaussianNB
>>> from sklearn.preprocessing import StandardScaler
>>> make_pipeline(StandardScaler(), GaussianNB(priors=None))
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('gaussiannb', GaussianNB())])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...