Verwenden von Zeitserienvorhersagemodellen mit ArcGIS

Das Toolset Zeitserien-KI in der Toolbox "GeoAI" enthält Werkzeuge für die Analyse und Verarbeitung von Zeitseriendaten. Dieses Toolset umfasst Werkzeuge für das Training und die Vorhersage zukünftiger Werte an Positionen in einem Raum-Zeit-Würfel. Es unterstützt das Training und die Anwendung verschiedener Zeitserienvorhersagemodelle, die auf Deep Learning basieren, wie Fully Connected Network (FCN), Long Short-Term Memory (LSTM), InceptionTime, ResNet und ResCNN.

Diese integrierten Modelle sind zwar robust und effektiv, erfordern aber ein umfangreiches Training mit großen, bereichsspezifischen Zeitserien-Datasets, um eine optimale Performance zu erzielen. Möglicherweise benötigen Sie jedoch einen angepassten Workflow, z. B. für die Integration neuerer Modelle, einschließlich Zeitserienmodellen, die als Grundlage dienen und Standardlösungen für Vorhersagen bieten. Diese Basismodelle werden anhand umfangreicher, vielfältiger Zeitseriendaten trainiert und können direkt zur Vorhersage künftiger Ereignisse auf der Grundlage spezifischer Eingabedaten verwendet werden, ohne dass zusätzliches Training erforderlich ist. Die Funktionalität der Verallgemeinerung über verschiedene Zeitserien-Datasets hinweg macht sie äußerst vielseitig.

Python-Entwickler können eine benutzerdefinierte Zeitreihserienfunktion erstellen, um ArcGIS mit diesen externen Modellen von Drittanbietern zu integrieren und sie als Esri Deep-Learning-Pakete (.dlpk-Dateien) für die Verwendung mit dem Werkzeug Vorhersage mit Zeitserienmodell zu packen.

Benutzerdefinierte Python-Zeitserienfunktion

Sie können eine Zeitserienfunktion in Python erstellen, um Zeitserienmodelle von Drittanbietern in eine Zeitserienvorhersage-Pipeline zu integrieren.

Die Methoden der Zeitserienfunktion sind in der folgenden Tabelle aufgelistet und in den folgenden Unterabschnitten ausführlicher beschrieben.

MethodeBeschreibung

__init__

Initialisieren der Instanzvariablen, wie zum Beispiel name, description und weiterer Attribute, die für die Zeitserienfunktion erforderlich sind.

initialize

Laden des Zeitserienmodells und Einrichten der Erstkonfigurationen. Verwenden Sie diese Methode am Anfang der Python-Zeitserienfunktion.

getParameterInfo

Definieren der Parameter, die von der Zeitserienfunktion akzeptiert werden. Dazu gehören die Konfigurationseinstellungen, die zum Laden des Modells oder Verbinden mit dem Modell erforderlich sind, sowie die Parameter, die für die Zeitserienverarbeitung erforderlich sind.

getConfiguration

Beschreiben der Verarbeitung der Eingaben und der Generierung der Ausgaben durch das Werkzeug. Dazu gehören Details für die Vorverarbeitungs- oder Nachbearbeitungsschritte, die für die Funktion erforderlich sind.

predict

Die Funktion, die das Konvertieren von Eingabedaten in die gewünschte Ausgabe übernimmt. Sie verwendet definierte Parameter und eine Verarbeitungslogik, um das Endergebnis zu erzeugen.

Funktionsmethoden

Die Methoden der Zeitserienfunktion werden nachfolgend beschrieben.

__init__

Die Methode __init__ ist der Konstruktor der benutzerdefinierten Zeitserienfunktion und initialisiert Instanzvariablen, wie zum Beispiel Name, Beschreibung und weitere erforderliche Attribute. Diese Methode legt die Eigenschaften fest, mit denen das Verhalten und die Beschreibung der Zeitserienfunktion definiert wird.

Der Konstruktor erstellt eine Instanz einer benutzerdefinierten Zeitserienklasse mit allen Attributen, die für die Verarbeitung und die Analyse erforderlich sind. Beim Erstellen einer Instanz einer Zeitserienklasse stellt diese Methode sicher, dass die Instanz mit den erforderlichen Einstellungen und Standardwerten initialisiert wird. Wenn zum Beispiel die Zeitserienfunktion bestimmte Einstellungen erfordert, wie den Ordnerpfad, der die Modellgewichtung und die Konfigurationsdatei enthält, können diese in dieser Methode angegeben werden.


class MyTimesFM:
    def __init__(self, **kwargs):
        """
        It sets up the initial state of an object by defining its attributes,
        such as name, description, and other properties.

        """
        self.name = "TimeSeriesForecast"
        self.description = '''The `MyTimesFM` class is designed to perform time series forecasting tasks.'''

        # Additional initialization code here

initialize

Die Methode initialize wird am Anfang der benutzerdefinierten Python-Zeitserienfunktion aufgerufen. An diese Methode wird das Argument kwargs['model'] übergeben. Das Argument kwargs['model'] ist der Pfad zur Esri Modelldefinitionsdatei (.emd). Diese Methode sollte zum Laden der Modellgewichtungen beim Einrichten des Zeitserienmodells verwendet werden, damit eine Referenz für nachfolgende Operationen vorhanden ist.


def initialize(self, **kwargs):
    """
    Initialize model parameters, such as loading pretrained model weights.
    """
    json_file = kwargs['model']
    with open(json_file, 'r') as f:
        self.json_info = json.load(f)
    
    # Access the model path in the model definition file
    model_path = json_info['ModelFile']
    # Load your model and keep an instance for the modelt
    self.model = load_your_model(model_path)
    
    # Additional initialization code here

getParameterInfo

Die getParameterInfo-Methode wird von dem Werkzeug Vorhersage mit Zeitserienmodell nach der initialize-Methode aufgerufen und definiert die für das Modell erforderlichen Parameter. Diese Methode gibt eine Liste der von der benutzerdefinierten Zeitserienfunktion erwarteten Eingabeparameter zurück. Jeder Parameter wird unter Verwendung eines Wörterbuchs, in dem Name, Datentyp, Anzeigename und Beschreibung des Parameters enthalten sind, und eines booleschen Parameters, der angibt, ob dieser Parameter erforderlich ist, wie nachfolgend dargestellt beschrieben.


def getParameterInfo(self):
    return [
        {
            "name": "batch_size",
												"dataType": "long",
            "required": False,
            "displayName": "batch_size",
            "description": "The number of sequences processed in one forward pass through the model.",
            "value": "16"
        },
        {
            "name": "sequence_length",
            "dataType": "long",
            "required": True,
            "displayName": "sequence_length",
            "description": "Use the sequence length number of time steps to forecast the next user-defined time steps.",
            "value": "32"
        },
        # Additional code here
    ]

Diese Methode gibt eine Liste mehrerer Wörterbücher zurück, in denen jeweils ein Parameter beschrieben ist. Die Schlüsselattribute des Wörterbuchs sind:

  • name: Ein Zeichenfolgebezeichner für den Parameter
  • dataType: Der Datentyp, den der Parameter akzeptiert, wie zum Beispiel "long", Zeichenfolge, boolescher Wert oder Liste
  • value: Der Standardwert für den Parameter
  • required: Ein boolescher Wert, der angibt, ob der Parameter erforderlich ist
  • displayName: Ein benutzerfreundlicher Name für den Parameter
  • domain: Die zulässigen Werte
  • description: Eine detaillierte Beschreibung des Parameters

Die Liste der Parameter wird dem Benutzer über die Modellargumente des benutzerdefinierten Modells im Werkzeug Vorhersage mit Zeitserienmodell angezeigt. Benutzer können diese Werte interaktiv in der Bedienoberfläche eines Werkzeugs festlegen oder programmgesteuert als Schlüsselwortargumente an die getConfiguration-Methode übergeben.

getConfiguration

Mit der Methode getConfiguration werden die Parameter für die Zeitserienfunktion konfiguriert und verwaltet. Sie akzeptiert Schlüsselwortargumente mit Parametern, die durch Benutzer über das Werkzeug aktualisiert oder programmgesteuert bereitgestellt wurden. Anhand der aktualisierten Parameter steuert diese Methode auch, wie die Funktion die Daten verarbeitet und ausgibt. Diese Methode wird nach der Methode getParameterInfo, aber vor der Methode predict aufgerufen. Der Rückgabewert der Funktion ist ein Wörterbuch, in dem der Wert des batch_size-Parameters enthalten ist. Dieser Wert gibt an, wie viele Sequenzen das Modell gleichzeitig verarbeiten kann. Der Rückgabewert der Methode teilt dem Werkzeug mit, wie die Eingabedaten für die Verarbeitung geteilt werden müssen, damit das Modell die einzelnen Batches nacheinander verarbeiten kann.


def getConfiguration(self, **kwargs):
    """
    This method configures the supported time series function parameters and
    controls further processing based on them.
    """
    # Set the sequence_length and batch_size from the provided arguments
				self.sequence_length = int(kwargs.get("sequence_length"))

				# Set the batch size, limiting it to a maximum of 4
    if kwargs.get("batch_size", 0) > 4:
        kwargs["batch_size"] = 4	
				self.batch_size = kwargs.get("batch_size")

				# Set the number_of_timesteps_to_forecast from the toolset
				self.number_of_timesteps_to_forecast = kwargs.get("number_of_timesteps_to_forecast")	
						

				# Return the updated parameter values
    return kwargs

Im obigen Beispiel wird die benutzerdefinierte Zeitserienfunktion mit den folgenden Schritten konfiguriert:

  • Den Parameter sequence_length anhand der angegebenen Argumente festlegen.
  • Den Parameter batch_size auf ein Maximum von 4 festlegen, wenn ein größerer Wert angegeben wurde.
  • Den Parameter number_of_timesteps_to_forecast aus dem Toolset festlegen.
  • Die aktualisierten Parameterwerte zurückgeben.

predict

Die Methode predict führt eine Inferenz aus, indem sie Vorhersagen mit dem Zeitserienmodell generiert. Die Methode akzeptiert ein 2D NumPy-Array mit den Eingabedaten und gibt die Ergebnisse als 2D NumPy-Array zurück. Ein typischer Workflow sieht wie folgt aus:

  1. Die Eingabedaten zur Anpassung an die Anforderungen des Modells vorverarbeiten.
  2. Das Zeitserienmodell auf die Eingabedaten anwenden, um Vorhersagen zu erstellen.


def predict(self, input_sequences):
    """
    Forecast time series data based on the input data.
    """

    # Preprocessing input code here

  		# Input_sequences is a 2d Numpy Array of shape (batch_size, total number of time steps). 
				# Adjust the input sequence length as per the model requirements. 
	   input_sequences = input_sequences[:, -self.sequence_length:]	
    
    # Make Forecasts
    forecasts = self.model.predict(input_sequences, self.number_of_timesteps_to_forecast)
    
    # Additional code here   

    # Return the forecasted values in the shape of (batch_size, number_of_timesteps_to_forecast)
    return forecasts

Esri EMD-Datei

Fügen Sie nach dem Erstellen einer benutzerdefinierten Python-Zeitserienfunktion eine Referenz zu dieser Funktion in der .emd-Datei ein, indem Sie sie neben dem Parameter InferenceFunction angeben. Damit wird sichergestellt, dass die .emd-Datei ordnungsgemäß mit der Funktion verknüpft wird, damit sie in einer Zeitserien-Verarbeitungspipeline verwendet werden kann.


{
    "InferenceFunction": "MyTimesFM.py",
    "ModelType": "TimeSeriesForecasting"

}

Die .emd-Datei muss die folgenden Schlüssel enthalten:

  • InferenceFunction: Der Name der Datei, in der die benutzerdefinierte Zeitserienfunktion enthalten ist
  • ModelType: Gibt den Modelltyp an, festgelegt auf TimeSeriesForecasting

Benutzerdefinierte DLPK-Datei

Um die Einrichtung eines finalen benutzerdefinierten Zeitserienmodells von einem Drittanbieter abzuschließen, erstellen Sie eine .dlpk-Modelldatei. Die .dlpk-Datei ermöglicht Ihnen die Verwendung dieses Modells mit dem Werkzeug Vorhersage mit Zeitserienmodell im Toolset Zeitserien-KI.

Organisieren Sie die Dateien wie folgt:

  • Erstellen Sie einen Ordner, und fügen Sie die Datei mit der benutzerdefinierten Zeitserienfunktion (zum Beispiel MyTimesFM.py) und die Esri .emd-Datei (zum Beispiel TimesFM.emd) ein. Der Name des Ordners muss mit dem Namen der .emd-Datei übereinstimmen.
    
    TimesFM/
    ├── MyTimesFM.py
    └── TimesFM.emd
    Fügen Sie alle zusätzlichen Dateien und Ordner, die für die Zeitserienfunktion erforderlich sind, ein.
  • Komprimieren Sie den Ordner in ein ZIP-Archiv. Geben Sie der .zip-Datei den Namen der .emd-Datei mit einer .dlpk-Erweiterung. Die .dlpk-Datei ist nun bereit für die Verwendung mit dem Werkzeug Vorhersage mit Zeitserienmodell.