ArcGIS でのサードパーティの時系列予測モデルの使用

GeoAI ツールボックスの時系列 AI ツールセットには、時系列データの分析と処理に使用できるツールが含まれています。 このツールセットには、時空間キューブの位置における将来の値をトレーニングおよび予測するためのツールがあります。 これらのツールでは、FCN (Fully Connected Network)、LSTM (Long Short-Term Memory)、InceptionTime、ResNet、ResCNN などのさまざまなディープ ラーニング ベースを使用した時系列予測モデルのトレーニングと応用がサポートされています。

事前構築されたこれらのモデルは堅牢で効果的ですが、最適なパフォーマンスを得るには、大規模なドメイン固有の時系列データセットの広範なトレーニングが必要です。 しかし、時系列の基礎モデルを含む新しいモデルを統合するための、カスタマイズされたワークフローが必要になる場合もあります。これは、予測を行う既製ソリューションを提供することを目的としています。 このような基礎モデルは、広範で多様な時系列データセットで事前トレーニング済みで、追加のトレーニングを行わずに、特定の入力データに基づいて将来の出来事を予測するために直接適用できます。 異なる時系列データセットを一般化する機能により、高い汎用性が実現します。

Python 開発者は、ArcGIS をこれらの外部のサードパーティ モデルと統合するカスタム時系列関数を作成し、それを Esri ディープ ラーニング パッケージ (.dlpk ファイル) としてパッケージ化して、[時系列モデルを使用した予測 (Forecast Using Time Series Model)] ツールで使用できます。

カスタム Python 時系列関数

Python で時系列関数を作成し、サードパーティの時系列モデルを時系列予測パイプラインに統合できます。

時系列関数のメソッドを次の表に示します。以下のサブセクションでは、さらに詳しく説明します。

方法説明

__init__

namedescription などのインスタンス変数や、時系列関数に不可欠な他の属性を初期化します。

initialize

時系列モデルを読み込み、初期構成を設定します。 このメソッドは、Python 時系列関数の開始時に使用します。

getParameterInfo

時系列関数が受け入れるパラメーターを定義します。 これには、モデルの読み込みや接続に必要な構成設定や、時系列処理に必要なパラメーターなどがあります。

getConfiguration

ツールが入力処理を実行し、出力を生成する方法を説明します。 これには、関数に必要な前処理や後処理の手順の詳細が含まれます。

predict

入力データを目的の出力に変換する関数。 定義されたパラメーターと処理ロジックを使用して、最終結果を生成します。

関数のメソッド

以下では、時系列関数のメソッドについて説明します。

__init__

__init__ メソッドはカスタム時系列関数のコンストラクターで、名前、説明、その他の重要な属性などのインスタンス変数を初期化します。 このメソッドは、時系列関数の動作と特性を定義するプロパティを設定します。

コンストラクターは、処理と解析に必要なすべての属性を持つカスタム時系列クラスのインスタンスを作成します。 このメソッドは、時系列クラスのインスタンスが作成されると、必要な設定とデフォルト値で初期化されるよう確保します。 たとえば、時系列関数に特定の設定が必要な場合 (モデル加重や構成ファイルを含むフォルダー パスなど)、このメソッドで指定できます。


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

initialize メソッドは、カスタム Python 時系列関数の開始時に呼び出され、kwargs['model'] 引数がこのメソッドに渡されます。 kwargs['model'] 引数は、Esri モデル定義ファイル (.emd) へのパスです。 このメソッドは、モデルの加重を読み込んで時系列モデルを設定し、後続の操作でそのモデルを参照できるようにするために使用されます。


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

getParameterInfo メソッドは、initialize メソッドの後に [時系列モデルを使用した予測 (Forecast Using Time Series Model)] ツールによって呼び出され、このモデルで必要なパラメーターを定義します。 このメソッドは、カスタム時系列関数に必要な入力パラメーターのリストを返します。 各パラメーターの記述には、以下に示すように、パラメーターの名前、データ タイプ、表示名、説明、およびパラメーターが必須かどうかを示すブール型パラメーターを含むディクショナリが使用されます。


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
    ]

このメソッドは、ディクショナリのリストを返します。それぞれがパラメーターを記述しています。 ディクショナリの主な属性は次のとおりです。

  • name - パラメーターの文字列の識別子
  • dataType - パラメーターが受け入れるデータのタイプ (long、string、Boolean、list など)
  • value - パラメーターのデフォルト値
  • required - パラメーターが必須かどうかを示すブール値
  • displayName - パラメーターのわかりやすい名前
  • domain - 許容値のセット (該当する場合)
  • description - パラメーターの詳細な説明

パラメーターのリストは、[時系列モデルを使用した予測 (Forecast Using Time Series Model)] ツールでカスタム モデルのモデル引数を通じてユーザーに表示されます。 ユーザーは、ツールのユーザー インターフェイスを使用してこれらの値を対話的に設定したり、プログラムでキーワード引数として getConfiguration メソッドに渡したりできます。

getConfiguration

getConfiguration メソッドは、時系列関数のパラメーターを設定および管理します。 ツールや指定したプログラムを通じてユーザーが更新したパラメーターを含むキーワード引数を受け入れます。 このメソッドは、更新されたパラメーターに基づいて、関数がデータを処理および出力する方法も制御します。 このメソッドは、getParameterInfo メソッドの後、predict メソッドの前に呼び出されます。 関数の戻り値は、モデルが一度に処理できるシーケンスの数を示す batch_size の値を含むディクショナリです。 このメソッドの戻り値は、モデルが一度にまとめて処理できるよう、入力データを分割する方法をツールに通知します。


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

上記の例では、カスタム時系列関数は次の手順で構成されます。

  • 指定された引数から sequence_length パラメーターを設定します。
  • batch_size パラメーターを最大 4 に設定します (より大きな値が指定された場合)。
  • ツールセットから number_of_timesteps_to_forecast パラメーターを設定します。
  • 更新されたパラメーター値を返します。

predict

predict メソッドは、時系列モデルを使用して予測を生成し、推論を実行します。 このメソッドは、入力データを含む 2D NumPy 配列を受け入れ、結果を 2D NumPy 配列として返します。 典型的なワークフローは次のとおりです。

  1. モデルの要件に合わせて、入力データを前処理します。
  2. 時系列モデルを入力データに適用し、予測を生成します。


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 ファイル

カスタム Python 時系列関数を作成したら、関数への参照を InferenceFunction パラメーターの横に指定して、.emd ファイルに関数への参照を含めます。 これにより、.emd ファイルが関数に正しくリンクされ、時系列予測で使用できるようになります。


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

}

.emd ファイルには、次のキーが含まれている必要があります。

  • InferenceFunction - カスタム時系列関数が含まれるファイルの名前。
  • ModelType - モデルのタイプを指定し、TimeSeriesForecasting に設定します。

カスタム .dlpk ファイル

最終的なサードパーティのカスタム時系列モデルを完成させるには、.dlpk モデル ファイルを作成します。 .dlpk ファイルにより、このモデルを 時系列 AI ツールセット[時系列モデルを使用した予測 (Forecast Using Time Series Model)] ツールで使用できるようになります。

ファイルを次のように整理します。

  • フォルダーを作成し、カスタム時系列関数ファイル (たとえば、MyTimesFM.py) および Esri .emd ファイル (たとえば、TimesFM.emd) を含めます。 フォルダーの名前は、.emd ファイルの名前と一致する必要があります。
    
    TimesFM/
    ├── MyTimesFM.py
    └── TimesFM.emd
    必要に応じて、時系列関数のその他のファイルやフォルダーを含めます。
  • フォルダーを ZIP アーカイブに圧縮します。 .emd ファイルの名前と一致するように .zip ファイルの名前を変更します。ただし、拡張子は .dlpk にします。 これで、.dlpk ファイルを [時系列モデルを使用した予測 (Forecast Using Time Series Model)] ツールで使用できるようになります。