python - ColumnTransformer 两次创建估算器(并覆盖默认参数)
问题描述
假设我有以下 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
未提供,因此在实际聚类期间会导致错误。
知道我在这里想念什么吗?
解决方案
所以,这花了我一段时间才弄清楚,但ColumnTransformer
实际上会克隆你提供的转换器,当你打电话fit
或fit_transform
。
scikit.base.clone的工作方式是它通过 获取估计器的参数get_params
,然后set_params
使用相同的值调用新实例。
BaseEstimator
get_params
已经为and提供了默认实现set_params
,但他们假设您将拥有与 parameter 同名的属性,在我的情况下这不是真的(self._nclusters = nclusters
由于下划线)。
修复后,一切都按预期工作。
推荐阅读
- c - 如何在文件中写入char变量?
- python - 用 pandas 连接字符串中每个单词的前 N 个字符
- ruby-on-rails - 如何将此嵌入 HTML 块转换为 ApplicationHelper 文件夹中的 Ruby 帮助器方法?
- python - PyBox2D - NoneType 在碰撞过滤期间不可下标
- ios - SWIFT ARKIT 检测手和指甲,并将物体放在指甲上?
- angular - 角材料表过滤不刷新
- ios - XCode 不包含在 iOS 13.3 上构建的文件
- python - 通过对现有列执行操作来创建新的数据框列
- elasticsearch - 如何在 Kibana 中安装/启用 Elastic APM 仪表板
- python - 无法从子进程激活 Conda 环境