Я пытаюсь оптимизировать 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
´´´