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

时间:2015-01-26 16:56:42

标签: python pandas machine-learning classification pybrain

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

所以我有一个pandas数据帧,包含6个特征列和1个用于类标签的列(Survived,只有0或1)。

我用它构建了一个数据集:

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]?它只是' 0' 0或者' 1'原来'幸存下来'柱?如何恢复原始价值?

后来,当我完成网络培训时:

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

我将尝试在我的另一个数据集上激活它(我想要进行实际分类)并且我将为2个输出神经元中的每一个获得一对激活结果,但是如何理解哪个输出神经元对应于哪个原始数据类?可能这显然是显而易见的,但不幸的是,我无法从文档中理解它。

1 个答案:

答案 0 :(得分:2)

好的,貌似pybrain使用position来确定它所代表的类(0,1)或(1,0)。

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

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

inProp看起来像我的激活输入值的元组,num - 预期的双神经元输出的元组((0,1)或(1,0))和num.argmax()会将其转换为只有0或1 - 实际输出。

我可能错了,因为这是纯启发式的,但它在我的例子中有用。