我和你有同样的问题,并快速回答问题:不,没有直接的方法可以做到这一点。
但这当然是可行的。
pybrain 代码混乱
这似乎是最简单的解决方案,这里有BackpropTrainer.testOnData 的源代码。如您所见,如果将verbose 设置为True,它将打印所有错误。
if verbose:
print('All errors:', ponderatedErrors)
assert sum(importances) > 0
avgErr = sum(errors) / sum(importances)
if verbose:
print('Average error:', avgErr)
print(('Max error:', max(ponderatedErrors), 'Median error:',
sorted(ponderatedErrors)[len(errors) / 2]))
return avgErr
我们可以让它返回avgErr 的所有错误,方法是将最后一行更改为:
return avgErr, ponderatedErrors
然后您只需解包结果即可捕获值:
avgErr, allErrors = trainer.testOnData(dataSet, verbose=True)
或者当您不希望出现所有错误时:
avgErr, _ = trainer.testOnData(dataSet, verbose=True)
这是最简单的解决方案。但不是每个人都喜欢弄乱外部库源代码。
更改标准输出,将其捕获并转换为文件
这是几个步骤,因为testOnData 永远不会返回所有错误,只是打印它,这意味着你必须将字符串转换为有用的东西(让我们尝试使用列表)。
更改stdout 以打印到文件中
这很简单:
import sys
sys.stdout = open('./OURFILE', 'w+')
所以现在当我们运行testOnData 时,输出会保存在文件中。
处理那个字符串
我们对文件的第二行很感兴趣,所以让我们看看吧:
our_file = open('./OURFILE', 'r')
our_file.next() # get rid of first line
our_line = our_file.next() # save second line
因为 pybrain 是如何编写的,所以我们的行看起来像这样:
('所有错误:', HERE_IS_LIST_OF_ERRORS)
现在,我不是正则表达式向导,所以我只会在列表开始时计算。
still_string = our_line[16:-1]
它会给我们一个只包含一个列表的字符串。现在你可以使用 eval 将 sting 更改为正确的列表:
list_of_errors = eval(still_string)
从这里,你可以使用numpy 或pandas 来玩它。
希望对你有所帮助。