首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提供的模型不是YellowBrick中的聚类估计器

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

Stack Overflow用户
提问于 2019-11-01 02:00:19
回答 3查看 1K关注 0票数 2

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

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

代码语言:javascript
复制
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中找不到任何东西来帮助我估计期望最大化的组件数量。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-09 21:28:25

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

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

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

代码语言:javascript
复制
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可视化工具中使用该分数,如下所示:

代码语言:javascript
复制
oz = KElbow(GMClusters(), k=(4,12), metric='calinski_harabasz', force_model=True)
oz.fit(X)
oz.show()

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

票数 11
EN

Stack Overflow用户

发布于 2019-11-01 05:33:24

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

代码语言:javascript
复制
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'])

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

票数 2
EN

Stack Overflow用户

发布于 2021-03-31 13:28:47

基于@bbengfort的精彩回答,我使用了:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58648969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档