Random Search in hyperparam
This commit is contained in:
parent
ed9c07deae
commit
ad1205121d
@ -410,10 +410,6 @@ class FTS(object):
|
|||||||
if save:
|
if save:
|
||||||
Util.persist_obj(self, file_path)
|
Util.persist_obj(self, file_path)
|
||||||
|
|
||||||
if 'statistics' in kw:
|
|
||||||
kwargs['statistics'] = kw['statistics']
|
|
||||||
print(kwargs['statistics'])
|
|
||||||
|
|
||||||
|
|
||||||
def clone_parameters(self, model):
|
def clone_parameters(self, model):
|
||||||
"""
|
"""
|
||||||
|
@ -29,7 +29,7 @@ from pyFTS.common import Membership
|
|||||||
from pyFTS.models import hofts, ifts, pwfts
|
from pyFTS.models import hofts, ifts, pwfts
|
||||||
from pyFTS.hyperparam import Util as hUtil
|
from pyFTS.hyperparam import Util as hUtil
|
||||||
from pyFTS.distributed import dispy as dUtil
|
from pyFTS.distributed import dispy as dUtil
|
||||||
from pyFTS.hyperparam import Evolutionary
|
from pyFTS.hyperparam import Evolutionary, random_search as RS
|
||||||
from pyFTS.models.multivariate import mvfts, wmvfts, variable
|
from pyFTS.models.multivariate import mvfts, wmvfts, variable
|
||||||
from pyFTS.models.seasonal import partitioner as seasonal
|
from pyFTS.models.seasonal import partitioner as seasonal
|
||||||
from pyFTS.models.seasonal.common import DateTime
|
from pyFTS.models.seasonal.common import DateTime
|
||||||
@ -315,6 +315,7 @@ def crossover_variable_params(best, worst, var):
|
|||||||
param = {'partitioner': partitioner, 'npart': npart, 'alpha': alpha, 'mf': mf}
|
param = {'partitioner': partitioner, 'npart': npart, 'alpha': alpha, 'mf': mf}
|
||||||
return param
|
return param
|
||||||
|
|
||||||
|
|
||||||
def mutation(individual, **kwargs):
|
def mutation(individual, **kwargs):
|
||||||
"""
|
"""
|
||||||
Mutation operator
|
Mutation operator
|
||||||
@ -356,6 +357,51 @@ def mutation(individual, **kwargs):
|
|||||||
|
|
||||||
return individual
|
return individual
|
||||||
|
|
||||||
|
def mutation_random_search(individual, **kwargs):
|
||||||
|
"""
|
||||||
|
Mutation operator
|
||||||
|
|
||||||
|
:param individual: an individual genotype
|
||||||
|
:param pmut: individual probability o
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
|
||||||
|
vars = kwargs.get('variables', None)
|
||||||
|
tvar = kwargs.get('target_variable', None)
|
||||||
|
l = len(vars)
|
||||||
|
|
||||||
|
il = len(individual['explanatory_variables'])
|
||||||
|
#
|
||||||
|
if il > 1:
|
||||||
|
for l in range(il):
|
||||||
|
il = len(individual['explanatory_variables'])
|
||||||
|
rnd = random.uniform(0, 1)
|
||||||
|
if rnd > .5:
|
||||||
|
rnd = random.randint(0, il-1)
|
||||||
|
val = individual['explanatory_variables'][rnd]
|
||||||
|
individual['explanatory_variables'].remove(val)
|
||||||
|
individual['explanatory_params'].pop(rnd)
|
||||||
|
else:
|
||||||
|
rnd = random.randint(0, l-1)
|
||||||
|
while rnd in individual['explanatory_variables']:
|
||||||
|
rnd = random.randint(0, l-1)
|
||||||
|
individual['explanatory_variables'].append(rnd)
|
||||||
|
individual['explanatory_params'].append(random_param(vars[rnd]))
|
||||||
|
|
||||||
|
for ct in np.arange(len(individual['explanatory_variables'])):
|
||||||
|
rnd = random.uniform(0, 1)
|
||||||
|
if rnd > .5:
|
||||||
|
mutate_variable_params(individual['explanatory_params'][ct], vars[ct])
|
||||||
|
|
||||||
|
rnd = random.uniform(0, 1)
|
||||||
|
if rnd > .5:
|
||||||
|
mutate_variable_params(individual['target_params'], tvar)
|
||||||
|
|
||||||
|
individual['f1'] = None
|
||||||
|
individual['f2'] = None
|
||||||
|
|
||||||
|
return individual
|
||||||
|
|
||||||
|
|
||||||
def mutate_variable_params(param, var):
|
def mutate_variable_params(param, var):
|
||||||
if var['type']=='common':
|
if var['type']=='common':
|
||||||
@ -458,3 +504,31 @@ def log_result(datasetname, fts_method, result):
|
|||||||
file.write(json.dumps(result))
|
file.write(json.dumps(result))
|
||||||
|
|
||||||
print(result)
|
print(result)
|
||||||
|
|
||||||
|
|
||||||
|
def random_search(datasetname, dataset, **kwargs):
|
||||||
|
experiments = kwargs.get('experiments', 30)
|
||||||
|
|
||||||
|
distributed = kwargs.get('distributed', False)
|
||||||
|
|
||||||
|
fts_method = kwargs.get('fts_method', hofts.WeightedHighOrderFTS)
|
||||||
|
shortname = str(fts_method.__module__).split('.')[-1]
|
||||||
|
|
||||||
|
kwargs['mutation_operator'] = mutation_random_search
|
||||||
|
kwargs['evaluation_operator'] = evaluate
|
||||||
|
kwargs['random_individual'] = random_genotype
|
||||||
|
|
||||||
|
ret = []
|
||||||
|
for i in np.arange(experiments):
|
||||||
|
print("Experiment {}".format(i))
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
|
ret, statistics = RS.execute (dataset, **kwargs)
|
||||||
|
end = time.time()
|
||||||
|
ret['time'] = end - start
|
||||||
|
experiment = {'individual': ret, 'statistics': statistics}
|
||||||
|
|
||||||
|
ret = process_experiment(shortname, experiment, datasetname)
|
||||||
|
|
||||||
|
|
||||||
|
return ret
|
84
pyFTS/hyperparam/random_search.py
Normal file
84
pyFTS/hyperparam/random_search.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
"""
|
||||||
|
Simple Random Search Hyperparameter Optimization
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pyFTS.hyperparam import Evolutionary
|
||||||
|
import time
|
||||||
|
|
||||||
|
__measures = ['f1', 'f2', 'rmse', 'size']
|
||||||
|
|
||||||
|
|
||||||
|
def execute( dataset, **kwargs):
|
||||||
|
"""
|
||||||
|
Batch execution of Random Search Hyperparameter Optimization
|
||||||
|
|
||||||
|
:param datasetname:
|
||||||
|
:param dataset: The time series to optimize the FTS
|
||||||
|
:keyword ngen: An integer value with the maximum number of generations, default value: 30
|
||||||
|
:keyword mgen: An integer value with the maximum number of generations without improvement to stop, default value 7
|
||||||
|
:keyword fts_method: The FTS method to optimize
|
||||||
|
:keyword parameters: dict with model specific arguments for fts_method
|
||||||
|
:keyword random_individual: create an random genotype
|
||||||
|
:keyword evalutation_operator: a function that receives a dataset and an individual and return its fitness
|
||||||
|
:keyword mutation_operator: a function that receives one individual and return a changed individual
|
||||||
|
:keyword window_size: An integer value with the the length of scrolling window for train/test on dataset
|
||||||
|
:keyword train_rate: A float value between 0 and 1 with the train/test split ([0,1])
|
||||||
|
:keyword increment_rate: A float value between 0 and 1 with the the increment of the scrolling window,
|
||||||
|
relative to the window_size ([0,1])
|
||||||
|
:keyword collect_statistics: A boolean value indicating to collect statistics for each generation
|
||||||
|
:keyword distributed: A value indicating it the execution will be local and sequential (distributed=False),
|
||||||
|
or parallel and distributed (distributed='dispy' or distributed='spark')
|
||||||
|
:keyword cluster: If distributed='dispy' the list of cluster nodes, else if distributed='spark' it is the master node
|
||||||
|
:return: the best genotype
|
||||||
|
"""
|
||||||
|
|
||||||
|
ngen = kwargs.get('ngen',30)
|
||||||
|
mgen = kwargs.get('mgen', 7)
|
||||||
|
|
||||||
|
kwargs['pmut'] = 1.0
|
||||||
|
|
||||||
|
random_individual = kwargs.get('random_individual', Evolutionary.random_genotype)
|
||||||
|
evaluation_operator = kwargs.get('evaluation_operator', Evolutionary.evaluate)
|
||||||
|
mutation_operator = kwargs.get('mutation_operator', Evolutionary.mutation)
|
||||||
|
|
||||||
|
no_improvement_count = 0
|
||||||
|
|
||||||
|
individual = random_individual(**kwargs)
|
||||||
|
|
||||||
|
stat = {}
|
||||||
|
|
||||||
|
stat[0] = {}
|
||||||
|
|
||||||
|
ret = evaluation_operator(dataset, individual, **kwargs)
|
||||||
|
for key in __measures:
|
||||||
|
individual[key] = ret[key]
|
||||||
|
stat[0][key] = ret[key]
|
||||||
|
|
||||||
|
print(individual)
|
||||||
|
|
||||||
|
for i in range(1,ngen+1):
|
||||||
|
print("GENERATION {} {}".format(i, time.time()))
|
||||||
|
|
||||||
|
new = mutation_operator(individual, **kwargs)
|
||||||
|
ret = evaluation_operator(dataset, new, **kwargs)
|
||||||
|
new_stat = {}
|
||||||
|
for key in __measures:
|
||||||
|
new[key] = ret[key]
|
||||||
|
new_stat[key] = ret[key]
|
||||||
|
|
||||||
|
print(new)
|
||||||
|
|
||||||
|
if new['f1'] <= individual['f1'] and new['f2'] <= individual['f2']:
|
||||||
|
individual = new
|
||||||
|
no_improvement_count = 0
|
||||||
|
stat[i] = new_stat
|
||||||
|
print(individual)
|
||||||
|
else:
|
||||||
|
stat[i] = stat[i-1]
|
||||||
|
no_improvement_count += 1
|
||||||
|
print("WITHOUT IMPROVEMENT {}".format(no_improvement_count))
|
||||||
|
|
||||||
|
if no_improvement_count == mgen:
|
||||||
|
break
|
||||||
|
|
||||||
|
return individual, stat
|
@ -162,12 +162,10 @@ class Partitioner(object):
|
|||||||
nearest = self.search(data, type='index')
|
nearest = self.search(data, type='index')
|
||||||
mv = np.zeros(self.partitions)
|
mv = np.zeros(self.partitions)
|
||||||
|
|
||||||
try:
|
for ix in nearest:
|
||||||
for ix in nearest:
|
tmp = self[ix].membership(data)
|
||||||
tmp = self[ix].membership(data)
|
mv[ix] = tmp if tmp >= alpha_cut else 0.
|
||||||
mv[ix] = tmp if tmp >= alpha_cut else 0.
|
|
||||||
except:
|
|
||||||
print(ix)
|
|
||||||
|
|
||||||
ix = np.ravel(np.argwhere(mv > 0.))
|
ix = np.ravel(np.argwhere(mv > 0.))
|
||||||
|
|
||||||
|
@ -56,6 +56,20 @@ explanatory_variables =[
|
|||||||
|
|
||||||
target_variable = {'name': 'Load', 'data_label': 'load', 'type': 'common'}
|
target_variable = {'name': 'Load', 'data_label': 'load', 'type': 'common'}
|
||||||
nodes=['192.168.28.38']
|
nodes=['192.168.28.38']
|
||||||
|
|
||||||
|
deho_mv.random_search(datsetname, dataset,
|
||||||
|
ngen=200, mgen=200,
|
||||||
|
window_size=2000, train_rate=.9, increment_rate=1,
|
||||||
|
experiments=1,
|
||||||
|
fts_method=wmvfts.WeightedMVFTS,
|
||||||
|
variables=explanatory_variables,
|
||||||
|
target_variable=target_variable,
|
||||||
|
#distributed='dispy', nodes=nodes,
|
||||||
|
parameters=dict(num_batches=5)
|
||||||
|
#parameters=dict(distributed='dispy', nodes=nodes, num_batches=5)
|
||||||
|
)
|
||||||
|
|
||||||
|
'''
|
||||||
deho_mv.execute(datsetname, dataset,
|
deho_mv.execute(datsetname, dataset,
|
||||||
ngen=20, npop=15,psel=0.6, pcross=.5, pmut=.3,
|
ngen=20, npop=15,psel=0.6, pcross=.5, pmut=.3,
|
||||||
window_size=2000, train_rate=.9, increment_rate=1,
|
window_size=2000, train_rate=.9, increment_rate=1,
|
||||||
@ -67,7 +81,7 @@ deho_mv.execute(datsetname, dataset,
|
|||||||
parameters=dict(num_batches=5)
|
parameters=dict(num_batches=5)
|
||||||
#parameters=dict(distributed='dispy', nodes=nodes, num_batches=5)
|
#parameters=dict(distributed='dispy', nodes=nodes, num_batches=5)
|
||||||
)
|
)
|
||||||
|
'''
|
||||||
'''
|
'''
|
||||||
ret = Evolutionary.execute(datsetname, dataset,
|
ret = Evolutionary.execute(datsetname, dataset,
|
||||||
ngen=30, npop=20,psel=0.6, pcross=.5, pmut=.3,
|
ngen=30, npop=20,psel=0.6, pcross=.5, pmut=.3,
|
||||||
|
Loading…
Reference in New Issue
Block a user