我正在使用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))
答案 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之间的精度范围,具体取决于随机种子可以说不是一个好主意...