PyBrain - Tipos de conjuntos de datos

Los conjuntos de datos son datos que se deben proporcionar para probar, validar y entrenar en redes. El tipo de conjunto de datos a utilizar depende de las tareas que vamos a hacer con el aprendizaje automático. Vamos a discutir los distintos tipos de conjuntos de datos en este capítulo.

Podemos trabajar con el conjunto de datos agregando el siguiente paquete:

pybrain.dataset

SupervisedDataSet

SupervisedDataSet consta de campos de input y target. Es la forma más simple de un conjunto de datos y se usa principalmente para tareas de aprendizaje supervisado.

A continuación se muestra cómo puede usarlo en el código:

from pybrain.datasets import SupervisedDataSet

Los métodos disponibles en SupervisedDataSet son los siguientes:

addSample (inp, objetivo)

Este método agregará una nueva muestra de entrada y destino.

splitWithProportion (proporción = 0.10)

Esto dividirá los conjuntos de datos en dos partes. La primera parte tendrá el% del conjunto de datos dado como entrada, es decir, si la entrada es .10, entonces es el 10% del conjunto de datos y el 90% de los datos. Puede decidir la proporción según su elección. Los conjuntos de datos divididos se pueden utilizar para probar y entrenar su red.

copy() - Devuelve una copia profunda del conjunto de datos.

clear() - Borrar el conjunto de datos.

saveToFile (nombre de archivo, formato = Ninguno, ** kwargs)

Guarde el objeto en el archivo dado por el nombre de archivo.

Ejemplo

Aquí hay un ejemplo de trabajo usando un 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)

Salida

La salida para el programa anterior es la siguiente:

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 datos se utiliza principalmente para tratar problemas de clasificación. Toma la entrada, el campo objetivo y también un campo adicional llamado "clase" que es una copia de seguridad automática de los objetivos dados. Por ejemplo, la salida será 1 o 0 o la salida se agrupará con valores basados ​​en la entrada dada, es decir, caerá en una clase en particular.

Así es como puede usarlo en el código:

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

Los métodos disponibles en ClassificationDataSet son los siguientes:

addSample(inp, target) - Este método agregará una nueva muestra de entrada y destino.

splitByClass() - Este método dará dos nuevos conjuntos de datos, el primer conjunto de datos tendrá la clase seleccionada (0..nClasses-1), el segundo tendrá muestras restantes.

_convertToOneOfMany() - Este método convertirá las clases objetivo en una representación de 1 de k, conservando los objetivos antiguos como una clase de campo

Aquí hay un ejemplo práctico de ClassificationDataSet.

Ejemplo

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']))

El conjunto de datos utilizado en el ejemplo anterior es un conjunto de datos de dígitos y las clases son del 0 al 9, por lo que hay 10 clases. La entrada es 64, el objetivo es 1 y las clases, 10.

El código entrena la red con el conjunto de datos y genera el gráfico para el error de entrenamiento y el error de validación. También da el error porcentual en los datos de prueba, que es el siguiente:

Salida

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