Loading...

verticapy.machine_learning.vertica.tsa.MA

class verticapy.machine_learning.vertica.tsa.MA(name: str = None, overwrite_model: bool = False, q: int = 1, penalty: Literal[None, 'none', 'l2'] = 'none', C: Annotated[int | float | Decimal, 'Python Numbers'] = 1.0, missing: Literal['drop', 'error', 'zero', 'linear_interpolation'] = 'linear_interpolation')

Creates a inDB Moving Average model.

Added in version 11.0.0.

Note

The MA model may be faster and more accurate than ARIMA(0, 0, q) or ARMA(0, q) because the underlying algorithm of MA is quite different.

Parameters

name: str, optional

Name of the model. The model is stored in the database.

overwrite_model: bool, optional

If set to True, training a model with the same name as an existing model overwrites the existing model.

q: int, optional

Integer in the range [1, 67), the number of lags to consider in the computation.

penalty: str, optional

Method of regularization.

  • none:

    No regularization.

  • l2:

    L2 regularization.

C: PythonNumber, optional

The regularization parameter value. The value must be zero or non-negative.

missing: str, optional

Method for handling missing values, one of the following strings:

  • ‘drop’:

    Missing values are ignored.

  • ‘error’:

    Missing values raise an error.

  • ‘zero’:

    Missing values are set to zero.

  • ‘linear_interpolation’:

    Missing values are replaced by a linearly interpolated value based on the nearest valid entries before and after the missing value. In cases where the first or last values in a dataset are missing, the function errors.

Attributes

Many attributes are created during the fitting phase.

theta_: numpy.array

The theta coefficient of the Moving Average process. It signifies the impact and contribution of the lagged error terms in determining the current value within the time series model.

mu_: float

Represents the mean or average of the series. It is a constant term that reflects the expected value of the time series in the absence of any temporal dependencies or influences from past error terms.

mean_: float

The mean of the time series values.

mse_: float

The mean squared error (MSE) of the model, based on one-step forward forecasting, may not always be relevant. Utilizing a full forecasting approach is recommended to compute a more meaningful and comprehensive metric.

n_: int

The number of rows used to fit the model.

Note

All attributes can be accessed using the get_attributes() method.

Note

Several other attributes can be accessed by using the get_vertica_attributes() method.

Examples

The following examples provide a basic understanding of usage. For more detailed examples, please refer to the Machine Learning or the Examples section on the website.

Initialization

We import verticapy:

import verticapy as vp

Hint

By assigning an alias to verticapy, we mitigate the risk of code collisions with other libraries. This precaution is necessary because verticapy uses commonly known function names like “average” and “median”, which can potentially lead to naming conflicts. The use of an alias ensures that the functions from verticapy are used as intended without interfering with functions from other libraries.

For this example, we will generate a dummy time-series dataset that has some noise variation centered around a mean value.

# Initialization
N = 30 # Number of rows
temp = [23] * N
noisy_temp = [x + random.uniform(-5, 5) for x in temp]

# Building the vDataFrame
data = vp.vDataFrame(
    {
        "day": [i for i in range(1, N + 1)],
        "temp": noisy_temp,
    }
)
123
day
Integer
123
temp
Numeric(19)
1123.88221621269846
2223.442836386574804
3322.75537104739503
4420.709366402080988
5519.762545529408765
6626.36427149423009
7718.20694475248903
8827.207005567215553
9926.349387301185857
101019.4577993833971
111126.41948064150177
121218.909672485390857
131324.406375208380457
141425.244914292793624
151520.7236659476918
161626.592054514596036
171722.789075431202978
181821.147552722736254
191925.89333208252367
202027.169094658004298
212127.482374731881315
222224.297341430248203
232326.82096843872428
242419.048602116883163
252523.92785146636928
262620.965693684436214
272720.36123527403478
282824.477187986885735
292923.344710250883757
303021.369342467362287
Rows: 1-30 | Columns: 2

Note

VerticaPy offers a wide range of sample datasets that are ideal for training and testing purposes. You can explore the full list of available datasets in the Datasets, which provides detailed information on each dataset and how to use them effectively. These datasets are invaluable resources for honing your data analysis and machine learning skills within the VerticaPy environment.

We can plot the data to visually inspect it for the presence of any trends:

data["temp"].plot(ts = "day")

It is obvious there is no trend in our example, but we can confirm it by the mkt() (Mann Kendall test) test:

from verticapy.machine_learning.model_selection.statistical_tests import mkt

mkt(data, column = "temp", ts = "day")
value
Mann Kendall Test Statistic0.21409237204201878
S13.0
STDS56.0505724026675
p_value0.830475024124481
Monotonic Trend
❌
Trendno trend
Rows: 1-6 | Columns: 2

The above report confirms that there is no trend in our data and hence it is stationary. Note the high p-value which is also indicative of the absemce of trend. Once we have established that the data is statioanry, we can then apply MovingAverage model on it.

Model Initialization

First we import the MA model:

from verticapy.machine_learning.vertica.tsa import MA

Then we can create the model:

model = MA(q = 2)

Hint

In verticapy 1.0.x and higher, you do not need to specify the model name, as the name is automatically assigned. If you need to re-use the model, you can fetch the model name from the model’s attributes.

Important

The model name is crucial for the model management system and versioning. It’s highly recommended to provide a name if you plan to reuse the model later.

Model Fitting

We can now fit the model:

model.fit(data, "day", "temp")


============
coefficients
============
parameter| value  
---------+--------
  alpha  | 0.10401
phi_(t-1)|-0.14893
phi_(t-2)|-0.13359


====
mean
====
predictor| value  
---------+--------
  temp   |23.31761


==================
mean_squared_error
==================
predictor|  value  
---------+---------
  temp   |896.09681


=================
predictor_columns
=================
"temp"

================
timestamp_column
================
day

==============
missing_method
==============
linear_interpolation

===========
call_string
===========
moving_average('"public"."_verticapy_tmp_ma_v_mldb_1d8e7562979e11efa8720242ac120002_"', '"public"."_verticapy_tmp_view_v_mldb_1db72e6c979e11efa8720242ac120002_"', '"temp"', 'day'
USING PARAMETERS q=2, missing=linear_interpolation, regularization='none', lambda=1, compute_mse=true);

===============
Additional Info
===============
       Name       | Value  
------------------+--------
    lag_order     |   2    
  num_predictors  |   1    
      lambda      | 1.00000
rejected_row_count|   0    
accepted_row_count|   30   

Important

To train a model, you can directly use the vDataFrame or the name of the relation stored in the database. The test set is optional and is only used to compute the test metrics. In verticapy, we don’t work using X matrices and y vectors. Instead, we work directly with lists of predictors and the response name.

Model Register

In order to register the model for tracking and versioning:

model.register("model_v1")

Please refer to /notebooks/ml/model_tracking_versioning/index.ipynb for more details on model tracking and versioning.


One important thing in time-series forecasting is that it has two types of forecasting:

  • One-step ahead forecasting

  • Full forecasting

Important

The default method is one-step ahead forecasting. To use full forecasting, use ``method = “forecast” ``.

One-step ahead

In this type of forecasting, the algorithm utilizes the true value of the previous timestamp (t-1) to predict the immediate next timestamp (t). Subsequently, to forecast additional steps into the future (t+1), it relies on the actual value of the immediately preceding timestamp (t).

A notable drawback of this forecasting method is its tendency to exhibit exaggerated accuracy, particularly when predicting more than one step into the future.

Metrics

We can get the entire report using:

model.report(start = 3)
value
explained_variance-0.0732542924336168
max_error5.19350701285856
median_absolute_error2.86551466452421
mean_absolute_error2.7834259595659
mean_squared_error9.57513273721072
root_mean_squared_error3.09437113759981
r2-0.0749358845074073
r2_adj-0.117933319887704
aic65.83090707568
bic67.5892474743553
Rows: 1-10 | Columns: 2

Important

The value for start has to be greater than the q value selected for the MA model.

You can also choose the number of predictions and where to start the forecast. For example, the following code will allow you to generate a report with 10 predictions, starting the forecasting process at index 25.

model.report(start = 25, npredictions = 10)
value
explained_variance-0.232032038410577
max_error2.79162523159909
median_absolute_error1.97651777021694
mean_absolute_error1.78695132390839
mean_squared_error3.97734730144587
root_mean_squared_error1.9943287846907
r2-0.651163548877241
r2_adj-1.20155139850299
aic20.9030754495365
bic10.1219512744047
Rows: 1-10 | Columns: 2

Important

Most metrics are computed using a single SQL query, but some of them might require multiple SQL queries. Selecting only the necessary metrics in the report can help optimize performance. E.g. model.report(metrics = ["mse", "r2"]).

You can utilize the score() function to calculate various regression metrics, with the explained variance being the default.

model.score(start = 25, npredictions = 10)
Out[5]: -0.651163548877241

Important

If you do not specify a starting point and the number of predictions, the forecast will begin at one-fourth of the dataset, which can result in an inaccurate score, especially for large datasets. It’s important to choose these parameters carefully.

Prediction

Prediction is straight-forward:

model.predict()
123
prediction
Float(22)
123.1350761496582
223.1341659920082
323.3699131776057
423.4049023121203
523.441606626231
623.4517473051139
723.458160890413
823.4604707739402
923.4616715786085
1023.4621589942141
Rows: 1-10 | Columns: 2

Hint

You can control the number of prediction steps by changing the npredictions parameter: model.predict(npredictions = 30).

Note

Predictions can be made automatically by using the training set, in which case you don’t need to specify the predictors. Alternatively, you can pass only the vDataFrame to the predict() function, but in this case, it’s essential that the column names of the vDataFrame match the predictors and response name in the model.

If you would like to have the ‘time-stamps’ (ts) in the output then you can switch the output_estimated_ts the parameter.

model.predict(output_estimated_ts = True)
123
day
Float(22)
123
prediction
Float(22)
131.023.1350761496582
232.023.1341659920082
333.023.3699131776057
434.023.4049023121203
535.023.441606626231
636.023.4517473051139
737.023.458160890413
838.023.4604707739402
939.023.4616715786085
1040.023.4621589942141
Rows: 1-10 | Columns: 2

Important

The output_estimated_ts parameter provides an estimation of ‘ts’ assuming that ‘ts’ is regularly spaced.

If you don’t provide any input, the function will begin forecasting after the last known value. If you want to forecast starting from a specific value within the input dataset or another dataset, you can use the following syntax.

model.predict(
    data,
    "day",
    "temp",
    start = 25,
    npredictions = 10,
    output_estimated_ts = True,
)
123
day
Float(22)
123
prediction
Float(22)
126.022.9422114546532
227.023.1528605056339
328.022.6671242901274
429.023.1993796805335
530.023.5805618179796
631.023.1350761496582
732.023.1341659920082
833.023.3699131776057
934.023.4049023121203
1035.023.441606626231
Rows: 1-10 | Columns: 2

Plots

We can conveniently plot the predictions on a line plot to observe the efficacy of our model:

model.plot(data, "day", "temp", npredictions = 15, start=25)

Note

You can control the number of prediction steps by changing the npredictions parameter: model.plot(npredictions = 30).

Please refer to Machine Learning - Time Series Plots for more examples.

Model Register

In order to register the model for tracking and versioning:

model.register("model_v1")

Please refer to /notebooks/ml/model_tracking_versioning/index.ipynb for more details on model tracking and versioning.

Full forecasting

In this forecasting approach, the algorithm relies solely on a chosen true value for initiation. Subsequently, all predictions are established based on a series of previously predicted values.

This methodology aligns the accuracy of predictions more closely with reality. In practical forecasting scenarios, the goal is to predict all future steps, and this technique ensures a progressive sequence of predictions.

Metrics

We can get the report using:

model.report(start = 25, method = "forecast")

By selecting start = 25, we will measure the accuracy from 40th time-stamp and continue the assessment until the last available time-stamp.

value
explained_variance0.0569168245777847
max_error3.08599551248605
median_absolute_error1.97651777021694
mean_absolute_error1.66715805661204
mean_squared_error3.79099742881507
root_mean_squared_error1.94704838892491
r2-0.573801907133249
r2_adj-1.09840254284433
aic20.6631457915001
bic9.88202161636826
Rows: 1-10 | Columns: 2

Notice that the accuracy using method = forecast is poorer than the one-step ahead forecasting.

You can utilize the score() function to calculate various regression metrics, with the explained variance being the default.

model.score(start = 25, npredictions = 30, method = "forecast")
Out[6]: -0.573801907133249

Prediction

Prediction is straight-forward:

model.predict(start = 25, npredictions = 15, method = "forecast")
123
prediction
Float(22)
122.9422114546532
223.4472307865208
323.3907744864646
423.449831303896
523.4510849142861
623.4591609651628
723.4605312306806
823.4618141817261
923.4621883089971
1023.4624154174395
1123.4624992208785
1223.4625420412502
1323.4625596138747
1423.4625679513663
1523.4625715406113
Rows: 1-15 | Columns: 2

If you want to forecast starting from a specific value within the input dataset or another dataset, you can use the following syntax.

model.predict(
    data,
    "day",
    "temp",
    start = 25,
    npredictions = 20,
    output_estimated_ts = True,
    output_standard_errors = True,
    method = "forecast",
)
123
day
Float(22)
123
prediction
Float(22)
126.022.9422114546532
227.023.4472307865208
328.023.3907744864646
429.023.449831303896
530.023.4510849142861
631.023.4591609651628
732.023.4605312306806
833.023.4618141817261
934.023.4621883089971
1035.023.4624154174395
1136.023.4624992208785
1237.023.4625420412502
1338.023.4625596138747
1439.023.4625679513663
1540.023.4625715406113
1641.023.462573188969
1742.023.4625739139491
1843.023.4625742421257
1944.023.4625743878517
2045.023.4625744533961
Rows: 1-20 | Columns: 2

Plots

We can conveniently plot the predictions on a line plot to observe the efficacy of our model:

model.plot(
    data,
    "day",
    "temp",
    npredictions = 15,
    start = 25,
    method = "forecast",
)
__init__(name: str = None, overwrite_model: bool = False, q: int = 1, penalty: Literal[None, 'none', 'l2'] = 'none', C: Annotated[int | float | Decimal, 'Python Numbers'] = 1.0, missing: Literal['drop', 'error', 'zero', 'linear_interpolation'] = 'linear_interpolation') → None

Must be overridden in the child class

Methods

__init__([name, overwrite_model, q, ...])

Must be overridden in the child class

contour([nbins, chart])

Draws the model's contour plot.

deploySQL([ts, y, start, npredictions, ...])

Returns the SQL code needed to deploy the model.

does_model_exists(name[, raise_error, ...])

Checks whether the model is stored in the Vertica database.

drop()

Drops the model from the Vertica database.

export_models(name, path[, kind])

Exports machine learning models.

features_importance([idx, show, chart])

Computes the model's features importance.

fit(input_relation, ts, y[, test_relation, ...])

Trains the model.

get_attributes([attr_name])

Returns the model attributes.

get_match_index(x, col_list[, str_check])

Returns the matching index.

get_params()

Returns the parameters of the model.

get_plotting_lib([class_name, chart, ...])

Returns the first available library (Plotly, Matplotlib, or Highcharts) to draw a specific graphic.

get_vertica_attributes([attr_name])

Returns the model Vertica attributes.

import_models(path[, schema, kind])

Imports machine learning models.

plot([vdf, ts, y, start, npredictions, ...])

Draws the model.

predict([vdf, ts, y, start, npredictions, ...])

Predicts using the input relation.

register(registered_name[, raise_error])

Registers the model and adds it to in-DB Model versioning environment with a status of 'under_review'.

regression_report([metrics, start, ...])

Computes a regression report using multiple metrics to evaluate the model (r2, mse, max error...).

report([metrics, start, npredictions, method])

Computes a regression report using multiple metrics to evaluate the model (r2, mse, max error...).

score([metric, start, npredictions, method])

Computes the model score.

set_params([parameters])

Sets the parameters of the model.

summarize()

Summarizes the model.

to_binary(path)

Exports the model to the Vertica Binary format.

to_pmml(path)

Exports the model to PMML.

to_python([return_proba, ...])

Returns the Python function needed for in-memory scoring without using built-in Vertica functions.

to_sql([X, return_proba, ...])

Returns the SQL code needed to deploy the model without using built-in Vertica functions.

to_tf(path)

Exports the model to the Frozen Graph format (TensorFlow).

Attributes