This documentation article解释了如何将多层感知器应用于分类任务。我有一个长度为80的输入特征向量,并且想训练一个多层感知器,将输入向量分为两类-0和1。我的输出层包含1个节点。
问题1)我希望分类器具有二进制输出,但是模型输出实数值(在0
和1
之间)。为什么会发生这种情况,以及如何将其转换为二进制类?在教程链接中没有提到如何获取二进制值的标签,即在最后一层中使用什么函数。
为澄清起见,一旦计算出模型输出(以下是前四个输出值),
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';
答案 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中所述,使用连续得分是有益的。