分类器产生连续值而不是不同的标签
Classifier produces continuous values rather than distinct labels
This documentation article 解释了如何将多层感知器应用于分类任务。我有一个长度为 80 的输入特征向量,我想训练一个多层感知器将输入向量分为两类——0 和 1。我的输出层包含 1 个节点。
问题 1) 我希望分类器有二进制输出,但模型输出实数值(在 0
和 1
之间) .为什么会发生这种情况以及如何将其转换为二进制 类?教程link中没有提到如何获取二进制值标签,即最后一层使用什么函数。
澄清一下,计算模型输出后(以下是前 4 个输出值),
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 发生是因为默认输出传递函数是 'softmax'
,它是一个连续函数(从技术上讲,是概率分布)。这样的输出包括 "confidence" 信息而不仅仅是输出 class。我的 意见 是 0.5
是二进制 class 化问题的正确阈值,因为据我了解,获得输出的值意味着 "probability that this inputs corresponds to class 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';
)。
至于问题2,如this answer中所述,使用连续分数是有益的。
This documentation article 解释了如何将多层感知器应用于分类任务。我有一个长度为 80 的输入特征向量,我想训练一个多层感知器将输入向量分为两类——0 和 1。我的输出层包含 1 个节点。
问题 1) 我希望分类器有二进制输出,但模型输出实数值(在 0
和 1
之间) .为什么会发生这种情况以及如何将其转换为二进制 类?教程link中没有提到如何获取二进制值标签,即最后一层使用什么函数。
澄清一下,计算模型输出后(以下是前 4 个输出值),
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 发生是因为默认输出传递函数是 'softmax'
,它是一个连续函数(从技术上讲,是概率分布)。这样的输出包括 "confidence" 信息而不仅仅是输出 class。我的 意见 是 0.5
是二进制 class 化问题的正确阈值,因为据我了解,获得输出的值意味着 "probability that this inputs corresponds to class 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';
)。
至于问题2,如this answer中所述,使用连续分数是有益的。