分类器产生连续值而不是不同的标签
Posted
技术标签:
【中文标题】分类器产生连续值而不是不同的标签【英文标题】:Classifier produces continuous values rather than distinct labels 【发布时间】:2020-03-19 17:56:47 【问题描述】:This documentation article 解释了如何将多层感知器应用于分类任务。我有一个长度为 80 的输入特征向量,想训练一个多层感知器将输入向量分为两类——0 和 1。我的输出层包含 1 个节点。
问题 1) 我希望分类器有二进制输出,但模型输出的是实数值(在0
和1
之间)。为什么会发生这种情况以及如何将其转换为二进制类?教程链接中没有提到如何获取二进制值标签,即在最后一层使用什么函数。
为了澄清,一旦模型输出被计算出来(下面是前 4 个输出值),
y =
0.1042
0.9961
0.9956
0.0049
我可以使用像bin_target = y>=0.5
这样的简单阈值函数,其中所有大于或等于 0.5 的数字都标记为 1,其余数字标记为 0。但是,手动选择阈值对我来说似乎是任意的。
问题2) MSE的计算:在已知的二进制值目标Y
和实值模型的输出@987654327之间计算均方误差还是简单的误差来报告性能@ 或 perfClassify = y_bin - Y
?
下面的代码是我对inputs
的数据进行分类的尝试。
% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = init(net);
net.performFcn = 'crossentropy';
net = patternnet(hiddenLayerSize);
% Train the Network
[net,tr] = train(net,inputs,Y); % Y=targets
% Test the Network
y = net(inputs);
bin_target = y>=0.5;
error1 = bin_target-Y';
% OR
error2 = y - Y';
【问题讨论】:
请尝试重新表述您的问题以更清楚地解释 3 件事:预期结果是什么,目前正在发生什么,以及 您如何尝试修复它。请专注于使您的问题独立,即 - 在帖子正文中包含所有必需的信息,以便无需点击链接即可回答。该链接有利于上下文,但也许链接到该页面中的特定数字会更有助于解释您的问题。 【参考方案1】:您的问题 1 发生是因为默认输出传递函数是 'softmax'
,这是一个连续函数(技术上是概率分布)。这样的输出包括“置信度”信息而不仅仅是输出类。我的意见是0.5
是二元分类问题的正确阈值,因为据我了解,获得输出的值意味着“此输入对应于类true
的概率”。
>> net = patternnet;
>> disp(net.layersnet.numLayers.transferFcn);
softmax
很遗憾,我无法评论softmax
是否适合您的问题,但如果您想更改它,您可以使用help nntransfer
找到选项列表:
>> help nntransfer
Neural Network Transfer Functions.
compet - Competitive transfer function.
elliotsig - Elliot sigmoid transfer function.
hardlim - Positive hard limit transfer function.
hardlims - Symmetric hard limit transfer function.
logsig - Logarithmic sigmoid transfer function.
netinv - Inverse transfer function.
poslin - Positive linear transfer function.
purelin - Linear transfer function.
radbas - Radial basis transfer function.
radbasn - Radial basis normalized transfer function.
satlin - Positive saturating linear transfer function.
satlins - Symmetric saturating linear transfer function.
softmax - Soft max transfer function.
tansig - Symmetric sigmoid transfer function.
tribas - Triangular basis transfer function.
Main nnet function list.
也许您正在寻找的是hardlim
。要更改传递函数,只需为最后一层的transferFcn
字段分配一个有效值(例如net.layersnet.numLayers.transferFcn = 'hardlim';
)。
至于问题2,如this answer中所述,使用连续分数是有益的。
【讨论】:
感谢您的回答。只是澄清一下,改变最后一层传递函数的方法,我应该在声明net.layersnet.numLayers.transferFcn = 'hardlim'
中提到层数吗?那么,如果有一个输入层,然后是两个隐藏层,然后是一个输出层,这个命令应该是什么?
命令不用改,总是指最后一层。当然,不要相信我的话——你应该自己运行它并验证结果。
非常感谢。关于 MSE 的答案,我确实担心将实值模型的输出与目标类标签进行比较的过程。这是因为在这种情况下 MSE 可能不会接近于零。此外,如果混淆矩阵也用作性能工具,则使用实值输出可能是矛盾的——混淆矩阵将显示 100% 的准确度,而 MSE 相当高。但是,如果在标签之间比较 MSE(即,在使用 0.5 作为阈值转换实值模型的输出之后),则它可能为零。你有什么建议?
如果您可以通过详细说明这一点来更新您的答案将会很有帮助 - 如果同时使用 MSE 和混淆矩阵,那么这两种方法都使用不同的值。 MSE 使用实值输出和二进制值目标之间的误差。另一方面,混淆矩阵使用的是二进制值。
不幸的是,我不是该主题的专家,因此如果不阅读链接帖子中的文章,我将无法详细说明。无论如何,这听起来像是一个完全不同的问题,值得单独讨论。我建议您在Cross Validated 上打开一个新问题,对链接的问题发表评论,要求对此进行澄清,或者向帖子的作者发送一封关于他们文章的电子邮件。如果你觉得这个答案没有这些信息没有用,我会删除它。以上是关于分类器产生连续值而不是不同的标签的主要内容,如果未能解决你的问题,请参考以下文章
Snorkel:我可以在数据集中使用不同的功能来生成标记函数VS训练分类器吗?