matlab中的神经网络分类:得到元素属于第i类的概率
我想用Matlab解决一个分类问题。我有一个由3个类和1900个样本组成的数据集。每个样本由10个特征定义,我有900个样本用于类“1”,500个样本用于类“2”,500个样本用于类“3” 我尝试使用Matlab中的标准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”
patternnet
工具来训练神经网络。我用不同数量的神经元做了不同的测试,从1个到100个,但我在分类方面总是表现不佳
因此,我查看了混淆矩阵,发现问题在于分类器混淆了类“2”和“3”。我接下来尝试的是创建两个神经网络:
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也更容易过度拟合(即,如果