mlflow.pmdarima

mlflow.pmdarima 模块提供了一个用于记录和加载 pmdarima 模型的 API。该模块以以下格式导出单变量 pmdarima 模型

Pmdarima 格式

使用 pickle 序列化的 pmdarima 模型实例。

mlflow.pyfunc

生成用于通用 pyfunc 部署工具和历史预测的批量审计。

Example
import pandas as pd
import mlflow
import mlflow.pyfunc
import pmdarima
from pmdarima import auto_arima


# Define a custom model class
class PmdarimaWrapper(mlflow.pyfunc.PythonModel):
    def load_context(self, context):
        self.model = context.artifacts["model"]

    def predict(self, context, model_input):
        return self.model.predict(n_periods=model_input.shape[0])


# Specify locations of source data and the model artifact
SOURCE_DATA = "https://raw.githubusercontent.com/facebook/prophet/master/examples/example_retail_sales.csv"
ARTIFACT_PATH = "model"

# Read data and recode columns
sales_data = pd.read_csv(SOURCE_DATA)
sales_data.rename(columns={"y": "sales", "ds": "date"}, inplace=True)

# Split the data into train/test
train_size = int(0.8 * len(sales_data))
train, _ = sales_data[:train_size], sales_data[train_size:]

# Create the model
model = pmdarima.auto_arima(train["sales"], seasonal=True, m=12)

# Log the model
with mlflow.start_run():
    wrapper = PmdarimaWrapper()
    mlflow.pyfunc.log_model(
        name="model",
        python_model=wrapper,
        artifacts={"model": mlflow.pyfunc.model_to_dict(model)},
    )
mlflow.pmdarima.get_default_conda_env()[source]
返回

调用 save_model()log_model() 所生成的 MLflow Models 的默认 Conda 环境。

mlflow.pmdarima.get_default_pip_requirements()[source]
返回

此功能生成的 MLflow Models 的默认 pip requirements 列表。调用 save_model()log_model() 会生成一个 pip 环境,该环境至少包含这些 requirements。

mlflow.pmdarima.load_model(model_uri, dst_path=None)[source]

从本地文件或 run 中加载 pmdarima ARIMA 模型或 Pipeline 对象。

参数
  • model_uri

    MLflow 模型在 URI 格式中的位置。例如:

    • /Users/me/path/to/local/model

    • relative/path/to/local/model

    • s3://my_bucket/path/to/model

    • runs:/<mlflow_run_id>/run-relative/path/to/model

    • mlflow-artifacts:/path/to/model

    有关支持的 URI 方案的更多信息,请参阅 引用 Artifacts

  • dst_path – The local filesystem path to which to download the model artifact. This directory must already exist. If unspecified, a local output path will be created.

返回

pmdarima 模型实例

示例
import pandas as pd
import mlflow
from mlflow.models import infer_signature
import pmdarima
from pmdarima.metrics import smape

# Specify locations of source data and the model artifact
SOURCE_DATA = "https://raw.githubusercontent.com/facebook/prophet/master/examples/example_retail_sales.csv"
ARTIFACT_PATH = "model"

# Read data and recode columns
sales_data = pd.read_csv(SOURCE_DATA)
sales_data.rename(columns={"y": "sales", "ds": "date"}, inplace=True)

# Split the data into train/test
train_size = int(0.8 * len(sales_data))
train = sales_data[:train_size]
test = sales_data[train_size:]

with mlflow.start_run():
    # Create the model
    model = pmdarima.auto_arima(train["sales"], seasonal=True, m=12)

    # Calculate metrics
    prediction = model.predict(n_periods=len(test))
    metrics = {"smape": smape(test["sales"], prediction)}

    # Infer signature
    input_sample = pd.DataFrame(train["sales"])
    output_sample = pd.DataFrame(model.predict(n_periods=5))
    signature = infer_signature(input_sample, output_sample)

    # Log model
    input_example = input_sample.head()
    model_info = mlflow.pmdarima.log_model(
        model, name=ARTIFACT_PATH, signature=signature, input_example=input_example
    )

# Load the model
loaded_model = mlflow.pmdarima.load_model(model_info.model_uri)
# Forecast for the next 60 days
forecast = loaded_model.predict(n_periods=60)
print(f"forecast: {forecast}")
Output
forecast:
234    382452.397246
235    380639.458720
236    359805.611219
...
mlflow.pmdarima.log_model(pmdarima_model, artifact_path: str | None = None, conda_env=None, code_paths=None, registered_model_name=None, signature: mlflow.models.signature.ModelSignature = None, input_example: Union[pandas.core.frame.DataFrame, numpy.ndarray, dict, list, csr_matrix, csc_matrix, str, bytes, tuple] = None, await_registration_for=300, pip_requirements=None, extra_pip_requirements=None, metadata=None, name: str | None = None, params: dict[str, typing.Any] | None = None, tags: dict[str, typing.Any] | None = None, model_type: str | None = None, step: int = 0, model_id: str | None = None, **kwargs)[source]

pmdarima ARIMAPipeline 对象记录为当前 run 的 MLflow artifact。

参数
  • pmdarima_model – 已在时间序列上 fit 的 pmdarima ARIMAPipeline 模型。

  • artifact_path – Deprecated. Use name instead.

  • conda_env

    Conda 环境的字典表示形式或 conda 环境 yaml 文件的路径。如果提供了此参数,则它将描述模型应运行的环境。至少,它应该指定 get_default_conda_env() 中包含的依赖项。如果为 None,则会将包含通过 mlflow.models.infer_pip_requirements() 推断出的 pip requirements 的 conda 环境添加到模型中。如果 requirements 推断失败,则会回退使用 get_default_pip_requirements。来自 conda_env 的 pip requirements 会被写入 pip requirements.txt 文件,而完整的 conda 环境会写入 conda.yaml。以下是 conda 环境的*示例*字典表示形式

    {
        "name": "mlflow-env",
        "channels": ["conda-forge"],
        "dependencies": [
            "python=3.8.15",
            {
                "pip": [
                    "pmdarima==x.y.z"
                ],
            },
        ],
    }
    

  • code_paths

    A list of local filesystem paths to Python file dependencies (or directories containing file dependencies). These files are prepended to the system path when the model is loaded. Files declared as dependencies for a given model should have relative imports declared from a common root path if multiple files are defined with import dependencies between them to avoid import errors when loading the model.

    For a detailed explanation of code_paths functionality, recommended usage patterns and limitations, see the code_paths usage guide.

  • registered_model_name – 如果提供,则在 registered_model_name 下创建一个模型版本,如果给定名称的注册模型不存在,也会创建该注册模型。

  • signature

    一个 ModelSignature 类的实例,该实例描述了模型的输入和输出。如果未指定但提供了 input_example,则将根据提供的输入示例和模型自动推断出签名。要在使用输入示例时禁用自动签名推断,请将 signature 设置为 False。要手动推断模型签名,请在具有有效模型输入的 数据集上调用 infer_signature(),例如,将目标列省略的训练数据集,以及有效模型输出,例如在训练数据集上进行的模型预测,例如

    from mlflow.models import infer_signature
    
    model = pmdarima.auto_arima(data)
    predictions = model.predict(n_periods=30, return_conf_int=False)
    signature = infer_signature(data, predictions)
    

    警告

    如果在使用 pmdarima 模型的 predict 方法中利用置信区间生成(return_conf_int=True),则由于使用原生 ARIMA.predict() API 时复杂的元组返回类型,签名将不会被推断。infer_schema 在使用模型的 pyfunc flavor 时能够正常工作。

  • input_example – 一个或多个有效的模型输入实例。输入示例用作要馈送给模型的数据的提示。它将被转换为 Pandas DataFrame,然后使用 Pandas 的面向拆分(split-oriented)格式序列化为 json,或者转换为 numpy 数组,其中示例将通过转换为列表来序列化为 json。字节将进行 base64 编码。当 signature 参数为 None 时,输入示例用于推断模型签名。

  • await_registration_for – 等待模型版本完成创建并处于 READY 状态的秒数。默认情况下,函数等待五分钟。指定 0 或 None 可跳过等待。

  • pip_requirements – pip requirements 字符串的可迭代对象(例如 ["pmdarima", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上的 pip requirements 文件的字符串路径(例如 "requirements.txt")。如果提供了此参数,则它将描述模型应运行的环境。如果为 None,则将根据用户当前的软件环境,通过 mlflow.models.infer_pip_requirements() 推断出默认的 requirements 列表。如果 requirements 推断失败,则会回退使用 get_default_pip_requirements。requirements 和 constraints 都将被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分进行存储。requirements 也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

  • extra_pip_requirements

    pip requirements 字符串的可迭代对象(例如 ["pandas", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上的 pip requirements 文件的字符串路径(例如 "requirements.txt")。如果提供了此参数,则它将描述附加到根据用户当前软件环境自动生成的默认 pip requirements 集合的其他 pip requirements。requirements 和 constraints 都将被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分进行存储。requirements 也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

    警告

    以下参数不能同时指定

    • conda_env

    • pip_requirements

    • extra_pip_requirements

    此示例演示了如何使用 pip_requirementsextra_pip_requirements 指定 pip requirements。

  • metadata – 传递给模型并存储在 MLmodel 文件中的自定义元数据字典。

  • name – 模型名称。

  • params – 要与模型一起记录的参数字典。

  • tags – 要与模型一起记录的标签字典。

  • model_type – 模型的类型。

  • step – 记录模型输出和指标的步骤

  • model_id – 模型的 ID。

  • kwargsmlflow.models.model.Model 的其他参数

返回

一个 ModelInfo 实例,其中包含已记录模型的元数据。

示例
import pandas as pd
import mlflow
from mlflow.models import infer_signature
import pmdarima
from pmdarima.metrics import smape

# Specify locations of source data and the model artifact
SOURCE_DATA = "https://raw.githubusercontent.com/facebook/prophet/master/examples/example_retail_sales.csv"
ARTIFACT_PATH = "model"

# Read data and recode columns
sales_data = pd.read_csv(SOURCE_DATA)
sales_data.rename(columns={"y": "sales", "ds": "date"}, inplace=True)

# Split the data into train/test
train_size = int(0.8 * len(sales_data))
train = sales_data[:train_size]
test = sales_data[train_size:]

with mlflow.start_run():
    # Create the model
    model = pmdarima.auto_arima(train["sales"], seasonal=True, m=12)

    # Calculate metrics
    prediction = model.predict(n_periods=len(test))
    metrics = {"smape": smape(test["sales"], prediction)}

    # Infer signature
    input_sample = pd.DataFrame(train["sales"])
    output_sample = pd.DataFrame(model.predict(n_periods=5))
    signature = infer_signature(input_sample, output_sample)

    # Log model
    mlflow.pmdarima.log_model(model, name=ARTIFACT_PATH, signature=signature)
mlflow.pmdarima.save_model(pmdarima_model, path, conda_env=None, code_paths=None, mlflow_model=None, signature: mlflow.models.signature.ModelSignature = None, input_example: Union[pandas.core.frame.DataFrame, numpy.ndarray, dict, list, csr_matrix, csc_matrix, str, bytes, tuple] = None, pip_requirements=None, extra_pip_requirements=None, metadata=None)[source]

将 pmdarima ARIMA 模型或 Pipeline 对象保存到本地文件系统的路径。

参数
  • pmdarima_model – 已在时间序列上 fit 的 pmdarima ARIMAPipeline 模型。

  • path – 将序列化模型(pickle 格式)保存到的本地路径目的地。

  • conda_env

    Conda 环境的字典表示形式或 conda 环境 yaml 文件的路径。如果提供了此参数,则它将描述模型应运行的环境。至少,它应该指定 get_default_conda_env() 中包含的依赖项。如果为 None,则会将包含通过 mlflow.models.infer_pip_requirements() 推断出的 pip requirements 的 conda 环境添加到模型中。如果 requirements 推断失败,则会回退使用 get_default_pip_requirements。来自 conda_env 的 pip requirements 会被写入 pip requirements.txt 文件,而完整的 conda 环境会写入 conda.yaml。以下是 conda 环境的*示例*字典表示形式

    {
        "name": "mlflow-env",
        "channels": ["conda-forge"],
        "dependencies": [
            "python=3.8.15",
            {
                "pip": [
                    "pmdarima==x.y.z"
                ],
            },
        ],
    }
    

  • code_paths

    A list of local filesystem paths to Python file dependencies (or directories containing file dependencies). These files are prepended to the system path when the model is loaded. Files declared as dependencies for a given model should have relative imports declared from a common root path if multiple files are defined with import dependencies between them to avoid import errors when loading the model.

    For a detailed explanation of code_paths functionality, recommended usage patterns and limitations, see the code_paths usage guide.

  • mlflow_model – 要添加此 flavor 的 mlflow.models.Model

  • signature

    一个 ModelSignature 类的实例,该实例描述了模型的输入和输出。如果未指定但提供了 input_example,则将根据提供的输入示例和模型自动推断出签名。要在使用输入示例时禁用自动签名推断,请将 signature 设置为 False。要手动推断模型签名,请在具有有效模型输入的 数据集上调用 infer_signature(),例如,将目标列省略的训练数据集,以及有效模型输出,例如在训练数据集上进行的模型预测,例如

    from mlflow.models import infer_signature
    
    model = pmdarima.auto_arima(data)
    predictions = model.predict(n_periods=30, return_conf_int=False)
    signature = infer_signature(data, predictions)
    

    警告

    如果在使用 pmdarima 模型的 predict 方法中利用置信区间生成(return_conf_int=True),则由于使用原生 ARIMA.predict() API 时复杂的元组返回类型,签名将不会被推断。infer_schema 在使用模型的 pyfunc flavor 时能够正常工作。

  • input_example – 一个或多个有效的模型输入实例。输入示例用作要馈送给模型的数据的提示。它将被转换为 Pandas DataFrame,然后使用 Pandas 的面向拆分(split-oriented)格式序列化为 json,或者转换为 numpy 数组,其中示例将通过转换为列表来序列化为 json。字节将进行 base64 编码。当 signature 参数为 None 时,输入示例用于推断模型签名。

  • pip_requirements – pip requirements 字符串的可迭代对象(例如 ["pmdarima", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上的 pip requirements 文件的字符串路径(例如 "requirements.txt")。如果提供了此参数,则它将描述模型应运行的环境。如果为 None,则将根据用户当前的软件环境,通过 mlflow.models.infer_pip_requirements() 推断出默认的 requirements 列表。如果 requirements 推断失败,则会回退使用 get_default_pip_requirements。requirements 和 constraints 都将被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分进行存储。requirements 也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

  • extra_pip_requirements

    pip requirements 字符串的可迭代对象(例如 ["pandas", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上的 pip requirements 文件的字符串路径(例如 "requirements.txt")。如果提供了此参数,则它将描述附加到根据用户当前软件环境自动生成的默认 pip requirements 集合的其他 pip requirements。requirements 和 constraints 都将被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分进行存储。requirements 也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

    警告

    以下参数不能同时指定

    • conda_env

    • pip_requirements

    • extra_pip_requirements

    此示例演示了如何使用 pip_requirementsextra_pip_requirements 指定 pip requirements。

  • metadata – 传递给模型并存储在 MLmodel 文件中的自定义元数据字典。

Example
import pandas as pd
import mlflow
import pmdarima

# Specify locations of source data and the model artifact
SOURCE_DATA = "https://raw.githubusercontent.com/facebook/prophet/master/examples/example_retail_sales.csv"
ARTIFACT_PATH = "model"

# Read data and recode columns
sales_data = pd.read_csv(SOURCE_DATA)
sales_data.rename(columns={"y": "sales", "ds": "date"}, inplace=True)

# Split the data into train/test
train_size = int(0.8 * len(sales_data))
train = sales_data[:train_size]
test = sales_data[train_size:]

with mlflow.start_run():
    # Create the model
    model = pmdarima.auto_arima(train["sales"], seasonal=True, m=12)

    # Save the model to the specified path
    mlflow.pmdarima.save_model(model, "model")