【问题标题】:Wrong classification outputs with sklearn GMM classifiersklearn GMM 分类器的错误分类输出
【发布时间】:2014-01-02 19:38:48
【问题描述】:

我正在使用来自sklearnGMM 工具包构建一个基本的说话人识别器。我有 3 个班级,每个班级都有一个分类器。在测试阶段,应选择概率最高的说话者GMM,程序应返回每个测试样本的预测类别。我想改变混合成分的数量并在这个示例代码中设置n_components=4。 如果我使用 4 个混合分量,我的分类器的输出将是 0、1、2 或 3。如果我使用 3 个混合分量,它将是 0、1 或 2。我感觉分类器返回预测的混合分量而不是整个 GMM。但我希望它预测类别:1、2 或 3。

这是我的代码:

import numpy as np
from sklearn.mixture import GMM

#set path
path="path"

class_names = [1,2,3]

covs =  ['spherical', 'diag', 'tied', 'full']

training_data = {1: np.loadtxt(path+"/01_train_debug.data"), 2:  np.loadtxt(path+"/02_train_debug.data"), 3: np.loadtxt(path+"/03_train_debug.data")}

print "Training models"
models = {}
for c in class_names:
    # make a GMM for each of the classes in class_names
    models[c] = dict((covar_type,GMM(n_components=4,
                    covariance_type=covar_type, init_params='wmc',n_init=1, n_iter=20))
                   for covar_type in covs)


for cov in covs:
    for c in class_names:
            models[c][cov].fit(training_data[c])

#define test set
test01 = np.loadtxt(path+"/01_test_debug.data")
test02 = np.loadtxt(path+"/02_test_debug.data")
test03 = np.loadtxt(path+"/03_test_debug.data")

testing_data = {1: test01, 2: test02, 3: test03}

probs = {}

print "Calculating Probabilities"

for c in class_names:
    probs[c] = {}
    for cov in covs:
        probs[c][cov] = {}
        for p in class_names:
            probs[c][cov] = models[p][cov].predict(testing_data[c])


for c in class_names:
    print c
    for cov in covs:
        print "   ",cov,
        for p in class_names:
            print p, probs,
        print 

我的上述假设是正确的还是我的代码中有逻辑错误? 有没有办法在sklearn中解决这个问题? 提前感谢您的帮助!

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    在你的代码中,第一次你 models dict 的键是协方差类型,第二次键是类名。对不起,我看错了你的代码。

    编辑:如果您想要拟合 GMM 模型下数据的每个样本可能性,您应该使用 score_samples 方法。 predict 方法不返回概率,而是返回组件分配。

    GMM 默认也是非监督模型。如果您想从一堆 GMM 模型中构建一个监督模型,您可能应该将其包装为一个估计器类来包装它们并实现拟合/预测 API,以便能够通过交叉验证来估计其准确性并调整超参数值通过网格搜索。 Pull request #2468 正在实现类似的东西。它已及时合并,可能会包含在下一个 scikit-learn 版本中(0.15,应该会在 2014 年初发布)。

    【讨论】:

    • 谢谢!我最初使用 score_samples 方法,但不确定如何从结果中计算混淆矩阵。会切换回来试试看!
    • 你必须选择与每个样本得分最高的模型匹配的类。
    • @ogrisel 嗨,我想知道您是否可以在我的 post 中查看类似的问题。提前致谢。
    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2015-07-19
    • 2021-07-19
    • 1970-01-01
    • 2021-07-10
    • 2016-10-12
    • 2016-12-13
    相关资源
    最近更新 更多