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

时间:2019-11-05 15:42:59

标签: python machine-learning scikit-learn gmm

我正在使用sklearn的GaussianMixture分类器。我有来自两个不同说话者的一些数据(用于说话者识别的MFCC功能)。每个人有60个具有13个特征的向量(总共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))

1 个答案:

答案 0 :(得分:1)

简短的回答:您只需使用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的研究科学家,并且是第一个被授予machine-learning gold badge的人,网址为这样)

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

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

  

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

我想早在2017年,当上面的回复写出来的时候,就不存在了。但是,深入研究提供的代码,您将意识到GMM模型实际上是按照上面lejlot提出的方式在那里使用的;没有以classifier.fit(X_train, y_train)形式出现的没有语句-所有用法都以classifier.fit(X_train)的形式出现,即不使用实际标签。

这正是我们希望从类似 clustering 的算法(实际上就是GMM所期望的),而不是分类器所期望的。再次,scikit-learn提供了在GMM fit method中提供标签的选项:

  

fit ((自我,X,y =无)

您在这里实际使用过的

(正如上面的回答所暗示的那样,也许在2017年还不存在),但是,鉴于我们对GMM及其用法的了解,目前尚不清楚该参数在哪里因为(并且,我可以说,scikit-learn在一些实践上占有一定的份额,这些实践从纯粹的 programming 角度来看似乎很明智,但是从 modeling 来看却毫无意义透视)。

最后一句话:尽管将随机种子(如评论中所建议的)固定为“工作”,但相信“分类器”可提供0.4到0.7之间的精度范围,具体取决于随机种子可以说不是一个好主意...