使用 PyBrain 进行回归

Regression with PyBrain

我正在尝试为 100 个样本构建替代模型。我有两个输入和两个响应,所有这些都用它们各自最大值的大小进行了归一化。

归一化:

for i in range(0, len(array(self.samples)[0])):
        self.max_samples.append(abs(self.samples[:,i].max()))
        self.samples[:,i] /= self.max_samples[-1]
        self.minmax_samples.append([self.samples[:,i].min(), self.samples[:,i].max()])

for i in range(0, len(array(self.targets)[0])):
        self.max_targets.append(abs(self.targets[:,i].max()))
        self.targets[:,i] /= self.max_targets[-1]

网络搭建如下:

self.ANN = FeedForwardNetwork(bias = True)
inLayer = TanhLayer(len(array(self.samples[0])[-1]))
hiddenLayer = TanhLayer(17)
outLayer = LinearLayer(len(array(self.targets[0])[-1]))

self.ANN.addInputModule(inLayer)
self.ANN.addModule(hiddenLayer)
self.ANN.addOutputModule(outLayer)

in_to_hidden = FullConnection(inLayer, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)

self.ANN.addConnection(in_to_hidden)
self.ANN.addConnection(hidden_to_out)
self.ANN.sortModules()

self.DataSet = SupervisedDataSet(len(array(self.samples[0])[-1]),len(array(self.targets[0])[-1]))
"Adding training points"
for i, j in zip(self.samples, self.targets):
     self.DataSet.appendLinked(i, j)


trainer = BackpropTrainer( self.ANN, dataset=self.DataSet, momentum=0.99, learningrate = 0.1, verbose=True, weightdecay=0.1)
trainer.trainOnDataset(self.DataSet, 200)

训练器产生的总误差为 1e-2 阶。我想它会更好。神经网络生成的响应根本不接近预期值。

我使用的数据点太少了吗?当我们有一个维度超过 20 的输入向量和多个响应 (> 5) 而可以生成的样本点数量低于 120 时,人工神经网络是否做得很好?

对于如此复杂的网络,您的样本太少。

您的网络将有 2*17=34 个从输入到隐藏层的连接,17*2=34 个从隐藏层到输出的连接,以及 17+2=19 个来自偏置单元的连接。这意味着您有 87 个参数需要调整。

如果您使用 70% 的样本数据训练您的数据,并使用 30% 的样本数据进行交叉验证和测试,那么您将获得 84 "known" 个值。当已知值的数量类似于(甚至低于)参数数量时,您的神经网络很容易过度拟合,因此它与训练数据完美匹配(非常低的训练误差),但它对其他数据毫无用处.

您需要一个不太复杂的网络或更多样本。