PyBrain - 数据集类型

数据集是用于在网络上测试、验证和训练的数据。要使用的数据集类型取决于我们要用机器学习执行的任务。我们将在本章中讨论各种数据集类型。

我们可以通过添加以下包 − 来处理数据集

pybrain.dataset

SupervisedDataSet

SupervisedDataSet 由 inputtarget 字段组成。它是最简单的数据集形式,主要用于监督学习任务。

下面是如何在代码中使用它 −

from pybrain.datasets import SupervisedDataSet

SupervisedDataSet 上可用的方法如下 −

addSample(inp, target)

此方法将添加输入和目标的新样本。

splitWithProportion(proportion=0.10)

这会将数据集分为两部分。第一部分将以数据集的百分比作为输入,即,如果输入为 .10,则为数据集的 10% 和数据的 90%。您可以根据自己的选择决定比例。分割后的数据集可用于测试和训练您的网络。

copy() − 返回数据集的深层副本。

clear() − 清除数据集。

saveToFile(filename, format=None, **kwargs)

将对象保存到 filename 指定的文件中。

示例

这是一个使用 SupervisedDataset 的工作示例 −

testnetwork.py

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# 创建一个具有两个输入、三个隐藏和一个输出的网络
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)

# 创建一个与网络输入和输出大小匹配的数据集:
norgate = SupervisedDataSet(2, 1)

# 创建一个用于测试的数据集。
nortrain = SupervisedDataSet(2, 1)

# 将输入和目标值添加到数据集
# NOR 真值表的值
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

# 将输入和目标值添加到数据集
# NOR 真值表的值
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))

# 使用数据集 norgate 训练网络。
trainer = BackpropTrainer(nn, norgate)

# 将运行循环 1000 次来训练它。
for epoch in range(1000):
   trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)

输出

上述程序的输出如下 −

python testnetwork.py

C:\pybrain\pybrain\src>python testnetwork.py
Testing on data:
('out: ', '[0.887 ]')
('correct:', '[1 ]')
error: 0.00637334
('out: ', '[0.149 ]')
('correct:', '[0 ]')
error: 0.01110338
('out: ', '[0.102 ]')
('correct:', '[0 ]')
error: 0.00522736
('out: ', '[-0.163]')
('correct:', '[0 ]')
error: 0.01328650
('All errors:', [0.006373344564625953, 0.01110338071737218, 0.005227359234093431
, 0.01328649974219942])
('Average error:', 0.008997646064572746)
('Max error:', 0.01328649974219942, 'Median error:', 0.01110338071737218)

ClassificationDataSet

此数据集主要用于处理分类问题。它包含输入、目标字段以及一个名为"class"的额外字段,它是给定目标的自动备份。例如,输出将是 1 或 0,或者输出将根据给定的输入与值分组在一起。即,它将属于一个特定的类。

以下是您可以在代码中使用它的方法 −

from pybrain.datasets import ClassificationDataSet
Syntax
// ClassificationDataSet(inp, target=1, nb_classes=0, class_labels=None)

ClassificationDataSet 上可用的方法如下 −

addSample(inp, target) −此方法将添加输入和目标的新样本。

splitByClass() − 此方法将提供两个新数据集,第一个数据集将具有选定的类(0..nClasses-1),第二个数据集将具有剩余的样本。

_convertToOneOfMany() − 此方法将目标类转换为 1-of-k 表示形式,将旧目标保留为字段类

以下是 ClassificationDataSet 的工作示例。

示例

from sklearn import datasets
import matplotlib.pyplot as plt
from pybrain.datasets import ClassificationDataSet
from pybrain.utilities import percentError
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
from numpy import ravel
digits = datasets.load_digits()
X, y = digits.data, digits.target
ds = ClassificationDataSet(64, 1, nb_classes=10)

for i in range(len(X)):
ds.addSample(ravel(X[i]), y[i])
test_data_temp, training_data_temp = ds.splitWithProportion(0.25)
test_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, test_data_temp.getLength()):
test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):
training_data.addSample( training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1] )
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()
net = buildNetwork(training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer)
trainer = BackpropTrainer(
   net, dataset=training_data, momentum=0.1,learningrate=0.01,verbose=True,weightdecay=0.01
)
trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)
plt.plot(trnerr,'b',valerr,'r')
plt.show()
trainer.trainEpochs(10)
print('Percent Error on testData:',percentError(trainer.testOnClassData(dataset=test_data), test_data['class']))

上述示例中使用的数据集是数字数据集,类别从 0 到 9,因此有 10 个类别。输入为 64,目标是 1,类别为 10。

代码使用数据集训练网络并输出训练误差和验证误差的图表。它还给出了测试数据的百分比误差,如下所示 −

输出

Classification DataSet。
Total error: 0.0432857814358
Total error: 0.0222276374185
Total error: 0.0149012052174
Total error: 0.011876985318
Total error: 0.00939854792853
Total error: 0.00782202445183
Total error: 0.00714707652044
Total error: 0.00606068893793
Total error: 0.00544257958975
Total error: 0.00463929281336
Total error: 0.00441275665294
('train-errors:', '[0.043286 , 0.022228 , 0.014901 , 0.011877 , 0.009399 , 0.007
   822 , 0.007147 , 0.006061 , 0.005443 , 0.004639 , 0.004413 ]')
('valid-errors:', '[0.074296 , 0.027332 , 0.016461 , 0.014298 , 0.012129 , 0.009
   248 , 0.008922 , 0.007917 , 0.006547 , 0.005883 , 0.006572 , 0.005811 ]')
Percent Error on testData: 3.34075723830735