2015-03-11 5 views
1

Я пытаюсь выяснить правильный способ сделать 5-кратное перекрестное подтверждение в pybrain. Я просмотрел их документацию, но это не помогло. Я нашел следующие две версии кода онлайн:Перекрестная проверка в Pybrain

Нашел этот вопрос в вопросе here.

net = pybrain.tools.shortcuts.buildNetwork(5, 8, 1) 
trainer = BackpropTrainer(net, ds) 
evaluation = ModuleValidator.classificationPerformance(trainer.module, ds) 
validator = CrossValidator(trainer=trainer, dataset=trainer.ds, n_folds=5, valfunc=evaluation) 
print(validator.validate()) 

Error:
evaluation = ModuleValidator.classificationPerformance(trainer.module, ds)

File ".../pybrain/tools/validation.py", line 168, in classificationPerformancedataset)

File ".../pybrain/tools/validation.py", line 204, in validate return valfunc(output, target)

File ".../pybrain/tools/validation.py", line 33, in classificationPerformance return float(n_correct)/float(len(output))

TypeError: only length-1 arrays can be converted to Python scalars

И второй один here.

modval = ModuleValidator() 
    for i in range(1000): 
     trainer.trainEpochs(1) 
     trainer.trainOnDataset(dataset=trndata) 
     cv = CrossValidator(trainer, trndata, n_folds=5, valfunc=modval.MSE) 
     print "MSE %f @ %i" %(cv.validate(), i) 

Error - trainer.train()

File ".../rprop.py", line 43, in train for seq in self.ds._provideSequences():

AttributeError: 'NoneType' object has no attribute '_provideSequences'

Я пошел к исходному коду, чтобы попытаться проследить причину ошибки, но не мог понять, что мне нужно изменить. Любая помощь оценивается.

Когда я запускал свой код, просто разделив набор данных на 3 части (обучение, проверка и тестирование), он работал хорошо. Я получаю эти ошибки только тогда, когда я пытался реализовать кросс-валидность k-fold.

+0

Вы могли решить эту проблему? – displayname

+0

Нет, я не мог. Мне пришлось отказаться от этого подхода. – Champ

+0

[Я думаю, проблема в том, что они используют 'sum()' вместо 'np.sum()'] (https://github.com/pybrain/pybrain/issues/182). – displayname

ответ

1

Это, казалось, работал для меня:

import numpy as np 

from processdata import process_data 
from pybrain.datasets import ClassificationDataSet 
from pybrain.datasets import SupervisedDataSet 
from pybrain.structure import FeedForwardNetwork 
from pybrain.structure import LinearLayer, SigmoidLayer 
from pybrain.structure import FullConnection 
from pybrain.supervised.trainers import BackpropTrainer 

n=FeedForwardNetwork() 

#Define Layers 
inLayer= LinearLayer(200) 
hiddenLayer= SigmoidLayer(100) 
outLayer = LinearLayer(1) 

#Add layers to the neural net module 
n.addInputModule(inLayer) 
n.addModule(hiddenLayer) 
n.addOutputModule(outLayer) 

#Define Connections 
in_to_hidden = FullConnection(inLayer, hiddenLayer) 
hidden_to_out = FullConnection(hiddenLayer, outLayer) 

#add connections to the module 
n.addConnection(in_to_hidden) 
n.addConnection(hidden_to_out) 
#make ready 
n.sortModules() 

#Define Trainer 
trainer = BackpropTrainer(n, dataset=ds, momentum=0.1, verbose=True, weightdecay=0.005) 

#perform crossvalidation 
from pyBrain.tools.validation import CrossValidator 
cv=CrossValidator(trainer=trainer, dataset=ds, n_folds=5) #creates a crossvalidator instance 
CrossValidator.validate(cv) #calls the validate() function in CrossValidator to return results 

Он должен выводить ошибки для каждой складки.

Смежные вопросы