Попытка оптимизировать алгоритм PyGMO Simple Geneti c и получить эту ошибку - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь оптимизировать SGA из PyGMO (библиотека называется pagmo2) с SMAC3, объект добавляет 3 параметра, из них 2 одинаковых числа с плавающей точкой (вероятность пересечения и вероятность мутации) и одно категориальное (выбор).

С помощью алгоритма Geneti c я пытаюсь оптимизировать функцию стенда.

Вот код:


# Import from PyGMO and the function to optimize
import pygmo as pg
from booth_function import booth_function

# Import ConfigSpace and different types of parameters
from smac.configspace import ConfigurationSpace
from ConfigSpace.hyperparameters import CategoricalHyperparameter, \
    UniformFloatHyperparameter, UniformIntegerHyperparameter
from ConfigSpace.conditions import InCondition

# Import SMAC-utilities
from smac.tae.execute_func import ExecuteTAFuncDict
from smac.scenario.scenario import Scenario
from smac.facade.smac_hpo_facade import SMAC4HPO

def sga_evaluation(cfg):

    # Define SGA algorithm
    prob = pg.problem(booth_function())

    algo = pg.algorithm(pg.sga(gen = 500, **cfg))

    pop = pg.population(prob,100)

    pop = algo.evolve(pop)

    return pop.champion_f

# Obtain debug information
#logging.basicConfig(level= logging.INFO)

# Building Config. Space, whice defines all parameters and their ranges.
cs = ConfigurationSpace()

# Parameters to optimize
# cr: crossover probability
# m: mutation probability
# selection: selection strategy. (Tournament, Truncated)
cr = UniformFloatHyperparameter("cr", 0.6, 0.9, default_value = 0.90)
m = UniformFloatHyperparameter("m", 0.02, 0.15, default_value = 0.02)
selection = CategoricalHyperparameter("selection", ["tournament", "truncated"], default_value = "tournament")

# Adding this parameters to Config. Space
cs.add_hyperparameters([cr, m, selection])

# Scenario object
scenario = Scenario({"run_obj": "quality",   # we optimize quality (alternatively runtime)
                     "runcount-limit": 50,   # max. number of function evaluations; for this example set to a low number
                     "cs": cs,               # configuration space
                     "deterministic": "true"
                     }) 


# Getting Status, Cost, Runtime and other infos
default_config = sga_evaluation(cs.get_default_configuration())
print("Default Value: %.2f" % (default_config))

# Building SMAC object to start optimization
print("Beginning optimization...")
smac = SMAC4HPO(scenario = scenario, rng = np.random.RandomState(42), 
                tae_runner = sga_evaluation)

incumbent = smac.optimize()
inc_value = sga_evaluation(incumbent)

print("Optimized value: %.2f" % (inc_value))

Я пытался повторить пример из документация (https://github.com/automl/SMAC3/blob/master/examples/SMAC4HPO_svm.py), которая оптимизирует алгоритм SKlearn SVM.

Я не знаю, что я делаю неправильно, надеюсь, кто-то может помочь.

Вывод что я получаю это следующий:

Default Value: 0.68
Beginning optimization...
INFO:smac.facade.smac_hpo_facade.SMAC4HPO:Optimizing a deterministic scenario for quality without a tuner timeout - will make SMAC deterministic and only evaluate one configuration per iteration!
INFO:smac.initial_design.sobol_design.SobolDesign:Running initial design for 12 configurations
INFO:smac.facade.smac_hpo_facade.SMAC4HPO:<class 'smac.facade.smac_hpo_facade.SMAC4HPO'>
INFO:smac.stats.stats.Stats:##########################################################
INFO:smac.stats.stats.Stats:Statistics:
INFO:smac.stats.stats.Stats:#Incumbent changed: 0
INFO:smac.stats.stats.Stats:#Target algorithm runs: 1 / 50.0
INFO:smac.stats.stats.Stats:#Configurations: 1
INFO:smac.stats.stats.Stats:Used wallclock time: 0.08 / inf sec 
INFO:smac.stats.stats.Stats:Used target algorithm runtime: 0.07 / inf sec
INFO:smac.stats.stats.Stats:##########################################################
INFO:smac.facade.smac_hpo_facade.SMAC4HPO:Final Incumbent: None
Traceback (most recent call last):
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/facade/smac_ac_facade.py", line 542, in optimize
    incumbent = self.solver.run()
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/optimizer/smbo.py", line 186, in run
    self.start()
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/optimizer/smbo.py", line 157, in start
    self.incumbent = self.initial_design.run()
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/initial_design/initial_design.py", line 123, in run
    inc = self._run_first_configuration(configs[0], self.scenario)
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/initial_design/initial_design.py", line 185, in _run_first_configuration
    incumbent=initial_incumbent)
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/utils/io/traj_logging.py", line 99, in add_entry
    ta_time_used, wallclock_time)
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/utils/io/traj_logging.py", line 172, in _add_in_aclib_format
    json.dump(traj_entry, fp)
  File "/usr/lib/python3.6/json/__init__.py", line 179, in dump
    for chunk in iterable:
  File "/usr/lib/python3.6/json/encoder.py", line 430, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
    yield from chunks
  File "/usr/lib/python3.6/json/encoder.py", line 437, in _iterencode
    o = _default(o)
  File "/usr/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'ndarray' is not JSON serializable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "opt_bayesiana.py", line 69, in <module>
    incumbent = smac.optimize()
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/facade/smac_ac_facade.py", line 555, in optimize
    fn=os.path.join(self.output_dir, "runhistory.json")
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/runhistory/runhistory.py", line 373, in save_json
    "configs": configs}, fp, cls=EnumEncoder, indent=2)
  File "/usr/lib/python3.6/json/__init__.py", line 179, in dump
    for chunk in iterable:
  File "/usr/lib/python3.6/json/encoder.py", line 430, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
    yield from chunks
  File "/usr/lib/python3.6/json/encoder.py", line 325, in _iterencode_list
    yield from chunks
  File "/usr/lib/python3.6/json/encoder.py", line 325, in _iterencode_list
    yield from chunks
  File "/usr/lib/python3.6/json/encoder.py", line 325, in _iterencode_list
    yield from chunks
  File "/usr/lib/python3.6/json/encoder.py", line 437, in _iterencode
    o = _default(o)
  File "/home/pablo/.local/lib/python3.6/site-packages/smac/runhistory/runhistory.py", line 42, in default
    return json.JSONEncoder.default(self, obj)
  File "/usr/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'ndarray' is not JSON serializable
´´´


...