【问题标题】:Unstable accuracy of Gaussian Mixture Model classifier from sklearn来自 sklearn 的高斯混合模型分类器的精度不稳定
【发布时间】:2020-03-02 00:43:21
【问题描述】:

我有一些来自两个不同说话人的数据(用于说话人识别的 MFCC 功能)。每个人 13 个特征的 60 个向量(总共 120 个)。他们每个人都有自己的标签(0 和 1)。我需要在混淆矩阵上显示结果。但是来自 sklearn 的 GaussianMixture 模型不稳定。对于每个程序运行,我都会收到不同的分数(有时准确度是 0.4,有时是 0.7 ...)。我不知道我做错了什么,因为类似地我创建了 SVM 和 k-NN 模型并且它们工作正常(稳定精度在 0.9 左右)。你知道我做错了什么吗?

gmmclf = GaussianMixture(n_components=2, covariance_type='diag')
gmmclf.fit(X_train, y_train) #X_train are mfcc vectors, y_train are labels

ygmm_pred_class = gmmclf.predict(X_test)
print(accuracy_score(y_test, ygmm_pred_class))
print(confusion_matrix(y_test, ygmm_pred_class))

【问题讨论】:

  • 在初始化GaussianMixture 模型时,您是否尝试过通过传递random_state 参数的值来修复种子?这样你应该总是得到相同的结果,但它可能不是最好的。
  • 感谢您的帮助!我认为 random_state 从默认设置为 0。但是,如何修复此算法以确保准确性是最好的?

标签: python machine-learning scikit-learn gmm


【解决方案1】:

sklearn 中,gmm 中的簇标签没有任何意义。因此,每次运行 gmm 时,标签可能会有所不同。这可能是结果不可靠的原因之一。

【讨论】:

    【解决方案2】:

    简答:您应该使用 GMM 进行分类。


    长答案...

    来自相关帖子的答案Multiclass classification using Gaussian Mixture Models with scikit learn(强调原文):

    高斯混合不是分类器。这是一个密度估计 方法,并期望它的组件会神奇地与 你的课不是一个好主意。 [...] GMM 只是尝试拟合高斯混合 到您的数据中,但没有什么强迫它放置它们 根据标签(甚至没有提供适合的标签) 称呼)。有时这会起作用 - 但仅适用于琐碎 问题,其中类分离得非常好,甚至朴素贝叶斯 会工作,但一般来说,它只是无效的工具 问题。

    以及受访者本人的评论(再次强调原文):

    如答案所述 - GMM 不是分类器,因此询问您是否 正确使用“GMM 分类器”是不可能回答的。使用 GMM作为分类器的定义是不正确的,没有“有效” 在这样的问题中使用它的方法不是这个模型 设计做的。你可以做的是建立一个适当的生成 每类模型。换句话说,构建您自己的分类器,其中 您每个标签适合一个 GMM,然后使用分配的概率来做 实际分类。那么它是一个适当的分类器。看 github.com/scikit-learn/scikit-learn/pull/2468

    (对于它可能的价值,您可能想注意到 respondent 是 DeepMind 的研究科学家,并且是第一个在 SO 获得 machine-learning gold badge 的人)

    进一步详细说明(这就是为什么我没有简单地将问题标记为重复):

    确实,在 scikit-learn 文档中有一个帖子,标题为GMM classification

    用于分类的高斯混合模型演示。

    我猜这在 2017 年不存在,当时写了上述回复。但是,深入研究提供的代码,您会发现 GMM 模型实际上是以上述 lejlot 提出的方式在那里使用的; classifier.fit(X_train, y_train) 形式的 no 声明 - all 使用形式为 classifier.fit(X_train),即不使用实际标签。

    这正是我们对类似聚类的算法(这确实是 GMM)所期望的,而不是分类器所期望的。同样,scikit-learn 提供了一个选项来提供GMM fit method 中的标签:

    fit (self, X, y=None)

    你在这里实际使用过的(同样,2017 年可能不存在,正如上面的回复所暗示的那样),但是,鉴于我们对 GMM 及其用法的了解,尚不清楚该参数是什么因为(并且,请允许我说,scikit-learn 在实践中占有一席之地,从纯 编程 的角度来看可能看起来很明智,但从 建模 的角度来看却毫无意义视角)。

    最后一句话:尽管修复随机种子(如评论中所建议的那样)可能看起来“起作用”,但相信一个“分类器”可以提供 0.4 到 0.7 之间的准确度范围,具体取决于随机种子可以说是不是一个好主意...

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 2019-11-21
      • 2018-06-10
      • 2021-10-12
      • 1970-01-01
      • 2021-09-30
      • 2018-06-03
      • 2020-05-06
      • 2014-08-02
      相关资源
      最近更新 更多