python pybrain

python - AttributeError usando pyBrain_splitWithPortion-¿el tipo de objeto cambió?



(6)

Estoy probando pybrain siguiendo el tutorial básico de clasificación here y una versión diferente sobre él con algunos datos más realistas here . Sin embargo, recibo este error al aplicar trndata._convertToOneOfMany () con el error:

AttributeError: ''SupervisedDataSet'' object has no attribute ''_convertToOneOfMany

El conjunto de datos se crea como un objeto de clasificación. Juego de datos de clasificación, sin embargo, el hecho de llamar a splitWithProportion parece cambiarlo. Objeto supervisado de datos supervisados, por lo que al ser bastante nuevo en Python, este error no parece tan sorprendente como el objeto de datos supervisado. clasificación.ClasificaciónDataSet hace. Código aquí .

Sin embargo, el mismo código exacto se usa en tantos tutoriales que siento que debo estar perdiendo algo, ya que muchas otras personas lo tienen funcionando. He visto los cambios en la base de código en github y no hay nada en torno a esta función, también he intentado ejecutar en Python 3 vs 2.7, pero no hay diferencia. Si alguien tiene alguna sugerencia para volver al camino correcto y eso sería muy apreciado.

#flatten the 64x64 data in to one dimensional 4096 ds = ClassificationDataSet(4096, 1 , nb_classes=40) for k in xrange(len(X)): #length of X is 400 ds.addSample(np.ravel(X[k]),y[k]) # a new sample consisting of input and target print(type(ds)) tstdata, trndata = ds.splitWithProportion( 0.25 ) print(type(trndata)) trndata._convertToOneOfMany() tstdata._convertToOneOfMany()


Entonces, hice lo siguiente sin obtener un error:

from pybrain.datasets import ClassificationDataSet ds = ClassificationDataSet(4096, 1 , nb_classes=40) for k in range(400): ds.addSample(k,k%4) print(type(ds)) # <class ''pybrain.datasets.classification.ClassificationDataSet''> tstdata, trndata = ds.splitWithProportion(0.25) print(type(trndata)) # <class ''pybrain.datasets.classification.ClassificationDataSet''> print(type(tstdata)) # <class ''pybrain.datasets.classification.ClassificationDataSet''> trndata._convertToOneOfMany() tstdata._convertToOneOfMany()

La única diferencia que veo entre mi código y el tuyo es tu uso de X. Tal vez puedas confirmar que mi código funciona en tu máquina, y si es así, podemos investigar qué hay de X si confunde las cosas.


Intenté la solución sugerida de , pero aún así me tropecé al ejecutar el tutorial en la línea:

print( trndata[''input''][0], trndata[''target''][0], trndata[''class''][0])

trndata [''clase''] era una matriz vacía, por lo que el índice [0] generó un error.

Pude solucionarlo haciendo mi propia función ConvertToOneOfMany:

def ConvertToOneOfMany(d,nb_classes,bounds=(0,1)): d2 = ClassificationDataSet(d.indim, d.outdim, nb_classes=nb_classes) for n in range(d.getLength()): d2.addSample( d.getSample(n)[0], d.getSample(n)[1] ) oldtarg=d.getField(''target'') newtarg=np.zeros([len(d),nb_classes],dtype=''Int32'')+bounds[0] for i in range(len(d)): newtarg[i,int(oldtarg[i])]=bounds[1] d2.setField(''class'',oldtarg) d2.setField(''target'',newtarg) return(d2)


La implementación de splitWithProportion cambió entre las versiones 0.3.2 y 0.3.3 de PyBrain, introduciendo este error que rompe el polimorfismo.
Hasta el momento, la biblioteca no se ha actualizado desde enero de 2015, por lo que usar algún tipo de solución es el único curso de acción en este momento.

Puede consultar el compromiso responsable aquí: https://github.com/pybrain/pybrain/commit/2f02b8d9e4e9d6edbc135a355ab387048a00f1af


La solución más sencilla que encontré fue hacer primero el splitWithProportion (), actualizar el número de clases y luego hacer _convertToOneOfMany ().

tstdata, trndata = alldata.splitWithProportion( 0.25 ) tstdata.nClasses = alldata.nClasses trndata.nClasses = alldata.nClasses tstdata._convertToOneOfMany(bounds=[0, 1]) trndata._convertToOneOfMany(bounds=[0, 1])

Y con la actualización de nClasses tanto de testdata como de trndata, se garantiza que no obtendrá diferentes dimensiones en los campos de destino.

Estaba obteniendo errores, ya sea si hice primero _convertToOneOfMany y segundo splitWithProportion o al revés al trabajar con un ClassificationDataSet. Por lo tanto, sugerí y actualicé en la función splitWithProportion. Puedes ver el código completo en este pullRequest .


Tengo el mismo problema y creo que lo solucioné: vea esta solicitud de extracción .

(Python 2.7.6, PyBrain 0.3.3, OS X 10.9.5)


Yo tuve el mismo problema. Agregué el siguiente código para que funcione en mi máquina.

tstdata_temp, trndata_temp = alldata.splitWithProportion(0.25) tstdata = ClassificationDataSet(2, 1, nb_classes=3) for n in xrange(0, tstdata_temp.getLength()): tstdata.addSample( tstdata_temp.getSample(n)[0], tstdata_temp.getSample(n)[1] ) trndata = ClassificationDataSet(2, 1, nb_classes=3) for n in xrange(0, trndata_temp.getLength()): trndata.addSample( trndata_temp.getSample(n)[0], trndata_temp.getSample(n)[1] )

Esto convierte tstdata y trndata nuevo al tipo ClassificationDataSet .