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

Python sklearn的高斯混合模型分类器精度不稳定,python,machine-learning,scikit-learn,gmm,Python,Machine Learning,Scikit Learn,Gmm,我有一些来自两个不同扬声器的数据(用于说话人识别的MFCC功能)。每个人13个特征的60个向量(总共120个)。它们每个都有自己的标签(0和1)。我需要在混乱矩阵上显示结果。但是sklearn的高斯混合模型是不稳定的。对于每个程序运行,我都会得到不同的分数(有时精度为0.4,有时为0.7…)。我不知道我做错了什么,因为类似地,我创建了SVM和k-NN模型,它们运行良好(精度稳定在0.9左右)。你知道我做错了什么吗 gmmclf=GaussianMixture(n_分量=2,协方差类型='diag

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

gmmclf=GaussianMixture(n_分量=2,协方差类型='diag')
gmmclf.fit(X_列,y_列)#X_列是mfcc向量,y_列是标签
ygmm_pred_class=gmmclf.predict(X_检验)
打印(准确度评分(y检验,ygmm pred等级))
打印(混淆矩阵(y_测试,ygmm_pred_类))

简短回答:您应该简单地不要使用GMM进行分类


长长的回答

从相关线程的答案(在原文中强调):

高斯混合不是分类器。这是一个密度估计 方法,并期望其组件将与 你的课不是个好主意。[…]GMM只是试图拟合高斯混合 你的数据,但没有什么强迫它放置它们 根据标签(fit中甚至没有提供标签 电话)。有时,这会起作用-但仅适用于琐碎的情况 问题,类之间的分隔非常好,即使是朴素的贝叶斯 将工作,但在一般情况下,它只是一个无效的工具 问题

以及受访者本人的评论(同样,在原文中强调):

正如答案中所述-GMM不是一个分类器,因此询问您 正确使用“GMM分类器”是不可能回答的。使用 GMM作为分类器的定义是不正确的,没有“有效的” 在这样一个问题中使用它的方式,因为它不是这个模型是什么 设计来做的。你能做的就是建立一个适当的生成机制 每班一个型号。换句话说,构建你自己的分类器 您可以为每个标签安装一个GMM,然后使用指定的概率执行此操作 实际分类。那么它就是一个合适的分类器。看见

(不管它值多少钱,你可能会注意到,他是DeepMind的一位研究科学家,也是第一位获得机器学习奖的人)

为了进一步阐述(这就是为什么我没有简单地将问题标记为重复问题):

的确,在scikit学习文档中有一篇文章标题为:

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

我想这在2017年是不存在的,当时写了上述回复。但是,深入研究提供的代码,您会发现GMM模型实际上是按照上面lejlot提出的方式使用的;没有以
分类器的形式出现的语句。fit(X\u-train,y\u-train)
-所有的用法都是以
分类器的形式出现的。fit(X\u-train)
,即不使用实际的标签

这正是我们从类聚类算法(这确实是GMM)中所期望的,而不是从分类器中所期望的。scikit learn同样提供了一个选项,用于在以下位置提供标签:

fit
(self,X,y=None)

您在这里实际使用过(正如上面的回答所暗示的,2017年可能不存在),但是,鉴于我们对GMM及其使用的了解,不清楚该参数的用途(请允许我说,scikit learn在实践方面也有自己的贡献,这些实践从纯编程的角度看可能是合理的,但从建模的角度看却没有什么意义)


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

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