sklearn 的高斯混合模型分类器精度不稳定

-1 python machine-learning scikit-learn gmm

我有一些数据(用于说话人识别的 MFCC 功能),来自两个不同的说话人。每个人 60 个包含 13 个特征的向量(总共 120 个)。它们每个都有自己的标签(0 和 1)。我需要在混淆矩阵上显示结果。但GaussianMixturesklearn 的模型不稳定。对于运行的每个程序,我收到不同的分数(有时准确度为 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))
Run Code Online (Sandbox Code Playgroud)

des*_*aut 5

简短的回答:您不应该使用GMM 进行分类。


答案很长...

从相关主题的答案中,使用高斯混合模型与 scikit learn 进行多类分类(原文中的重点):

高斯混合不是分类器。它是一种密度估计方法,期望其组件能够神奇地与您的类保持一致并不是一个好主意。[...] GMM 只是尝试将高斯混合体拟合到您的数据中,但没有什么强制它根据标签放置它们(甚至在拟合调用中没有提供)。有时这会起作用 - 但仅适用于琐碎的问题,其中类分离得很好,甚至朴素贝叶斯也能起作用,但一般来说,它对于解决问题来说根本是无效的工具。

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

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

(就其价值而言,您可能会注意到,受访者是 DeepMind 的一名研究科学家,也是SO 中第一个被授予machine-learning 金徽章的人)

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

确实,在 scikit-learn 文档中有一篇标题为GMM 分类的文章:

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

我想这在 2017 年写下上述回复时还不存在。但是,深入研究所提供的代码,您将意识到 GMM 模型实际上是按照上面 lejlot 提出的方式使用的;没有形式的声明-所有用法都是形式,即不使用实际标签。classifier.fit(X_train, y_train)classifier.fit(X_train)

这正是我们所期望的类聚类算法(实际上就是 GMM),而不是分类器。scikit-learn 确实提供了在GMMfit方法中提供标签的选项:

fit (自身,X,y=无)

您在这里实际使用过(同样,正如上述响应所暗示的那样,在 2017 年可能不存在),但是,鉴于我们对 GMM 及其用法的了解,尚不清楚此参数的用途(并且,请允许我说,scikit-learn 在一些实践中占有一席之地,这些实践从纯粹的编程角度来看可能看起来很合理,但从建模的角度来看却没有多大意义)。

最后一句话:虽然修复随机种子(如评论中所建议的)可能看起来“有效”,但相信根据随机种子给出 0.4 到 0.7 之间的准确度范围的“分类器”可能不是一个好主意。 ..