PyBrain - Tipos de conjuntos de dados
Conjuntos de dados são dados a serem fornecidos para testar, validar e treinar em redes. O tipo de conjunto de dados a ser usado depende das tarefas que faremos com o aprendizado de máquina. Discutiremos os vários tipos de conjuntos de dados neste capítulo.
Podemos trabalhar com o conjunto de dados adicionando o seguinte pacote -
pybrain.dataset
SupervisedDataSet
SupervisedDataSet consiste em campos de input e target. É a forma mais simples de um conjunto de dados e usado principalmente para tarefas de aprendizagem supervisionada.
Abaixo está como você pode usá-lo no código -
from pybrain.datasets import SupervisedDataSet
Os métodos disponíveis em SupervisedDataSet são os seguintes -
addSample (inp, target)
Este método adicionará uma nova amostra de entrada e destino.
splitWithProportion (proporção = 0,10)
Isso dividirá os conjuntos de dados em duas partes. A primeira parte terá a% do conjunto de dados fornecida como entrada, ou seja, se a entrada for 0,10, então será 10% do conjunto de dados e 90% dos dados. Você pode decidir a proporção de acordo com sua escolha. Os conjuntos de dados divididos podem ser usados para testar e treinar sua rede.
copy() - Retorna uma cópia profunda do conjunto de dados.
clear() - Limpe o conjunto de dados.
saveToFile (nome do arquivo, formato = Nenhum, ** kwargs)
Salve o objeto em um arquivo fornecido por filename.
Exemplo
Aqui está um exemplo de trabalho usando um 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
# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)
# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)
# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)
# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))
# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))
#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)
# will run the loop 1000 times to train it.
for epoch in range(1000):
trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)
Resultado
A saída para o programa acima é a seguinte -
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
Este conjunto de dados é usado principalmente para lidar com problemas de classificação. Ele recebe a entrada, o campo de destino e também um campo extra chamado "classe", que é um backup automático dos destinos fornecidos. Por exemplo, a saída será 1 ou 0 ou a saída será agrupada com os valores baseados na entrada fornecida, ou seja, ela cairá em uma classe particular.
Aqui está como você pode usá-lo no código -
from pybrain.datasets import ClassificationDataSet
Syntax
// ClassificationDataSet(inp, target=1, nb_classes=0, class_labels=None)
Os métodos disponíveis em ClassificationDataSet são os seguintes -
addSample(inp, target) - Este método adicionará uma nova amostra de entrada e destino.
splitByClass() - Este método dará dois novos conjuntos de dados, o primeiro conjunto de dados terá a classe selecionada (0..nClasses-1), o segundo terá amostras restantes.
_convertToOneOfMany() - Este método converterá as classes de destino em uma representação 1 de k, mantendo os antigos destinos como uma classe de campo
Aqui está um exemplo prático de ClassificationDataSet.
Exemplo
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']))
O conjunto de dados usado no exemplo acima é um conjunto de dados de dígitos e as classes vão de 0 a 9, portanto, há 10 classes. A entrada é 64, o destino é 1 e as classes, 10.
O código treina a rede com o conjunto de dados e gera o gráfico para erro de treinamento e erro de validação. Ele também fornece a porcentagem de erro em dados de teste, que é a seguinte -
Resultado
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