使用Scikit-learn包的ClusterMixin
【摘要】 ClusterMixin 是 scikit-learn 中的一个基础混入类 (Mixin class),它的核心作用是为所有聚类估计器(cluster estimators)提供一个统一、标准化的 API 接口。简单来说,它像一份“设计蓝图”,确保了 K-Means、DBSCAN 等所有聚类算法都遵循相同的方法命名和调用方式,极大地提升了使用的便捷性和代码的一致性。 🎯 主要功能Clust...
ClusterMixin 是 scikit-learn 中的一个基础混入类 (Mixin class),它的核心作用是为所有聚类估计器(cluster estimators)提供一个统一、标准化的 API 接口。
简单来说,它像一份“设计蓝图”,确保了 K-Means、DBSCAN 等所有聚类算法都遵循相同的方法命名和调用方式,极大地提升了使用的便捷性和代码的一致性。
🎯 主要功能
ClusterMixin 主要提供以下两个标准化功能:
_estimator_type类属性:这是一个类属性,其值固定为"clusterer"。它用于在框架内部标识该估计器是一个聚类器。fit_predict方法:这是最关键、最常用的方法。它提供了一个便捷的接口,用于一次性执行聚类并返回聚类标签,相当于依次执行fit()和predict()方法。
⚙️ 核心方法:fit_predict
fit_predict 方法是 ClusterMixin 提供的最主要的方法,其定义和使用方式如下:
方法签名:fit_predict(X, y=None, **kwargs)
参数说明:
X:形状为(n_samples, n_features)的输入数据。y:被忽略的参数,仅为了保持与 scikit-learn 其他部分 API 的一致性而存在。**kwargs:需要传递给fit方法的额外参数(此功能在 1.4 版本中新增)。
返回值:
- 返回一个形状为
(n_samples,)的 NumPy 数组,其中包含了每个样本的聚类标签。
💻 如何使用
ClusterMixin 最常见的用法是与 BaseEstimator 结合,来创建自定义的聚类器。
1. 创建一个简单的自定义聚类器
下面的代码演示了如何创建一个将所有样本都归为同一类的自定义聚类器:
import numpy as np
from sklearn.base import BaseEstimator, ClusterMixin
class MyClusterer(ClusterMixin, BaseEstimator):
def fit(self, X, y=None):
# 在这里实现你的聚类逻辑,并将结果存储在 self.labels_ 中
# self.labels_ 是 scikit-learn 中存储聚类标签的约定俗成的属性名
self.labels_ = np.ones(shape=(len(X),), dtype=np.int64)
return self
# 使用自定义聚类器
X = [[1, 2], [2, 3], [3, 4]]
labels = MyClusterer().fit_predict(X)
print(labels) # 输出: array([1, 1, 1])
2. 实际应用案例:InductiveClusterer
ClusterMixin 的一个更高级的应用是创建“归纳式聚类器”。这在处理海量数据时非常有用,因为许多聚类算法(如 AgglomerativeClustering)无法直接对新样本进行预测,每次新增数据都可能需要重新计算,成本高昂。
InductiveClusterer 的思路是:
- 使用一个聚类器(如
AgglomerativeClustering)对部分数据进行聚类。 - 然后,训练一个分类器(如
RandomForestClassifier)来学习这些聚类标签。 - 之后,对于任何新数据,都可以直接使用这个分类器进行快速预测,而无需重新聚类。
官方示例中的实现片段如下:
from sklearn.base import BaseEstimator, ClusterMixin, clone
from sklearn.cluster import AgglomerativeClustering
from sklearn.ensemble import RandomForestClassifier
class InductiveClusterer(ClusterMixin, BaseEstimator):
def __init__(self, clusterer, classifier):
self.clusterer = clusterer
self.classifier = classifier
def fit(self, X, y=None):
# 1. 先进行聚类
self.clusterer_ = clone(self.clusterer)
y = self.clusterer_.fit_predict(X)
# 2. 再用分类器学习聚类结果
self.classifier_ = clone(self.classifier)
self.classifier_.fit(X, y)
self.labels_ = y
return self
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)