ColumnTransformer создает оценщик дважды (и переопределяет параметр по умолчанию) - PullRequest
0 голосов
/ 05 ноября 2019

Допустим, у меня есть следующий DataFrame ( упрощенно , конечно):

df = pd.DataFrame([
   'Hello', 'Bye', 'Hello', 'Hello', 'Bye', 'Hello', 'Bye', 'Hello'
], columns=['A'])

У меня также есть следующий оценщик / преобразователь, чтобы сгруппировать все значения Aв N кластеров на основе сходства:

class Clusterer(BaseEstimator, TransformerMixin):
    def __init__(self, nclusters=2):
        print('__init__({}) called'.format(nclusters))
        self._vectorizer = CountVectorizer(strip_accents='unicode', stop_words='english')
        self._nclusters = nclusters
    def fit(self, X, y=None):
        # Vectorize all values, then cluster
        self._clusters = [
             KMeans(n_clusters=self._nclusters)
             .fit(self._vectorizer.fit_transform(x))
             for x in X.values.T
        ]
        return self
    def transform(self, X):
        # Return cluster labels
        return np.array([c.labels_ for c in self._clusters])

Обратите внимание на оператор print в __init__

Я надеюсь получить следующее преобразование

A
--
0
1
0
0
0
1
0
1
0

Обратите внимание, что все было закодировано в 0 или 1 (Пример, который я привожу, является действительно упрощенной версией реальных данных)

Я создал следующеепреобразование:

ctf = ColumnTransformer([
    ('a', Clusterer(nclusters=2), ['A'])
])

Однако после выполнения:

ctf.fit_transform(df)

я получаю следующие печатные операторы:

__init__(2)
__init__(None)

Это вызывает ошибки во время фактической кластеризации, потому чтоn_clusters не предоставляется.

Есть идеи о том, что мне здесь не хватает?

1 Ответ

0 голосов
/ 05 ноября 2019

Итак, мне потребовалось некоторое время, чтобы выяснить, но ColumnTransformer на самом деле клонирует предоставленные вами трансформаторы , когда вы звоните fit или fit_transform.

Способ работы scikit.base.clone заключается в том, что он получает параметры оценщика через get_params, а затем вызывает set_params для нового экземпляра с теми же значениями.

BaseEstimator уже предоставляет реализации по умолчанию для get_params и set_params, но они предполагают , что у вас будут атрибуты с тем же именем, что и у параметра , который не являетсяtrue в моем случае (self._nclusters = nclusters из-за подчеркивания).

После исправления все работает как положено.

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