matlab中的神经网络分类:得到元素属于第i类的概率

matlab中的神经网络分类:得到元素属于第i类的概率,matlab,machine-learning,neural-network,classification,supervised-learning,Matlab,Machine Learning,Neural Network,Classification,Supervised Learning,我想用Matlab解决一个分类问题。我有一个由3个类和1900个样本组成的数据集。每个样本由10个特征定义,我有900个样本用于类“1”,500个样本用于类“2”,500个样本用于类“3” 我尝试使用Matlab中的标准patternnet工具来训练神经网络。我用不同数量的神经元做了不同的测试,从1个到100个,但我在分类方面总是表现不佳 因此,我查看了混淆矩阵,发现问题在于分类器混淆了类“2”和“3”。我接下来尝试的是创建两个神经网络: 第一个神经网络是一个2类分类器,具有类“1”和类“23”

我想用Matlab解决一个分类问题。我有一个由3个类和1900个样本组成的数据集。每个样本由10个特征定义,我有900个样本用于类“1”,500个样本用于类“2”,500个样本用于类“3”

我尝试使用Matlab中的标准
patternnet
工具来训练神经网络。我用不同数量的神经元做了不同的测试,从1个到100个,但我在分类方面总是表现不佳

因此,我查看了混淆矩阵,发现问题在于分类器混淆了类“2”和“3”。我接下来尝试的是创建两个神经网络:

  • 第一个神经网络是一个2类分类器,具有类“1”和类“23”(类“2”和“3”的并集)。第一个分类对我来说有很好的准确性(大约90%)
  • 第二个神经网络同样是一个2类分类器,只将类“2”和“3”的元素作为输入。问题是,第二个神经网络的准确率很低,约为55%
  • 因此,我在提高分类精度方面又遇到了一些困难。我想做一些测试,看看是否可以提高准确性。 我的想法是看看每个元素属于特定类的概率是多少。我想做的是以下其中一项:

  • 尝试更改决定样本类别的阈值。例如,如果所有概率大于70%属于“3”类的元素实际上都属于“3”类,那么这就可行了,但如果概率在50%到70%之间,那么这些元素通常属于“2”类(我只是编一个数字来解释我想测试的内容)

  • 为难以分类的样本创建类别“4”。同样,如果有可能是类3的概率>70%的元素真的是类“3”,那么我会考虑概率为 @ MISS3的类“4”元素。为了给我提供一个合适的例子(包括代码和所有东西),我必须写一个完整的答案。使用支持向量机进行多类分类的最简单方法是使用LibSVM。LibSVM是一个免费的支持向量机库(您可以下载),也可以在Matlab环境中安装和使用。解压文件,有一个matlab文件夹,您可以在其中找到安装指南和所有内容

    基本上你想要做的是一对所有SVM方法,也就是你训练N个SVM(其中N是类的数量),每个SVM都被训练来将给定的类i从所有其他类中分离出来(第i类为正,所有非i类为负)。比如说,
    TrainingSet
    TrainingLabels
    ValidationSet
    ValidationLabels
    是您的数据集(它们的名称非常简单),
    numLabels
    是标签的数量(在您的情况下是3个)

    您可以对这些支持向量机进行如下培训:

    for k=1:numLabels
        % k-th class positive, all the other classes are negative
        LabelsRecoded(TrainingLabels==k)=1;
        LabelsRecoded(TrainingLabels~=k)=-1;
    
        model{k} = svmtrain(LabelsRecoded, TrainingSet, '-c 1 -b 1 -t 0');
    end
    
    [~,PredictedLabels] = max(prob,[],2);
    
    在该代码中,
    '-c1-b1-t0'
    是支持向量机的LibSVM参数:c是调节项(设置为1),-b1表示还希望收集输出概率(也称为决策值),而
    -t0
    表示使用线性核。在LibSVM包的自述文件中可以找到更多信息。相反,
    model
    是一个单元数组,其中第k个元素包含关于训练以将第k个类与所有其他类分离的SVM的结构

    预测阶段具有以下结构:

    LabelsRecoded=[]; % get rid of the results stored previously in the training phase
    for k=1:numLabels
        # same as before, but with validation labels
        LabelsRecoded(ValidationLabels==k)=1;
        LabelsRecoded(ValidationLabels~=k)=-1;
    
        [~,~,p] = svmpredict(LabelsRecoded, ValidationSet, model{k}, '-b 1');
        prob(:,k) = p(:,model{k}.Label==1);
    end
    
    prob
    中,您将有3列(3是类数)包含第k个类为正的概率(注意
    模型{k}.Label==1
    )。现在,您可以根据最大概率值收集预测标签,如下所示:

    for k=1:numLabels
        % k-th class positive, all the other classes are negative
        LabelsRecoded(TrainingLabels==k)=1;
        LabelsRecoded(TrainingLabels~=k)=-1;
    
        model{k} = svmtrain(LabelsRecoded, TrainingSet, '-c 1 -b 1 -t 0');
    end
    
    [~,PredictedLabels] = max(prob,[],2);
    

    现在你有了预测标签和验证标签,你可以根据标准公式评估准确度。

    你真的需要使用神经网络吗?有了支持向量机,这项任务相当简单:/此外,作为训练功能,patternet()也可以。但到目前为止,您是如何评估输出和准确度的?对我来说,准确度只是
    (正确分类的样本数)/(样本总数)
    。数据集分为70%的训练、15%的验证和15%的测试,验证和测试准确度之间没有显著差异。因此,准确度定义良好。然而,我的主要问题是,你是如何评估输出的(即通过哪个函数)?@Akessiox我并不局限于使用神经网络,但我不知道如何使用支持向量机,如果你认为它真的很简单,你能给我一个例子的链接吗?谢谢你的回答,我会尽可能快地测试它只是好奇,与神经网络相比,支持向量机有什么好处?我之所以这么问,是因为我对这个主题非常陌生,而且我对SVMWell一无所知,对于SVM,您需要配置的参数很少:c参数(如代码中所示)和内核参数。在线性核的情况下,核函数是点积,因此您不需要配置任何参数……但更精确的核函数,如多项式或高斯/RBF,只有很少的参数(高斯情况下的标准偏差和多项式情况下的多项式系数)。相反,对于神经网络,你有大量的参数(偏差和权重):神经元越多,参数就越多。此外,还有一个优化过程(简而言之,支持向量机的目标是寻找划分类的最佳超平面)。我恳请您阅读顺序完全优化算法的工作原理(J.Pratt)。该算法用于训练支持向量机,保证了支持向量机的全局最优。神经网络的情况并非如此。NN也更容易过度拟合(即,如果