是否可以获取algorithm.eaSimple以返回包含运行时所有统计信息的日志?

时间:2019-11-03 14:21:30

标签: python deap

我希望能够从日志中获取所有统计信息,以便可以将其用于图形表示。就目前而言,我的日志仅包含世代号和评估数。该算法正在计算和输出avg,std,min和max,但不会返回它们,因此我无法使用它们。有什么方法可以从算法中获取这些值?

我尝试查看用于创建记录的文档,但是那里的内容对我来说没有意义,或者与我的情况有关。

def main():
    pop = toolbox.population(n=300)
    hof = tools.HallOfFame(1)

    stats_fit = tools.Statistics(lambda ind: ind.fitness.values)
    stats_size = tools.Statistics(len)
    mstats = tools.MultiStatistics(fitness=stats_fit, size=stats_size)

    # my hope is that the values calculated by these functions show up in my logbook
    mstats.register("avg", numpy.mean)
    mstats.register("std", numpy.std)
    mstats.register("min", numpy.min)
    mstats.register("max", numpy.max)

    pop, log = algorithms.eaSimple(pop, toolbox, 0.5, 0.1, 200, stats=mstats,
                                   halloffame=hof, verbose=True)

    print(str(log[0]))  # only outputs generations, number of evaluations

我的输出看起来像这样(请注意,我从算法中排除了与树的大小有关的输出,因为我认为这没有必要,并且使输出混乱,但确实输出了该数据)

gen nevals  avg     gen max     min     
0   300     1125.92 0   45318.7 83.1079
1   173     1031.65 1   33883.4 83.1079
2   163     779.317 2   1888.68 83.1079
3   149     901.061 3   33606.2 82.4655
4   165     686.407 4   33883.4 81.8855
5   177     962.785 5   33757   81.8855
6   184     1632.86 6   33885.7 81.8855
7   171     1509.72 7   33856.9 81.8855
8   182     984.048 8   33732.6 81.6701
9   177     1534.63 9   34009.9 81.3255
10  159     1277.39 10  33885.7 80.9722 
{'gen': 0, 'nevals': 300}

我希望最后一行应包括日志中的所有其他内容

编辑:

深入研究我发现这可能是一个错误。该文档说,https://deap.readthedocs.io/en/master/api/algo.html

中包含统计信息时,应该记录该日志

它显示为“它返回优化的种群和带有进化统计信息的日志。该日志将包含世代号,每个世代的评估数以及如果将统计信息作为参数给出的统计信息。”

我已包含统计信息,但似乎无法正常工作。

2 个答案:

答案 0 :(得分:0)

我发现了问题,这似乎是由于我使用MultiStatistics引起的。我回到正常的统计数据,并且工作正常

def main():
    pop = toolbox.population(n=300)
    hof = tools.HallOfFame(1)

    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", numpy.mean)
    stats.register("std", numpy.std)
    stats.register("min", numpy.min)
    stats.register("max", numpy.max)

    pop, log = algorithms.eaSimple(pop, toolbox, 0.5, 0.1, 40, stats,
                                   halloffame=hof, verbose=True)
    print(str(log[0]))

答案 1 :(得分:0)

使用多个统计信息时,必须指定要访问的日志的章节。在您的示例中,统计信息包含两章:fitnesssize。因此,示例中的最后一行应该是

print(log.chapters['fitness'][0])
print(log.chapters['size'][0])

将输出

{'avg': 0.5061951303359752,
 'std': 0.12547520913281693,
 'min': 0.15187521062437034,
 'max': 0.9576681760851814,
 'gen': 0,
 'nevals': 300}
{'avg': 5.0, 'std': 0.0, 'min': 5, 'max': 5, 'gen': 0, 'nevals': 300}