我正在尝试使用神经网络解决这个Kaggle Problem。我正在使用Pybrain Python库。
这是一个经典的监督学习问题。在下面的代码中,“数据”变量是numpy数组(892*8)。7个字段是我的特征,1个字段是我的输出值,可以是“0”或“1”。
我曾尝试调整学习率、权重衰减、动量、隐藏单元数量、隐藏层数量、隐藏层类别和输出层类别等参数,以解决这个问题,但无论如何,如果输入来自训练数据,每次都会得到相同的输出。
我认为我应该运行超过8000次,因为当我为“XOR”构建神经网络时,至少需要700次迭代才能开始在纳米级别上出现错误。在“XOR”上的训练数据大小仅为4,而在这种情况下它是892。因此,我在原始数据的10%上运行了8000次迭代(现在训练数据的大小为89),即使这样,它仍然对训练数据中的每个输入都给出相同的输出。并且,由于我想将输入分类为“0”或“1”,如果我使用Softmax作为输出层的类别,则始终会输出“1”。
无论我在“XOR”中使用哪种配置(隐藏单元数、输出层类别、学习率、隐藏层类别、动量),它更多或少地在每种情况下开始收敛。
是否可能存在某些配置最终会产生较低的误差率?至少有一些配置,使其不会对训练数据中的所有输入都产生相同的输出吗?
我对其进行了80000次迭代(训练数据大小为89)。输出样例:
平均误差:0.112558819082
('最大误差:',0.21803000849096299,'中位误差:',0.096632332865968451)
它将所有输出值保持在范围(0.33, 0.5)内。
这是一个经典的监督学习问题。在下面的代码中,“数据”变量是numpy数组(892*8)。7个字段是我的特征,1个字段是我的输出值,可以是“0”或“1”。
from pybrain.datasets import ClassificationDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.shortcuts import buildNetwork
dataset = ClassificationDataSet(7,1)
for i in data:
dataset.appendLinked(i[1:],i[0])
net = buildNetwork(7,9,7,1, bias = True,hiddenclass = SigmoidLayer, outclass = TanhLayer)
trainer = BackpropTrainer(net, learningrate = 0.04, momentum = 0.96, weightdecay = 0.02, verbose = True)
trainer.trainOnDataset(dataset, 8000)
trainer.testOnData(verbose = True)
在训练神经网络后,当我在训练数据上进行测试时,它总是为所有输入提供单个输出。例如:
Testing on data:
out: [ 0.075]
correct: [ 1.000]
error: 0.42767858
out: [ 0.075]
correct: [ 0.000]
error: 0.00283875
out: [ 0.075]
correct: [ 1.000]
error: 0.42744569
out: [ 0.077]
correct: [ 1.000]
error: 0.42616996
out: [ 0.076]
correct: [ 0.000]
error: 0.00291185
out: [ 0.076]
correct: [ 1.000]
error: 0.42664586
out: [ 0.075]
correct: [ 1.000]
error: 0.42800026
out: [ 0.076]
correct: [ 1.000]
error: 0.42719380
out: [ 0.076]
correct: [ 0.000]
error: 0.00286796
out: [ 0.076]
correct: [ 0.000]
error: 0.00286642
out: [ 0.076]
correct: [ 1.000]
error: 0.42696969
out: [ 0.076]
correct: [ 0.000]
error: 0.00292401
out: [ 0.074]
correct: [ 0.000]
error: 0.00274975
out: [ 0.076]
correct: [ 0.000]
error: 0.00286129
我曾尝试调整学习率、权重衰减、动量、隐藏单元数量、隐藏层数量、隐藏层类别和输出层类别等参数,以解决这个问题,但无论如何,如果输入来自训练数据,每次都会得到相同的输出。
我认为我应该运行超过8000次,因为当我为“XOR”构建神经网络时,至少需要700次迭代才能开始在纳米级别上出现错误。在“XOR”上的训练数据大小仅为4,而在这种情况下它是892。因此,我在原始数据的10%上运行了8000次迭代(现在训练数据的大小为89),即使这样,它仍然对训练数据中的每个输入都给出相同的输出。并且,由于我想将输入分类为“0”或“1”,如果我使用Softmax作为输出层的类别,则始终会输出“1”。
无论我在“XOR”中使用哪种配置(隐藏单元数、输出层类别、学习率、隐藏层类别、动量),它更多或少地在每种情况下开始收敛。
是否可能存在某些配置最终会产生较低的误差率?至少有一些配置,使其不会对训练数据中的所有输入都产生相同的输出吗?
我对其进行了80000次迭代(训练数据大小为89)。输出样例:
Testing on data:
out: [ 0.340]
correct: [ 0.000]
error: 0.05772102
out: [ 0.399]
correct: [ 0.000]
error: 0.07954010
out: [ 0.478]
correct: [ 1.000]
error: 0.13600274
out: [ 0.347]
correct: [ 0.000]
error: 0.06013008
out: [ 0.500]
correct: [ 0.000]
error: 0.12497886
out: [ 0.468]
correct: [ 1.000]
error: 0.14177601
out: [ 0.377]
correct: [ 0.000]
error: 0.07112816
out: [ 0.349]
correct: [ 0.000]
error: 0.06100758
out: [ 0.380]
correct: [ 1.000]
error: 0.19237095
out: [ 0.362]
correct: [ 0.000]
error: 0.06557341
out: [ 0.335]
correct: [ 0.000]
error: 0.05607577
out: [ 0.381]
correct: [ 0.000]
error: 0.07247926
out: [ 0.355]
correct: [ 1.000]
error: 0.20832669
out: [ 0.382]
correct: [ 1.000]
error: 0.19116165
out: [ 0.440]
correct: [ 0.000]
error: 0.09663233
out: [ 0.336]
correct: [ 0.000]
error: 0.05632861
平均误差:0.112558819082
('最大误差:',0.21803000849096299,'中位误差:',0.096632332865968451)
它将所有输出值保持在范围(0.33, 0.5)内。
(LR * (N - i)/N)
。它们的范围是多少?我想它们对于不同的特征是不同的吧?然后将它们归一化为相同的范围内。在所有的网络中使用Sigmoid或Tanh层。如果您使用Sigmoid,则保留0和1。如果您使用Tanh,则使用[-1, +1]作为输出。 - Stan