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

时间:2019-11-24 05:31:20

标签: matlab neural-network classification pattern-recognition mlp

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

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

为澄清起见,一旦计算出模型输出(以下是前四个输出值),

y = 
    0.1042
    0.9961
    0.9956
    0.0049

我可以使用简单的阈值函数,例如bin_target = y>=0.5,其中所有大于或等于0.5的数字都标记为1,其余的标记为0。但是,手动选择阈值对我来说似乎是任意的。

问题2):MSE的计算:应该在已知的二值目标Y与实值模型的输出之间计算均方误差还是简单的报告性能的误差y还是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';

1 个答案:

答案 0 :(得分:1)

发生问题1 是因为默认输出传递函数为'softmax',它是一个连续函数(从技术上讲是概率分布)。这样的输出包括“信心”信息,而不仅仅是输出类别。我的观点0.5是二进制分类问题的正确阈值,因为据我了解,获得输出的值表示“此输入对应于类true的概率”

>> net = patternnet;
>> disp(net.layers{net.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.layers{net.numLayers}.transferFcn = 'hardlim';)。

关于{strong>问题2 ,如this answer中所述,使用连续得分是有益的。