分类器产生连续值而不是不同的标签

Posted

技术标签:

【中文标题】分类器产生连续值而不是不同的标签【英文标题】:Classifier produces continuous values rather than distinct labels 【发布时间】:2020-03-19 17:56:47 【问题描述】:

This documentation article 解释了如何将多层感知器应用于分类任务。我有一个长度为 80 的输入特征向量,想训练一个多层感知器将输入向量分为两类——0 和 1。我的输出层包含 1 个节点。

问题 1) 我希望分类器有二进制输出,但模型输出的是实数值(在01 之间)。为什么会发生这种情况以及如何将其转换为二进制类?教程链接中没有提到如何获取二进制值标签,即在最后一层使用什么函数。

为了澄清,一旦模型输出被计算出来(下面是前 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训练分类器吗?

元过滤分类器和手动过滤分类器给出不同的结果

结合多个二元分类器 (LinearSVC) 进行多标签分类

使用 PyTorch 的多标签、多类图像分类器 (ConvNet)

如何计算决策树的 AUC?

将单标签分类器转换为多标签分类器