在matlab中使用神经网络进行分类:获取属于第i个元素的概率class

Classification with neural network in matlab: get probability of element belonging to i-th class

我想用 Matlab 解决 class化问题。我有一个由 3 classes 和 1900 个样本组成的数据集。每个样本由 10 个特征定义,我有 900 个样本 class '1',500 个 class '2' 和 500 个 class '3'.

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

所以我查看了混淆矩阵,我注意到问题是 classifier 混淆了 classes '2' 和 '3'。接下来我尝试创建两个神经网络:

  1. 第一个神经网络是一个 2-classes classifier,具有 class '1' 和 class '23'(classes '2' 和 '3')。这第一个 class化对我来说有很好的准确性(大约 90%)
  2. 第二个神经网络也是一个 2-classes classifier,它仅将 class '2' 和 '3' 的元素作为输入。问题是第二个神经网络的准确率很差,大约55%。

所以我再次遇到一些困难来提高 classification 的准确性。我想做一些测试,看看我是否可以提高准确性。 我的想法是看每个元素属于特定class的概率是多少。我想做的是以下之一:

  1. 尝试更改确定样本 class 的阈值。例如,如果所有有概率 > 70% 为 class '3' 的元素实际上是 class '3' 但如果概率在 50% 到 70% 之间,则此元素将起作用通常是 class '2'(我只是编造数字来试图解释我想测试的内容)
  2. 为难以class化的样本创建class'4'。同样,如果元素的概率 > 70% class '3' 确实是 class '3' 并且我将考虑 class '4' 元素概率<70%。如果这项工作我可以有一些元素是 "unknown class '4' " 但元素 class 被确定为 '2' 或 '3' 将是正确的并且具有很高的准确性

所以首先我想知道是否有可能检索每个元素属于特定 class 的概率,其次在 Matlab 中是否有标准方法来实现两个测试之一我想做的。 (当然如果有人有更好的主意我很乐意去测试一下) 抱歉,描述太长了,但我希望至少我解释了我的问题。

@MeSS83。为了让我提供一个合适的示例(包含代码和所有内容),我必须写一个完整的答案。使用 SVM 执行此多 class class 化的最简单方法是使用 LibSVM。 LibSVM是一个免费的SVMs库(可以下载here),也可以在Matlab环境下安装使用。解压文件,有一个matlab文件夹,你可以在里面找到安装指南和所有东西。

基本上你想要做的是一对多 SVM 方法,即你训练 N 个 SVM(其中 N 是 classes 的数量)并且每个 SVM 被训练以分离给定的class i 来自所有其他人(i-第 class 将是积极的,所有 not-i classes 将为负数)。假设 TrainingSetTrainingLabelsValidationSetValidationLabels 是您的数据集(它们的名称相当简单),numLabels 是标签的数量(您的标签中有 3 个)例)。

您可以按如下方式训练这些 SVM:

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

在这段代码中'-c 1 -b 1 -t 0'是SVM的LibSVM参数:c是调节项(设置为1),-b 1 表示您还想收集输出概率(a.k.a 决策值),-t 0 表示您正在使用线性内核。更多信息可以在 LibSVM 包内的自述文件中找到。相反,model 是一个元胞数组,其中第 k 个元素包含关于 SVM 的结构,该支持向量机经过训练以将第 k class 与所有其他元素分开。

预测阶段具有以下结构:

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 是 class 的数量)包含第 k 个 class 为正的概率(注意 model{k}.Label==1).现在您可以按照最大概率值收集预测标签,如下所示:

[~,PredictedLabels] = max(prob,[],2);

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