DMG logo PMML 4.3 - Time Series Models
PMML4.3 Menu

Home

Changes

XML Schema

Conformance

Interoperability

General Structure

Field Scope

Header

Data
Dictionary


Mining
Schema


Transformations

Statistics

Taxomony

Targets

Output

Functions

Built-in Functions

Model Verification

Model Explanation

Multiple Models

Association Rules

Baseline Models

Bayesian Network

Cluster
Models


Gaussian
Process


General
Regression


k-Nearest
Neighbors


Naive
Bayes


Neural
Network


Regression

Ruleset

Scorecard

Sequences

Text Models

Time Series

Trees

Vector Machine

PMML 4.3 - Time Series Models

A Time Series is a sequence of data points, measured at points in time, usually, but not necessarily, forming equidistant intervals. Time series analysis strives to understand such time series, often with the goal of making forecasts (predictions) or of filling in missing values between known data points. Time series prediction is the use of a model to predict future events based on known past events before they are measured. Interpolation is the use of a model to complement or amend values between known data points.

The model must contain information on the general trend, a description of periodic behavior and an overall fitting function that can be used for forecasting and/or interpolation. It may also contain detailed information on various aspects of the time series and the expected forecasting accuracy.

In addition to the entries common to all models, a TimeSeriesModel contains results of at least one time series algorithm, for example SpectralAnalysis, ARIMA, ExponentialSmoothing or SeasonalTrendDecomposition. In PMML 4.2, only Exponential Smoothing is defined, the other algorithms are planned for later versions. There are up to three TimeSeries elements holding original or predicted time series values.

<xs:element name="TimeSeriesModel">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element ref="MiningSchema"/>
      <xs:element ref="Output" minOccurs="0"/>
      <xs:element ref="ModelStats" minOccurs="0"/>
      <xs:element ref="ModelExplanation" minOccurs="0"/>
      <xs:element ref="LocalTransformations" minOccurs="0"/>
      <xs:element ref="TimeSeries" minOccurs="0" maxOccurs="3"/>
      <xs:element ref="SpectralAnalysis" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="ARIMA" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="ExponentialSmoothing" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="SeasonalTrendDecomposition" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="ModelVerification" minOccurs="0"/>
      <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="modelName" type="xs:string" use="optional"/>
    <xs:attribute name="functionName" type="MINING-FUNCTION" use="required"/>
    <xs:attribute name="algorithmName" type="xs:string" use="optional"/>
    <xs:attribute name="bestFit" type="TIMESERIES-ALGORITHM" use="required"/>
    <xs:attribute name="isScorable" type="xs:boolean" default="true"/>
  </xs:complexType>
</xs:element>    

<xs:simpleType name="TIMESERIES-ALGORITHM">
  <xs:restriction base="xs:string">
    <xs:enumeration value="ARIMA"/>
    <xs:enumeration value="ExponentialSmoothing"/>
    <xs:enumeration value="SeasonalTrendDecomposition"/>
    <xs:enumeration value="SpectralAnalysis"/>
  </xs:restriction>
</xs:simpleType>    

<xs:element name="TimeSeries">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="TimeAnchor" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="TimeValue" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="usage" type="TIMESERIES-USAGE" default="original"/>
    <xs:attribute name="startTime" type="REAL-NUMBER"/>
    <xs:attribute name="endTime" type="REAL-NUMBER"/>
    <xs:attribute name="interpolationMethod" type="INTERPOLATION-METHOD" default="none"/>
  </xs:complexType>
</xs:element>

<xs:simpleType name="TIMESERIES-USAGE">
  <xs:restriction base="xs:string">
    <xs:enumeration value="original"/>
    <xs:enumeration value="logical"/>
    <xs:enumeration value="prediction"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="TimeValue">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Timestamp" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="index" type="INT-NUMBER" use="optional"/>
    <xs:attribute name="time" type="NUMBER" use="optional"/>
    <xs:attribute name="value" type="REAL-NUMBER" use="required"/>
    <xs:attribute name="standardError" type="REAL-NUMBER" use="optional"/>
  </xs:complexType>
</xs:element>

<xs:element name="TimeAnchor">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="TimeCycle" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element ref="TimeException" minOccurs="0" maxOccurs="2"/>
    </xs:sequence>
    <xs:attribute name="type" type="TIME-ANCHOR"/>
    <xs:attribute name="offset" type="INT-NUMBER"/>
    <xs:attribute name="stepsize" type="INT-NUMBER"/>
    <xs:attribute name="displayName" use="optional"/>
  </xs:complexType>
</xs:element>

<xs:element name="TimeCycle">
  <xs:complexType>
    <xs:sequence>
      <xs:group ref="INT-ARRAY" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="length" type="INT-NUMBER"/>
    <xs:attribute name="type" type="VALID-TIME-SPEC"/>
    <xs:attribute name="displayName" use="optional"/>
  </xs:complexType>
</xs:element>

<xs:simpleType name="TIME-ANCHOR">
  <xs:restriction base="xs:string">
    <xs:enumeration value="dateTimeMillisecondsSince[0]"/>
    <xs:enumeration value="dateTimeMillisecondsSince[1960]"/>
    <xs:enumeration value="dateTimeMillisecondsSince[1970]"/>
    <xs:enumeration value="dateTimeMillisecondsSince[1980]"/>
    <xs:enumeration value="dateTimeSecondsSince[0]"/>
    <xs:enumeration value="dateTimeSecondsSince[1960]"/>
    <xs:enumeration value="dateTimeSecondsSince[1970]"/>
    <xs:enumeration value="dateTimeSecondsSince[1980]"/>
    <xs:enumeration value="dateDaysSince[0]"/>
    <xs:enumeration value="dateDaysSince[1960]"/>
    <xs:enumeration value="dateDaysSince[1970]"/>
    <xs:enumeration value="dateDaysSince[1980]"/>
    <xs:enumeration value="dateMonthsSince[0]"/>
    <xs:enumeration value="dateMonthsSince[1960]"/>
    <xs:enumeration value="dateMonthsSince[1970]"/>
    <xs:enumeration value="dateMonthsSince[1980]"/>
    <xs:enumeration value="dateYearsSince[0]"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="VALID-TIME-SPEC">
  <xs:restriction base="xs:string">
    <xs:enumeration value="includeAll"/>
    <xs:enumeration value="includeFromTo"/>
    <xs:enumeration value="excludeFromTo"/>
    <xs:enumeration value="includeSet"/>
    <xs:enumeration value="excludeSet"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="TimeException">
  <xs:complexType>
    <xs:sequence>
      <xs:group ref="INT-ARRAY" minOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="type" type="TIME-EXCEPTION-TYPE"/>
    <xs:attribute name="count" type="INT-NUMBER"/>
  </xs:complexType>
</xs:element>

<xs:simpleType name="TIME-EXCEPTION-TYPE">
  <xs:restriction base="xs:string">
    <xs:enumeration value="exclude"/>
    <xs:enumeration value="include"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="INTERPOLATION-METHOD">
  <xs:restriction base="xs:string">
    <xs:enumeration value="none"/>
    <xs:enumeration value="linear"/>
    <xs:enumeration value="exponentialSpline"/>
    <xs:enumeration value="cubicSpline"/>
  </xs:restriction>
</xs:simpleType>

The isScorable attribute indicates whether the model is valid for scoring. If this attribute is true or if it is missing, then the model should be processed normally. However, if the attribute is false, then the model producer has indicated that this model is intended for information purposes only and should not be used to generate results. In order to be valid PMML, all required elements and attributes must be present, even for non-scoring models. For more details, see General Structure.

The element TimeSeries contains a time series consisting of several TimeValue objects. The time series can be an original time series as read from the input data; in this case the attribute interpolationMethod is 'none'. Or it can be a pre-processed and interpolated time series; pre-processing and interpolation may be necessary to produce a logical time series, for most time series algorithms require a sequence of logically equidistant time steps. If a logical time series is present, it was used as input into the algorithm. Finally, the time series (usage = 'prediction') may hold values predicted by the best-fitting model.
The attribute bestFit is required, and indicates which of the time series algorithms provided by the model results is the best-fitting model. This algorithm should be used when scoring the model.
StartTime and endTime refer to points in an input time series between which the points were used for fitting. They can be integers indicating the index into a logical time series or real numbers indicating original points in time.
The attribute interpolationMethod names the interpolation method used to compute values between existing (or predicted) data points. It is one of {'none', 'linear', 'exponentialSpline', 'cubicSpline'}.

TimeValue contains one single point of a time series. The point can either be a known point from the past; in this case, only the attribute value is required. In addition, time or index must be used. In case of a logical TimeSeries, index values must be present. Or the time point is a predicted future value; in this case, the attribute standardError can contain the incertitude (predicted standard error) of the prediction standard based on the empirically determined error.
Note: TimeAnchor and TimeCycle define the correlation to calendar times. Optionally, a contained element Timestamp may hold a string describing the time for presentation purposes, see Header.

TimeAnchor optionally defines the relationship between time points in a time series and a calendar. It is not used for computing predictions, but it may be used by applications or visualization tools that want to come up with predictions based on points of time in a calendar as opposed to just a look-ahead index. Time is anchored at an offset with respect to a specified calendar point given by type. And the flow of time is defined in smallest steps of size stepsize. Both offset and stepsize are (long) integer values in the units specified in type. An optional displayName, e.g. "day" can be provided as a name for the time step.

TimeCycle allows to express the situation where time steps are not contiguous on a calendar. As an example, consider hourly revenue data of a store that opens Mo-Sat from 7am to 9pm. One has to represent hours as being the step size of the data, but one also wants to be able to specify that Sundays and night-shifts should be disregarded, i.e. for the time series prediction, the value for Monday 8am (aggregated revenue between 7am and 8am) immediately follows that of Saturday 9pm.
Each TimeCycle divides the sequence of time steps defined by the previous TimeCycle (or the TimeAnchor) into cycles of equal length, each cycle consisting of length steps. Index values for these steps run from 0 to length - 1, and are used in the specification of valid steps. Type defines whether this definition is by interval or enumeration and whether by inclusion or exclusion, and the contained Array element provides the interval boundaries or enumerates the values. The following is the specification of the shop hours in the example:

<TimeAnchor type="dateTimeSecondsSince[1960]" offset="1530543600" stepsize="3600" displayName="hour">
  <TimeCycle length="24" type="includeFromTo" displayName="day">
    <Array type="int" n="2">7 20</Array>
  </TimeCycle>
  <TimeCycle length="7" type="excludeSet" displayName="week">
    <Array type="int" n="1">6</Array>
  </TimeCycle>
</TimeAnchor>

Calendar entries can now be described as a sequence of values. The 15th hour of the 6th day in the 30th week since the time anchor (1530543600 seconds after the beginning of 1960) would become <29, 5, 14>.

In addition to the regular behavior, there may be exceptions to the TimeStep specification. The store may, for example, be closed on July 4th, but exceptionally open late because of an event on some other day. This is captured by up to two TimeExceptions, which contain lists of unsystematic exclusions or inclusions as arrays of index values. All index values of a certain TimeCycle can be specified by using the length value instead of a valid index; -1 is used for the regular indexes..

The following TimeExceptions specify additional shop closure and opening hours.

<TimeExceptions type="exclude" count="2"%gt;
  <!-- closed in the 5th week on the 6th day at the 8th hour --%gt;
  <Array type="int"%gt;4 5 7</Array%gt;
  <!-- closed in the 33rd week, throughout the 1st day --%gt;
  <Array type="int"%gt;32 0 24</Array%gt;
</TimeExceptions%gt;
<TimeExceptions type="include" count="2"%gt;
  <!-- open in the 1st week on the 7th day at regular hours --%gt;
  <Array type="int"%gt;0 6 -1</Array%gt;
  <!-- open in the 34th week on the 6th day at the 20th hour --%gt;
  <Array type="int"%gt;33 5 19</Array%gt;
</TimeExceptions%gt;

ExponentialSmoothing contains an exponential smoothing model for the time series. It is one out of the 15 possible model type combinations (no trend N, additive trend A, damped additive trend DA, multiplicative trend M, damped multiplicative trend DM) * (no seasonality N, additive seasonality A, multiplicative seasonality M). If the model contains a seasonality, the seasonality info is captured in the Seasonality sub-element. Each TimeValue sub-element contains one predicted time point. The predicted time points are calculated from Gardner, Jr., E.S., "Exponential smoothing: The state of the art - Part II", 3 Jun. 2005 for the given Trend combined with the Seasonality type. The number of predicted time points contained in the model may be determined by the modeling kernel, for example by using the incertitude ranges of each prediction.

This model also supports the multiple smoothing techniques described in the Multiple Smoothing for Higher-order Polynomials found in Brown, R.G., Smoothing, Forecasting and Prediction of Discrete Time Series, Mineola, New York: Dover Publications, Inc., 2004.

<xs:element name="ExponentialSmoothing">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Level" minOccurs="1" maxOccurs="1"/>
      <xs:element ref="Trend_ExpoSmooth" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="Seasonality_ExpoSmooth" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="TimeValue" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="RMSE" type="REAL-NUMBER"/>
    <xs:attribute name="transformation" default="none">
      <xs:simpleType>
        <xs:restriction base="xs:NMTOKEN">
          <xs:enumeration value="none"/>
          <xs:enumeration value="logarithmic"/>
          <xs:enumeration value="squareroot"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
</xs:element>

RMSE is the root mean squared error of the predictions.

Transformation specifies what transformation has been applied to the time series prior to executing the algorithm. Possible values are "none," "logarithmic" and "squareroot." This attribute is informational only, and does not affect scoring.

Level specifies smoothedValue the smoothed value of the time series at the last known point of the history. The optional attribute alpha is the optimal smoothing parameter for the level. It can be used to continue the fitting process if more data become known, but it is not needed for scoring. However, it may be used to compute theoretical confidence intervals.

<xs:element name="Level">
  <xs:complexType>
    <xs:attribute name="alpha" type="REAL-NUMBER" use="optional"/>
    <xs:attribute name="smoothedValue" type="REAL-NUMBER"/>
  </xs:complexType>
</xs:element>

Trend_ExpoSmooth specifies the smoothed value or coefficients of the trend at the last known point of the history. For the Gardner models, the smoothed value can be found in the smoothedValue attribute; for Brown's polynomial models, the smoothed coefficients can be found in the array sub-element. The smoothed coefficients are required if the specified trend is "polynomial_exponential;" otherwise, the smoothed value is required. The optional attribute gamma is the optimal smoothing parameter for the trend. It can be used to continue the fitting process if more data become known, but it is not needed for scoring. The damping parameter phi is needed when scoring the damped versions of the Gardner models.

<xs:element name="Trend_ExpoSmooth">
  <xs:complexType>
    <xs:sequence>
      <xs:group ref="REAL-ARRAY" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="trend" default="additive">
      <xs:simpleType>
        <xs:restriction base="xs:NMTOKEN">
          <xs:enumeration value="additive"/>
          <xs:enumeration value="damped_additive"/>
          <xs:enumeration value="multiplicative"/>
          <xs:enumeration value="damped_multiplicative"/>
          <xs:enumeration value="polynomial_exponential"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute> 
    <xs:attribute name="gamma" type="REAL-NUMBER" use="optional"/>
    <xs:attribute name="phi" type="REAL-NUMBER" use="optional" default="1"/>
    <xs:attribute name="smoothedValue" type="REAL-NUMBER" use="optional"/>
  </xs:complexType>
</xs:element>

Seasonality_ExpoSmooth describes a periodic oscillation cycle with a length of period time units, where period must be a positive integer. The phase indicates the season index of the last known data point; it defaults to period. The oscillation can be additive, that means of the form 'trend + oscillation' or multiplicative, that means of the form 'trend * oscillation'. Unit is a string used for naming the cycles, such as "week" or "year." It is optional and serves only for explanatory purposes. The sub-element RealArray (of size period) contains floating point numbers which describe the local values of the oscillation at each of the season indices. In the additive case, the sum of all these numbers may be normalized to 0. In the multiplicative case, the product of all these numbers may be normalized to 1.

<xs:element name="Seasonality_ExpoSmooth">
  <xs:complexType>
    <xs:sequence>
      <xs:group ref="REAL-ARRAY"/>
    </xs:sequence>
    <xs:attribute name="type" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:NMTOKEN">
          <xs:enumeration value="additive"/>
          <xs:enumeration value="multiplicative"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="period" type="INT-NUMBER" use="required"/>
    <xs:attribute name="unit" type="xs:string" use="optional"/>
    <xs:attribute name="phase" type="INT-NUMBER" use="optional"/>
    <xs:attribute name="delta" type="REAL-NUMBER" use="optional"/>
  </xs:complexType>
</xs:element>

Scoring Procedure

Predictions of future events in a time series are based on a set of well-defined formulae. The formula used to score a particular model is based on the specified trend and seasonality.

The formulae use the following notation:

Symbol Definition PMML equivalent
m Number of periods in the forecast lead-time Input to the model
Xt(m) Forecast for m periods ahead from origin t Output of the model
p Number of periods in the seasonal cycle period attribute within the Seasonal_ExpoSmooth element
α Smoothing parameter for the level of the series alpha attribute within the Level element
φ Autoregressive or damping parameter phi attribute within the Trend_ExpoSmooth element
St Smoothed level of the series, computed after Xt is observed. Also the expected value of the data at the end of period t in some models smoothedValue attribute within the Level element
Tt Smoothed additive trend at the end of period t smoothedValue attribute within the Trend_ExpoSmooth element
Rt Smoothed multiplicative trend at the end of period t smoothedValue attribute within the Trend_ExpoSmooth element
It Smoothed seasonal index at the end of period t. The reference It-p+m found in the formulae below identifies a specific seasonal index, found by cycling through the list of seasonal indexes Array element within the Seasonality_ExpoSmooth element
a0,a1...an Smoothed coefficients used by Brown's multiple smoothing formulae Array element within the Trend_ExpoSmooth element

The complete set of formulae are listed below. The first 15 formulae are identified by the combination of trend and seasonality specified by the model (i.e. <trend>-<seasonality>).

The remaining formula is used for Brown's polynomial models. In this case, the number of values found in the Array element within the Trend_ExpoSmooth element will dictate the order of the polynomial model. A single coefficient indicates a constant model, for which predictions are calculated by applying the formula Xt(m) = a0. For a linear model (two coefficients), the formula Xt(m) = a0 + a1m is used, while a quadratic model (three coefficients) would use the formula Xt(m) = a0 + a1m + (1/2)a2m2 .

N-N: Xt(m) = St

N-A: Xt(m) = St + It-p+m

N-M: Xt(m) = StIt-p+m

A-N: Xt(m) = St + mTt

A-A: Xt(m) = St + mTt + It-p+m

A-M: Xt(m) = (St + mTt)It-p+m

DA-N: Xt(m) = St + (Sum[i in 1..m]φiTt)

DA-A: Xt(m) = St + (Sum[i in 1..m]φiTt) + It-p+m

DA-M: Xt(m) = (St + (Sum[i in 1..m]φiTt))It-p+m

M-N: Xt(m) = StRtm

M-A: Xt(m) = StRtm + It-p+m

M-M: Xt(m) = (StRtm)It-p+m

DM-N: Xt(m) = StRt(Sum[i in 1..m]φi)

DM-A: Xt(m) = StRt(Sum[i in 1..m]φi) + It-p+m

DM-M: Xt(m) = (StRt(Sum[i in 1..m]φi))It-p+m

Brown: Xt(m) = a0 + a1m + (1/2)a2m2 + ... + (1/n!)anmn

The following elements are not used in this version of PMML and only serve as placeholders for future versions.
SpectralAnalysis describes the Fourier spectrum of a time series.
ARIMA may contain one or more ARIMA(p,d,q,P,D,Q) models of the time series.
SeasonalTrendDecomposition contains one or more fit functions which represent the trend component of the time series and optionally contain information on seasonal oscillations which are modeled on top of the trend component.

<xs:element name="SpectralAnalysis">
</xs:element>

<xs:element name="ARIMA">
</xs:element>

<xs:element name="SeasonalTrendDecomposition">
</xs:element>

Example for a time series model:

<PMML xmlns="https://www.dmg.org/PMML-4_3" version="4.3">
  <Header copyright="DMG.org">
    <Application name="test application"/>
    <Timestamp>2008-06-23 10:30:00</Timestamp>
  </Header>
  <DataDictionary numberOfFields="2">
    <DataField dataType="integer" optype="continuous" name="TS" displayName="TS"/>
    <DataField dataType="double" optype="continuous" name="VALUE" displayName="TS-VALUE"/>
  </DataDictionary>
  <TimeSeriesModel modelName="AA2Model" functionName="timeSeries" algorithmName="exponential smoothing" bestFit="ExponentialSmoothing">
    <MiningSchema>
      <MiningField name="TS" usageType="order"/>
      <MiningField name="VALUE" usageType="target"/>
    </MiningSchema>
    <TimeSeries usage="logical" startTime="1" endTime="24" interpolationMethod="none">
      <TimeValue index="1" value="112"/>
      <TimeValue index="2" value="118"/>
      <TimeValue index="3" value="132"/>
      <TimeValue index="4" value="129"/>
      <TimeValue index="5" value="121"/>
      <TimeValue index="6" value="135"/>
      <TimeValue index="7" value="148"/>
      <TimeValue index="8" value="148"/>
      <TimeValue index="9" value="136"/>
      <TimeValue index="10" value="119"/>
      <TimeValue index="11" value="104"/>
      <TimeValue index="12" value="118"/>
      <TimeValue index="13" value="115"/>
      <TimeValue index="14" value="126"/>
      <TimeValue index="15" value="141"/>
      <TimeValue index="16" value="135"/>
      <TimeValue index="17" value="125"/>
      <TimeValue index="18" value="149"/>
      <TimeValue index="19" value="170"/>
      <TimeValue index="20" value="170"/>
      <TimeValue index="21" value="158"/>
      <TimeValue index="22" value="133"/>
      <TimeValue index="23" value="114"/>
      <TimeValue index="24" value="140"/>
    </TimeSeries>
    <TimeSeries usage="prediction" interpolationMethod="none">
      <TimeValue index="25" value="145" standardError="7.3"/>
      <TimeValue index="26" value="150" standardError="8.3"/>
      <TimeValue index="27" value="178" standardError="9.3"/>
      <TimeValue index="28" value="163" standardError="10.3"/>
      <TimeValue index="29" value="172" standardError="11.3"/>
      <TimeValue index="30" value="178" standardError="12.3"/>
      <TimeValue index="31" value="199" standardError="13.3"/>
      <TimeValue index="32" value="199" standardError="14.3"/>
      <TimeValue index="33" value="184" standardError="15.3"/>
      <TimeValue index="34" value="162" standardError="16.3"/>
      <TimeValue index="35" value="146" standardError="17.3"/>
      <TimeValue index="36" value="166" standardError="18.3"/>
    </TimeSeries>
    <ExponentialSmoothing RMSE="7.3">
      <Level alpha="0.233984" smoothedValue="139.8"/>
      <Trend_ExpoSmooth smoothedValue="4.139" gamma="3.910E-4" phi="1.006" trend="damped_additive"/>
      <Seasonality_ExpoSmooth type="multiplicative" period="12" unit="month" delta="0.8254" phase="12">
        <Array n="12" type="real">
          .900 .840 .924 .976 .994 1.120 0.981 1.025 1.038 1.038 0.908 1.259
        </Array>
      </Seasonality_ExpoSmooth>
    </ExponentialSmoothing>
  </TimeSeriesModel>
</PMML>

This is an example of an exponential smoothing time series model using Brown's multiple smoothing technique:

<PMML xmlns="https://www.dmg.org/PMML-4_3" version="4.3">
  <Header copyright="DMG.org">
    <Application name="test application"/>
  </Header>
  <DataDictionary numberOfFields="2">
    <DataField dataType="double" name="Month_Index" optype="continuous">
      <Interval closure="closedClosed" leftMargin="1" rightMargin="50"/>
    </DataField>
    <DataField dataType="double" name="QuadraticMonth" optype="continuous"/>
  </DataDictionary>
  <TimeSeriesModel bestFit="ExponentialSmoothing" functionName="timeSeries" modelName="QuadraticMonth Predictor">
    <MiningSchema>
      <MiningField invalidValueTreatment="asIs" name="Month_Index" outliers="asIs" usageType="order"/>
      <MiningField name="QuadraticMonth" outliers="asIs" usageType="target"/>
    </MiningSchema>
    <Output>
      <OutputField dataType="double" feature="predictedValue" name="QuadraticMonth Predictor - Predicted Value" optype="continuous"/>
    </Output>
    <TimeSeries>
      <TimeValue index="50" value="2550"/>
    </TimeSeries>
    <ExponentialSmoothing RMSE="1.469296539064514">
      <Level alpha="0.29"/>
      <Trend_ExpoSmooth trend="polynomial_exponential">
        <Array type="real" n="3">2549.999972 100.9999732 1.999994714</Array>
      </Trend_ExpoSmooth>
      <TimeValue index="1" value="1.499999999999986"/>
      <TimeValue index="2" value="4.434999999999974"/>
      <TimeValue index="3" value="9.422699999999999"/>
      <TimeValue index="4" value="16.69814500000001"/>
      <TimeValue index="5" value="26.30456892500002"/>
      <TimeValue index="6" value="38.19968310645001"/>
      <TimeValue index="7" value="52.31215520655601"/>
      <TimeValue index="8" value="68.56947439659567"/>
      <TimeValue index="9" value="86.90993292618671"/>
      <TimeValue index="10" value="107.2862207849398"/>
      <TimeValue index="11" value="129.6649358584095"/>
      <TimeValue index="12" value="154.0243926888923"/>
      <TimeValue index="13" value="180.3519824960263"/>
      <TimeValue index="14" value="208.6416885111437"/>
      <TimeValue index="15" value="238.8920018116692"/>
      <TimeValue index="16" value="271.1042947305884"/>
      <TimeValue index="17" value="305.281618813078"/>
      <TimeValue index="18" value="341.4278584112037"/>
      <TimeValue index="19" value="379.5471635161653"/>
      <TimeValue index="20" value="419.6435914851766"/>
      <TimeValue index="21" value="461.7208987097413"/>
      <TimeValue index="22" value="505.7824356899514"/>
      <TimeValue index="23" value="551.8311103729045"/>
      <TimeValue index="24" value="599.8693941784766"/>
      <TimeValue index="25" value="649.8993527234378"/>
      <TimeValue index="26" value="701.9226890294883"/>
      <TimeValue index="27" value="755.9407912489685"/>
      <TimeValue index="28" value="811.9547799736052"/>
      <TimeValue index="29" value="869.965552291198"/>
      <TimeValue index="30" value="929.9738211628786"/>
      <TimeValue index="31" value="991.980149602085"/>
      <TimeValue index="32" value="1055.984979693915"/>
      <TimeValue index="33" value="1121.988656811033"/>
      <TimeValue index="34" value="1189.991449540624"/>
      <TimeValue index="35" value="1259.993565893434"/>
      <TimeValue index="36" value="1331.99516636062"/>
      <TimeValue index="37" value="1405.996374344018"/>
      <TimeValue index="38" value="1481.997284428074"/>
      <TimeValue index="39" value="1559.997968898639"/>
      <TimeValue index="40" value="1639.998482851363"/>
      <TimeValue index="41" value="1721.998868174932"/>
      <TimeValue index="42" value="1805.999156642965"/>
      <TimeValue index="43" value="1891.999372304384"/>
      <TimeValue index="44" value="1979.999533324537"/>
      <TimeValue index="45" value="2069.999653398587"/>
      <TimeValue index="46" value="2161.999742833126"/>
      <TimeValue index="47" value="2255.999809371593"/>
      <TimeValue index="48" value="2351.9998588225"/>
      <TimeValue index="49" value="2449.999895536411"/>
      <TimeValue index="50" value="2549.999922767288"/>
    </ExponentialSmoothing>
  </TimeSeriesModel>
</PMML>

This model can be scored using Brown's formula for multiple smoothing. For instance, to predict the next value in the series (i.e. index=51, which corresponds to m=1), we use the following calculation:

Xt(m) = a0 + a1m + (1/2)a2m2
= 2549.999972 + (100.9999732 * 1) + (0.5 * 1.999994714 * 12)
= 2652
e-mail info at dmg.org