ColumnTransformer两次创建估算器(并覆盖默认参数)

假设我有以下DataFrame(当然,过分简化):

df = pd.DataFrame([
   'Hello','Bye','Hello','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

请注意,所有内容均已以01进行编码(我提供的示例是真实数据的真正简化版本)

我创建了以下转换:

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

但是,执行后:

ctf.fit_transform(df)

我得到以下印刷声明:

__init__(2)
__init__(None)

由于未提供n_clusters,因此在实际群集期间会导致错误。

我在这里想念什么吗?

chengyi275 回答:ColumnTransformer两次创建估算器(并覆盖默认参数)

因此,这花了我一段时间才能弄清楚,但是当您致电ColumnTransformerfit时,fit_transform实际上会clone your provided transformers

scikit.base.clone 的工作方式是,它通过get_params获取估算器的参数,然后在具有相同值的新实例上调用set_params

BaseEstimator已经提供了get_paramsset_params的默认实现,但是they assume that you'll have attributes with the same name as the parameter,在我的情况下是不正确的(由于下划线,self._nclusters = nclusters

修复该问题后,一切都会按预期进行。

本文链接:https://www.f2er.com/3156591.html

大家都在问