Bugfixes in FTS, HOFTS and CVFTS

This commit is contained in:
Petrônio Cândido 2018-08-02 11:13:24 -03:00
parent c6f9af8e00
commit f5652f7029
6 changed files with 64 additions and 32 deletions

View File

@ -332,11 +332,11 @@ def get_point_statistics(data, model, **kwargs):
if not isinstance(forecasts, (list, np.ndarray)): if not isinstance(forecasts, (list, np.ndarray)):
forecasts = [forecasts] forecasts = [forecasts]
nforecasts = np.array(forecasts[:-1]) forecasts = np.array(forecasts[:-1])
ret.append(np.round(rmse(ndata[model.max_lag:], nforecasts), 2)) ret.append(np.round(rmse(ndata[model.max_lag:], forecasts), 2))
ret.append(np.round(mape(ndata[model.max_lag:], nforecasts), 2)) ret.append(np.round(mape(ndata[model.max_lag:], forecasts), 2))
ret.append(np.round(UStatistic(ndata[model.max_lag:], nforecasts), 2)) ret.append(np.round(UStatistic(ndata[model.max_lag:], forecasts), 2))
else: else:
steps_ahead_sampler = kwargs.get('steps_ahead_sampler', 1) steps_ahead_sampler = kwargs.get('steps_ahead_sampler', 1)
nforecasts = [] nforecasts = []

View File

@ -7,6 +7,7 @@
import datetime import datetime
import time import time
from copy import deepcopy from copy import deepcopy
import traceback
import matplotlib as plt import matplotlib as plt
import matplotlib.cm as cmx import matplotlib.cm as cmx
@ -245,8 +246,8 @@ def sliding_window_benchmarks(data, windowsize, train=0.8, **kwargs):
job = experiment_method(deepcopy(model), None, train, test, **kwargs) job = experiment_method(deepcopy(model), None, train, test, **kwargs)
synthesis_method(dataset, tag, job, conn) synthesis_method(dataset, tag, job, conn)
except Exception as ex: except Exception as ex:
print("Error evaluating model " + model.shortname) print('EXCEPTION! ', model.shortname, model.order)
print(ex) traceback.print_exc()
else: else:
job = cluster.submit(deepcopy(model), None, train, test, **kwargs) job = cluster.submit(deepcopy(model), None, train, test, **kwargs)
jobs.append(job) jobs.append(job)
@ -279,11 +280,14 @@ def sliding_window_benchmarks(data, windowsize, train=0.8, **kwargs):
if progress: if progress:
progressbar.update(1) progressbar.update(1)
try: try:
print(model.shortname, model.order, partitioner.name,
partitioner.partitions, str(partitioner.transformation))
job = experiment_method(deepcopy(model), deepcopy(partitioner), train, test, **kwargs) job = experiment_method(deepcopy(model), deepcopy(partitioner), train, test, **kwargs)
synthesis_method(dataset, tag, job, conn) synthesis_method(dataset, tag, job, conn)
except Exception as ex: except Exception as ex:
print("Error evaluating model " + model.shortname + " " + str(partitioner)) print('EXCEPTION! ',model.shortname, model.order, partitioner.name,
print(ex) partitioner.partitions, str(partitioner.transformation))
traceback.print_exc()
else: else:
job = cluster.submit(deepcopy(model), deepcopy(partitioner), train, test, **kwargs) job = cluster.submit(deepcopy(model), deepcopy(partitioner), train, test, **kwargs)
job.id = id # associate an ID to identify jobs (if needed later) job.id = id # associate an ID to identify jobs (if needed later)

View File

@ -144,7 +144,7 @@ class FTS(object):
if not self.is_multivariate: if not self.is_multivariate:
kwargs['type'] = type kwargs['type'] = type
ret = self.apply_inverse_transformations(ret, params=[data[self.order - 1:]], **kwargs) ret = self.apply_inverse_transformations(ret, params=[data[self.max_lag - 1:]], **kwargs)
return ret return ret

View File

@ -38,6 +38,7 @@ class ConditionalVarianceFTS(hofts.HighOrderFTS):
self.shortname = "CVFTS " self.shortname = "CVFTS "
self.detail = "" self.detail = ""
self.flrgs = {} self.flrgs = {}
self.is_high_order = False
if self.partitioner is not None: if self.partitioner is not None:
self.append_transformation(self.partitioner.transformation) self.append_transformation(self.partitioner.transformation)

View File

@ -132,3 +132,19 @@ class SimpleNonStationaryPartitioner(partitioner.Partitioner):
def build(self, data): def build(self, data):
return {} return {}
def simplenonstationary_gridpartitioner_builder(data, npart, transformation):
from pyFTS.partitioners import Grid
from pyFTS.models.nonstationary import perturbation, partitioners
tmp_fs = Grid.GridPartitioner(data=data, npart=npart, transformation=transformation)
fs = partitioners.SimpleNonStationaryPartitioner(data, tmp_fs,
location=perturbation.polynomial,
location_params=[1, 0],
location_roots=0,
width=perturbation.polynomial,
width_params=[1, 0],
width_roots=0)
return fs

View File

@ -1,7 +1,7 @@
import os import os
import numpy as np import numpy as np
from pyFTS.common import Membership, Transformations from pyFTS.common import Membership, Transformations
from pyFTS.models.nonstationary import common, perturbation, partitioners, util from pyFTS.models.nonstationary import common, perturbation, partitioners as nspart, util
from pyFTS.models.nonstationary import nsfts, cvfts from pyFTS.models.nonstationary import nsfts, cvfts
from pyFTS.partitioners import Grid, Entropy from pyFTS.partitioners import Grid, Entropy
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
@ -33,36 +33,47 @@ tdiff = Transformations.Differential(1)
boxcox = Transformations.BoxCox(0) boxcox = Transformations.BoxCox(0)
transformations = {'None': None, 'Differential(1)': tdiff, 'BoxCox(0)': boxcox } transformations = {
'None': None,
'Differential(1)': tdiff,
'BoxCox(0)': boxcox
}
from pyFTS.partitioners import Grid, Util as pUtil from pyFTS.partitioners import Grid, Util as pUtil
from pyFTS.benchmarks import benchmarks as bchmk from pyFTS.benchmarks import benchmarks as bchmk
from pyFTS.models import chen from pyFTS.models import chen, hofts, pwfts, hwang
partitions = {'CMIV': {'BoxCox(0)': 17, 'Differential(1)': 7, 'None': 13}, partitions = {'CMIV': {'BoxCox(0)': 36, 'Differential(1)': 11, 'None': 8},
'IMCV': {'BoxCox(0)': 22, 'Differential(1)': 9, 'None': 25}, 'IMCV': {'BoxCox(0)': 36, 'Differential(1)': 20, 'None': 16},
'IMIV': {'BoxCox(0)': 27, 'Differential(1)': 11, 'None': 6}, 'IMIV': {'BoxCox(0)': 39, 'Differential(1)': 12, 'None': 6},
'NASDAQ': {'BoxCox(0)': 39, 'Differential(1)': 10, 'None': 34}, 'IMIV0': {'BoxCox(0)': 39, 'Differential(1)': 12, 'None': 3},
'SP500': {'BoxCox(0)': 38, 'Differential(1)': 15, 'None': 39}, 'NASDAQ': {'BoxCox(0)': 39, 'Differential(1)': 13, 'None': 36},
'TAIEX': {'BoxCox(0)': 36, 'Differential(1)': 18, 'None': 38}} 'SP500': {'BoxCox(0)': 33, 'Differential(1)': 7, 'None': 33},
'TAIEX': {'BoxCox(0)': 39, 'Differential(1)': 31, 'None': 33}}
tag = 'benchmarks' tag = 'benchmarks'
'''
for ds in datasets.keys():
dataset = datasets[ds]
def nsfts_partitioner_builder(data, npart, transformation): for tf in transformations.keys():
from pyFTS.partitioners import Grid transformation = transformations[tf]
from pyFTS.models.nonstationary import perturbation, partitioners
tmp_fs = Grid.GridPartitioner(data=data, npart=npart, transformation=transformation) partitioning = partitions[ds][tf]
fs = partitioners.SimpleNonStationaryPartitioner(data, tmp_fs,
location=perturbation.polynomial,
location_params=[1, 0],
location_roots=0,
width=perturbation.polynomial,
width_params=[1, 0],
width_roots=0)
return fs
bchmk.sliding_window_benchmarks(dataset, 2000, train=0.2, inc=0.2,
methods=[
hwang.HighOrderFTS,
hofts.HighOrderFTS,
pwfts.ProbabilisticWeightedFTS],
#orders = [3],
benchmark_models=False,
transformations=[transformation],
partitions=[partitioning],
progress=False, type='point',
file="nsfts_benchmarks.db", dataset=ds, tag=tag)
'''
for ds in datasets.keys(): for ds in datasets.keys():
dataset = datasets[ds] dataset = datasets[ds]
@ -75,7 +86,7 @@ for ds in datasets.keys():
bchmk.sliding_window_benchmarks(dataset, 2000, train=0.2, inc=0.2, bchmk.sliding_window_benchmarks(dataset, 2000, train=0.2, inc=0.2,
benchmark_models=False, benchmark_models=False,
methods=[cvfts.ConditionalVarianceFTS], methods=[cvfts.ConditionalVarianceFTS],
partitioners_methods=[nsfts_partitioner_builder], partitioners_methods=[nspart.simplenonstationary_gridpartitioner_builder],
transformations=[transformation], transformations=[transformation],
partitions=[partitioning], partitions=[partitioning],
progress=False, type='point', progress=False, type='point',