提供的模型不是 YellowBrick 中的聚类估计器

Posted

技术标签:

【中文标题】提供的模型不是 YellowBrick 中的聚类估计器【英文标题】:The supplied model is not a clustering estimator in YellowBrick 【发布时间】:2020-02-27 03:29:10 【问题描述】:

我正在尝试使用 YellowBrick 的 KElbowVisualizer 和 SKLearn 的期望最大化算法类:GaussianMixture 为我的数据可视化肘部图。

当我运行它时,我得到标题中的错误。 (我也试过 ClassificationReport,但也失败了)

model = GaussianMixture()

data = get_data(data_name, preprocessor_name, train_split=0.75)
X, y, x_test, y_test = data

visualizer = KElbowVisualizer(model, k=(4,12))
visualizer.fit(X)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure

我在 YellowBrick 中找不到任何东西来帮助我估计期望最大化的组件数量。

【问题讨论】:

【参考方案1】:

Yellowbrick uses the sklearn estimator type checks 确定模型是否非常适合可视化。您可以使用 force_model param 绕过类型检查(尽管似乎需要更新 KElbow 文档)。

但是,即使force_model=True 让您通过YellowbrickTypeError,它仍然不意味着GaussianMixture 可以与KElbow 一起使用。这是因为肘部可视化器设置为与质心聚类 API 一起使用,并且需要 n_clusters 超参数和 labels_ 学习参数。期望最大化模型不支持此 API。

但是,可以围绕高斯混合模型创建一个包装器,使其能够与肘部可视化器一起使用(分类报告也可以使用类似的方法)。

from sklearn.base import ClusterMixin
from sklearn.mixture import GaussianMixture
from yellowbrick.cluster import KElbow
from yellowbrick.datasets import load_nfl

class GMClusters(GaussianMixture, ClusterMixin):

    def __init__(self, n_clusters=1, **kwargs):
        kwargs["n_components"] = n_clusters
        super(GMClusters, self).__init__(**kwargs)

    def fit(self, X):
        super(GMClusters, self).fit(X)
        self.labels_ = self.predict(X)
        return self 


X, _ = load_nfl()
oz = KElbow(GMClusters(), k=(4,12), force_model=True)
oz.fit(X)
oz.show()

这确实会产生一个 KElbow 图(虽然对于这个特定的数据集来说不是一个很好的图):

另一个答案提到了Calinksi Harabasz 分数,您可以在KElbow 可视化工具中使用如下:

oz = KElbow(GMClusters(), k=(4,12), metric='calinski_harabasz', force_model=True)
oz.fit(X)
oz.show()

创建包装器并不理想,但对于不适合标准分类器或集群器 sklearn API 的模型类型,它们通常是必要的,并且对于许多 ML 任务来说,这是一个很好的策略。

【讨论】:

这是一个很好的答案,谢谢!它真的应该在 YB 文档中 这太棒了!我不知道 API 是否在编写后发生了变化,但我通过跳过 __init__() 覆盖并将 kwargs 键覆盖添加到 set_params()get_params()... 得到了很好的结果......这样,我能够使用所有评分指标,包括失真。添加为单独的答案,但我猜这可能只是编辑......【参考方案2】:

您可以使用 sklearn calinski_harabasz_score- 请参阅相关文档 here。

scores = pd.DataFrame()
components = 100
for n in range(2,components):
    model = GaussianMixture(n_components=n)
    y = model.fit_predict(X)
    scores.loc[n,'score'] = calinski_harabasz_score(X,y)
plt.plot(scores.reset_index()['index'],scores['score'])

这样的东西应该提供类似的功能。

【讨论】:

【参考方案3】:

基于@bbengfort 的出色答案,我使用了:

class GaussianMixtureCluster(GaussianMixture, ClusterMixin):
    """Subclass of GaussianMixture to make it a ClusterMixin."""

    def fit(self, X):
        super().fit(X)
        self.labels_ = self.predict(X)
        return self

    def get_params(self, **kwargs):
        output = super().get_params(**kwargs)
        output["n_clusters"] = output.get("n_components", None)
        return output

    def set_params(self, **kwargs):
        kwargs["n_components"] = kwargs.pop("n_clusters", None)
        return super().set_params(**kwargs)

这让您可以使用任何评分指标,并与最新版本的 YellowBrick 配合使用。

【讨论】:

以上是关于提供的模型不是 YellowBrick 中的聚类估计器的主要内容,如果未能解决你的问题,请参考以下文章

各类聚类算法该如何选择

聚类:层次聚类基于划分的聚类(k-means)基于密度的聚类基于模型的聚类

Python中的聚类——图像聚类

高维数据的聚类小记

用于获得相等大小的聚类的聚类算法

独家 | 如何正确选择聚类算法?