pyFTS/pyFTS/notebooks/Ismail & Efendi - ImprovedWeightedFTS.ipynb
2018-02-27 18:30:20 -03:00

268 KiB

First Order Improved Weighted Fuzzy Time Series by Efendi, Ismail and Deris (2013)

R. Efendi, Z. Ismail, and M. M. Deris, “Improved weight Fuzzy Time Series as used in the exchange rates forecasting of US Dollar to Ringgit Malaysia,” Int. J. Comput. Intell. Appl., vol. 12, no. 1, p. 1350005, 2013.

Common Imports

In [1]:
import matplotlib.pylab as plt
from pyFTS.benchmarks import benchmarks as bchmk
from pyFTS.models import ismailefendi

%pylab inline
Populating the interactive namespace from numpy and matplotlib
/usr/local/lib/python3.6/dist-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.
  from pandas.core import datetools
/usr/lib/python3/dist-packages/IPython/core/magics/pylab.py:161: UserWarning: pylab import has clobbered these variables: ['plt']
`%matplotlib` prevents importing * from pylab and numpy
  "\n`%matplotlib` prevents importing * from pylab and numpy"

Data Loading

In [2]:
from pyFTS.data import Enrollments

enrollments = Enrollments.get_data()

Exploring the partitioning effects on original data

In [3]:
tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, ismailefendi.ImprovedWeightedFTS, 
                              range(4,12), [1], tam=[10, 5])

Exploring the partitioning effects on transformed data

In [4]:
from pyFTS.common import Transformations
diff = Transformations.Differential(1)

tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, ismailefendi.ImprovedWeightedFTS, 
                              range(2,10), [1], transformation=diff, tam=[10, 5])

Comparing the partitioning schemas

In [13]:
from pyFTS.partitioners import Grid, Util as pUtil

fuzzy_sets = Grid.GridPartitioner(enrollments, 11)
fuzzy_sets2 = Grid.GridPartitioner(enrollments, 4, transformation=diff)

pUtil.plot_partitioners(enrollments, [fuzzy_sets,fuzzy_sets2])

Fitting a model on original data

In [14]:
model1 = ismailefendi.ImprovedWeightedFTS("FTS", partitioner=fuzzy_sets)
model1.fit(enrollments)

print(model1)
Improved Weighted FTS:
A2 -> A2(0.667),A3(0.333)
A3 -> A4(1.0)
A4 -> A4(0.714),A5(0.286)
A5 -> A4(0.333),A6(0.667)
A6 -> A5(0.333),A6(0.333),A7(0.333)
A7 -> A8(1.0)
A8 -> A9(1.0)
A9 -> A8(0.5),A9(0.5)

Fitting a model on transformed data

In [15]:
model2 = ismailefendi.ImprovedWeightedFTS("FTS Diff", partitioner=fuzzy_sets2)
model2.append_transformation(diff)
model2.fit(enrollments)

print(model2)
Improved Weighted FTS:
A0 -> A1(1.0)
A1 -> A0(0.143),A1(0.286),A2(0.429),A3(0.143)
A2 -> A1(0.444),A2(0.222),A3(0.333)
A3 -> A2(0.75),A3(0.25)

Using the models

In [16]:
model1.predict(enrollments)
Out[16]:
[13769.148484848485,
 13769.148484848485,
 13769.148484848485,
 15211.754545454547,
 15459.058441558444,
 15459.058441558444,
 15459.058441558444,
 16365.839393939395,
 16942.88181818182,
 16942.88181818182,
 16365.839393939395,
 15459.058441558444,
 15459.058441558444,
 15459.058441558444,
 15459.058441558444,
 16365.839393939395,
 16942.88181818182,
 18674.009090909094,
 19539.57272727273,
 19106.790909090912,
 19106.790909090912,
 19539.57272727273]
In [17]:
model2.predict(enrollments)
Out[17]:
[12801.572222222223,
 13113.492857142857,
 13613.572222222223,
 14246.492857142857,
 15010.492857142857,
 15280.6125,
 15349.572222222223,
 15607.572222222223,
 16357.492857142857,
 16665.57222222222,
 16357.6125,
 15402.6125,
 15243.572222222223,
 15114.6125,
 14909.572222222223,
 15534.492857142857,
 16409.492857142857,
 17347.55,
 18520.492857142857,
 19074.57222222222,
 19083.57222222222,
 18845.6125]

Comparing the models

In [18]:
bchmk.plot_compared_series(enrollments, [model1, model2], bchmk.colors, intervals=False)
In [19]:
bchmk.print_point_statistics(enrollments, [model1, model2])
Model		& Order     & RMSE		& SMAPE      & Theil's U		\\ 
IWFTS FTS		& 1		& 485.63		& 1.17		& 0.79	\\ 
IWFTS FTS Diff		& 1		& 880.72		& 2.27		& 1.44	\\ 

Residual Analysis

In [12]:
from pyFTS.benchmarks import ResidualAnalysis as ra

ra.plot_residuals(enrollments, [model1, model2])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/lib/python3/dist-packages/IPython/core/formatters.py in __call__(self, obj)
    305                 pass
    306             else:
--> 307                 return printer(obj)
    308             # Finally look for special method names
    309             method = get_real_method(obj, self.print_method)

/usr/lib/python3/dist-packages/IPython/core/pylabtools.py in <lambda>(fig)
    225 
    226     if 'png' in formats:
--> 227         png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
    228     if 'retina' in formats or 'png2x' in formats:
    229         png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))

/usr/lib/python3/dist-packages/IPython/core/pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs)
    117 
    118     bytes_io = BytesIO()
--> 119     fig.canvas.print_figure(bytes_io, **kw)
    120     data = bytes_io.getvalue()
    121     if fmt == 'svg':

/usr/local/lib/python3.6/dist-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
   2214                     orientation=orientation,
   2215                     dryrun=True,
-> 2216                     **kwargs)
   2217                 renderer = self.figure._cachedRenderer
   2218                 bbox_inches = self.figure.get_tightbbox(renderer)

/usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py in print_png(self, filename_or_obj, *args, **kwargs)
    505 
    506     def print_png(self, filename_or_obj, *args, **kwargs):
--> 507         FigureCanvasAgg.draw(self)
    508         renderer = self.get_renderer()
    509         original_dpi = renderer.dpi

/usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py in draw(self)
    428             # if toolbar:
    429             #     toolbar.set_cursor(cursors.WAIT)
--> 430             self.figure.draw(self.renderer)
    431         finally:
    432             # if toolbar:

/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     53                 renderer.start_filter()
     54 
---> 55             return draw(artist, renderer, *args, **kwargs)
     56         finally:
     57             if artist.get_agg_filter() is not None:

/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py in draw(self, renderer)
   1297 
   1298             mimage._draw_list_compositing_images(
-> 1299                 renderer, self, artists, self.suppressComposite)
   1300 
   1301             renderer.close_group('figure')

/usr/local/lib/python3.6/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    136     if not_composite or not has_images:
    137         for a in artists:
--> 138             a.draw(renderer)
    139     else:
    140         # Composite any adjacent images together

/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     53                 renderer.start_filter()
     54 
---> 55             return draw(artist, renderer, *args, **kwargs)
     56         finally:
     57             if artist.get_agg_filter() is not None:

/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe)
   2435             renderer.stop_rasterizing()
   2436 
-> 2437         mimage._draw_list_compositing_images(renderer, self, artists)
   2438 
   2439         renderer.close_group('axes')

/usr/local/lib/python3.6/dist-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    136     if not_composite or not has_images:
    137         for a in artists:
--> 138             a.draw(renderer)
    139     else:
    140         # Composite any adjacent images together

/usr/local/lib/python3.6/dist-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     53                 renderer.start_filter()
     54 
---> 55             return draw(artist, renderer, *args, **kwargs)
     56         finally:
     57             if artist.get_agg_filter() is not None:

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in draw(self, renderer, *args, **kwargs)
   1131         renderer.open_group(__name__)
   1132 
-> 1133         ticks_to_draw = self._update_ticks(renderer)
   1134         ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw,
   1135                                                                 renderer)

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in _update_ticks(self, renderer)
    972 
    973         interval = self.get_view_interval()
--> 974         tick_tups = list(self.iter_ticks())
    975         if self._smart_bounds and tick_tups:
    976             # handle inverted limits

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in iter_ticks(self)
    915         Iterate through all of the major and minor ticks.
    916         """
--> 917         majorLocs = self.major.locator()
    918         majorTicks = self.get_major_ticks(len(majorLocs))
    919         self.major.formatter.set_locs(majorLocs)

/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in __call__(self)
   1951     def __call__(self):
   1952         vmin, vmax = self.axis.get_view_interval()
-> 1953         return self.tick_values(vmin, vmax)
   1954 
   1955     def tick_values(self, vmin, vmax):

/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in tick_values(self, vmin, vmax)
   1959         vmin, vmax = mtransforms.nonsingular(
   1960             vmin, vmax, expander=1e-13, tiny=1e-14)
-> 1961         locs = self._raw_ticks(vmin, vmax)
   1962 
   1963         prune = self._prune

/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in _raw_ticks(self, vmin, vmax)
   1901         if self._nbins == 'auto':
   1902             if self.axis is not None:
-> 1903                 nbins = np.clip(self.axis.get_tick_space(),
   1904                                 max(1, self._min_n_ticks - 1), 9)
   1905             else:

/usr/local/lib/python3.6/dist-packages/matplotlib/axis.py in get_tick_space(self)
   2060         size = tick.label1.get_size() * 3
   2061         if size > 0:
-> 2062             return int(np.floor(length / size))
   2063         else:
   2064             return 2**31 - 1

ValueError: cannot convert float NaN to integer
<matplotlib.figure.Figure at 0x7f25e2d76be0>
In [ ]:

In [ ]: