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

Posted

技术标签:

【中文标题】在matlab中使用神经网络进行分类:获取属于第i类的元素的概率【英文标题】:Classification with neural network in matlab: get probability of element belonging to i-th class 【发布时间】:2016-06-02 00:02:46 【问题描述】:

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

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

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

    第一个神经网络是一个 2 类分类器,具有“1”类和“23”类(“2”和“3”类的并集)。第一次分类对我来说准确率很高(大约 90%) 第二个神经网络还是一个 2 类分类器,它只将“2”和“3”类的元素作为输入。问题是第二个神经网络的准确率很差,大约 55%。

所以我在提高分类准确性方面也遇到了一些困难。我想做一些测试,看看我是否可以提高准确性。 我的想法是查看每个元素属于特定类的概率是多少。我想做的是以下之一:

    尝试更改确定样本类别的阈值。例如,如果概率 > 70% 属于“3”类的所有元素确实是“3”类,但如果概率在 50% 到 70% 之间,则此元素通常是“2”类(I我只是编造数字来解释我想测试什么) 为难以分类的样本创建“4”类。同样,如果,例如,概率 > 70% 属于“3”类的元素确实是“3”类,我将考虑概率

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

【问题讨论】:

你真的必须使用神经网络吗?使用 SVM,这项任务相当简单:/ 另外,patternet() 作为训练函数也可以。但是到目前为止,您如何评估输出和准确性? 对我来说准确度只有(Number of samples correctly classified)/(Total number of samples)。数据集分为 70% 训练、15% 验证和 15% 测试,验证和测试准确率之间没有显着差异 是的先生,准确度定义很好。但是我的主要问题是您如何评估输出(即通过哪个函数)? @Akessiox 我不限于使用神经网络,但我不知道如何使用 SVM,如果您认为它真的很简单,可以给我一个示例链接吗? 【参考方案1】:

@MeSS83。为了让我提供一个合适的例子(包括代码和一切),我必须写一个完整的答案。使用 SVM 执行这种多类分类的最简单方法是使用 LibSVM。 LibSVM 是一个免费的 SVM 库(您可以下载它here),也可以在 Matlab 环境中安装和使用。解压缩文件,有一个 matlab 文件夹,您可以在其中找到安装指南和所有内容。

基本上你想要做的是 One-vs-All SVM 方法,即你训练 N 个 SVM(其中 N 是类的数量)并且每个 SVM 都被训练来分离一个给定的类 i em> 来自所有其他(i 类将是正数,所有 not-i 类将是负数)。假设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;

    modelk = svmtrain(LabelsRecoded, TrainingSet, '-c 1 -b 1 -t 0');
end

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

预测阶段的结构如下:

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, modelk, '-b 1');
    prob(:,k) = p(:,modelk.Label==1);
end

prob 内,您将有 3 列(3 是类别数),其中包含第 k 个类别为正的概率(注意 modelk.Label==1)。现在您可以根据最大概率值收集预测标签,如下所示:

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

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

【讨论】:

谢谢,我会尽快测试它的答案 只是好奇,SVM 对神经网络有什么好处?我只是问,因为我对这个主题很陌生,而且我对 SVM 一无所知 嗯,对于 SVM,您只需配置很少的参数:c 参数(如代码中所示)和内核参数。在线性核的情况下,核函数是一个点积,所以你不需要配置任何参数......但是更精确的核函数,如多项式或高斯/RBF,参数很少(标准差,在高斯情况和多项式情况下的多项式系数)。相反,使用神经网络,您有大量参数(偏差和权重):神经元越多,参数就越多。 此外,还涉及到一个优化过程(用不好的术语来说,SVM 旨在寻找分离您的类的 最佳 超平面)。我建议您阅读顺序完全优化算法的工作原理(J. Pratt 着)。这种算法(也在 LibSVM 中)用于训练 SVM 并保证全局最优。神经网络并非如此。 NN 也更容易过度拟合(即,如果训练集不好或训练阶段很长,系统往往会学习训练集的特征,并且它们在泛化方面会松散)。

以上是关于在matlab中使用神经网络进行分类:获取属于第i类的元素的概率的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab 中使用经过训练的神经网络在真实系统中进行分类

PNN神经网络(Matlab)

[机器学习]感知机(Perceptron)算法的MATLAB实现

DBN分类基于matlab麻雀算法优化深度置信网络SSA-DBN数据分类含Matlab源码 2318期

DBN分类基于matlab麻雀算法优化深度置信网络SSA-DBN数据分类含Matlab源码 2318期

MATLAB神经网络的目录