pybrain – ClassificationDataSet – 如何理解使用SoftmaxLayer时的输出

我正在尝试使用Pybrain神经网络和专门的ClassificationDataSet构建我的第一个分类器,但我不是很确定自己是否完全理解它的工作原理。

我有一个包含6个特征列和1个类别标签列(Survived,仅0或1)的pandas数据框。

我从中构建了一个数据集:

ds = ClassificationDataSet(6, 1, nb_classes=2)for i in df[['Gender', 'Pclass', 'AgeFill', 'FamilySize', 'FarePerPerson', 'Deck','Survived']].values:    ds.addSample(tuple(i[:-1]), i[-1])ds._convertToOneOfMany()return ds

好的,我检查了数据集的外观:

for i, m in ds:    i, m(array([ 1.,  3.,  2.,  2.,  1.,  8.]), array([1, 0]))(array([ 0.,  1.,  1.,  2.,  0.,  2.]), array([0, 1]))

我已经遇到了问题。[1,0]或[0,1]是什么意思?它只是原始的’survived’列中的’0’或’1’吗?如何转换回原始值?

后来,当我完成网络的训练后:

net = buildNetwork(6, 6, 2, hiddenclass=TanhLayer, bias=True,  outclass=SoftmaxLayer)trainer = BackpropTrainer(net, ds)trainer.trainEpochs(10)

我将尝试在另一个数据集上激活它(我希望对其进行实际分类),我将获得每个2个输出神经元的一对激活结果,但如何理解哪个输出神经元对应哪个原始类别?这可能显而易见,但遗憾的是,我无法从文档中理解这一点。


回答:

看起来pybrain使用位置来确定(0,1)或(1,0)表示哪个类别。

要转换回原始的0或1标记,您需要使用argmax()函数。例如,如果我已经有一个训练好的网络,并且我想在用于训练的相同数据上验证它,我可以这样做:

for inProp, num in ds:    out = net.activate(inProp).argmax()    if out == num.argmax():        true+=1    total+=1res = true/total

inProp看起来像我的输入值的元组,用于激活,num – 预期的两个神经元输出的元组(可能是(0,1)或(1,0)),num.argmax()会将其转换为0或1 – 真实输出。

我可能错了,因为这只是一个纯粹的启发式方法,但在我的例子中它是有效的。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注