Raman Iyer, Bogdan Crivat
July 2004
日本語版最終更新日 2005 年 3 月 29 日
適用対象:
Microsoft® SQL Server™ 2005 Analysis
Services
注意: ここに記載された情報は暫定版であり、予告なしに変更されることがあります。この資料は、Microsoft®
SQL Server™ 2005 Analysis Services
の今後のベータ版および最終リリースで更新される予定です。更新される資料には、今後のインターフェイスの変更と共に、追加情報も含めることになるでしょう。
概要: SQL Server 2005 データ マイニングがアルゴリズム
レベルで直接集計を可能にする方法について説明します。これは、言語とデータ型という点に関しては、サード
パーティのアルゴリズム開発者がサポートできる内容を制限しますが、開発者は、中核となるデータ マイニング
アルゴリズムの実装の上位に、データ処理、解析、メタデータの管理、セッション、および行セット生成コードを実装する必要がなくなります。
このドキュメントに記載されている情報は、このドキュメントの発行時点におけるマイクロソフトの見解を反映したものです。変化する市場状況に対応する必要があるため、このドキュメントは、マイクロソフトの確約とはみなされないものとします。
また、発行以降に発表される情報の正確性に関して、マイクロソフトはいかなる保証もいたしません。
このホワイト
ペーパーは情報提供のみを目的としています。明示または黙示に関わらず、このドキュメントの情報についてマイクロソフトはいかなる責任も負わないものとします。
お客様ご自身の責任において、適用されるすべての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国
Microsoft Corporation
の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。
マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権に関する権利をお客様に許諾するものではありません。
©
2004 Microsoft Corporation. All rights reserved.
Microsoft および
Windows は、米国 Microsoft Corporation
の米国およびその他の国における登録商標です。
記載されている会社名、製品名には、各社の商標のものもあります。
目次
概要
必要条件
アーキテクチャ
概要
Microsoft® SQL Server™ Analysis Services 2000 Service Pack 1 (SP1)
では、Analysis Server でサード パーティ製の OLE DB for Data Mining プロバイダのプラグイン ("集計")
が許可されます。この集計は OLE DB レベルなので、SQL Server 2000 SP1 を使用しているサード
パーティのアルゴリズム開発者は、中核となるデータ マイニング
アルゴリズムの実装の上位に、すべてのデータ処理、解析、メタデータの管理、セッション、および行セット生成コードを実装する必要がありました。
これとは対照的に、SQL Server 2005 データ マイニングでは、アルゴリズム
レベルで直接集計が行えます。これは、言語とデータ型という点に関しては、サード
パーティのアルゴリズム開発者がサポートできる内容が制限されますが、開発者は上記の追加の層をすべて実装する必要がなくなりました。また、OLAP
マイニング モデルやデータ マイニング ディメンションを構築する機能を含めて、Analysis Services
とのより密接な統合が可能になります。ここでは "プラグイン アルゴリズム" という用語を使用して、SQL Server 2005 分析サーバー
(以後、"分析サーバー" といいます) にプラグインされ、ユーザーにはあらゆる点でネイティブ アルゴリズムのように表示されるサード パーティ
アルゴリズムについて説明します。
必要条件
分析サーバーは、一連の COM インターフェイスを経由してサード パーティのアルゴリズム
プロバイダと通信します。この資料では、これらのインターフェイスを、アルゴリズム プロバイダが実装すべきインターフェイスと、分析サーバー
オブジェクトによって実装され、アルゴリズム プロバイダが利用するインターフェイスの 2 種類に分類します。
アルゴリズム プロバイダが実装するインターフェイス
メソッド定義とパラメータの説明が提供されます。これらのインターフェイスのメソッド定義については、dmalgo.h を参照してください。
IDMAlgorithmFactory
このインターフェイスは、プラグイン アルゴリズム プロバイダへのエントリ ポイントです。分析サーバーでは、アルゴリズム
プロバイダのインスタンスを作成するときにこのインターフェイスが要求されます。また、このインターフェイスを使用して、サーバー領域の対応するマイニング
モデルにバインドされる新しいアルゴリズムのインスタンスが作成されます。また、IDMAlgorithmFactory を、以下で説明する
IDMAlgorithmMetadata インターフェイスにクエリすることもできます。
IDMAlgorithmMetadata
このインターフェイスは、分析サーバーによって使用され、アルゴリズム
プロバイダの機能を問い合わせます。このような問い合わせには、属性セットの検証などがあります。
IDMAlgorithm
このインターフェイスは、学習、予測、参照など、アルゴリズム インスタンスのさまざまな機能にアクセスできるようにする、中核となるアルゴリズム
インターフェイスです。
IDMCaseProcessor
このインターフェイスによって、学習用のアルゴリズム プロバイダに書式化されたケースが提供されます。
IDMAlgorithmNavigation :IDMDAGNavigation
このインターフェイスによって、学習済みのモデルのアルゴリズム コンテンツが分析サーバーに参照用に公開されます。
IDMPullCaseSet
このインターフェイスは、サンプル ケースを生成するために、分析サーバーによって使用されます。
IDMPersist
分析サーバーはこのインターフェイスを呼び出して、サーバーによって提供されたストリームに、アルゴリズム固有のコンテンツを読み込み、保存します。
IDMCaseIDIterator
アルゴリズム プロバイダは、ケースの生成をフィルタ処理および制御するために、このインターフェイスを実装できます。
IDMMarginalStat
限界統計は、予測クエリの処理中に、分析サーバーで必要になります。限界統計は、ケースの生成中に分析サーバーによって、または学習中にアルゴリズム
プロバイダ自身によって収集されます。アルゴリズム プロバイダから、(IDMAlgorithmMetadata インターフェイスのメソッドにより)
統計がアルゴリズムによって収集され、公開されることが示される場合、プロバイダはこのインターフェイスをサポートする必要があります。それ以外の場合、分析サーバーはこのインターフェイスの独自の実装でアルゴリズムを初期化します。アルゴリズムが内部で分析サーバーの
IDMMarginalStats
の実装を使用していない場合でも、アルゴリズムにクエリされたとき、このインターフェイスを保存し、返す必要があります。
IDMClusteringAlgorithm
Clustering アルゴリズムは、オプションでこのインターフェイスをサポートできるので、分析サーバーのクエリ プロセッサは
Cluster() などの、アルゴリズム固有の関数を呼び出すクエリの結果を適切に返すことができます。
IDMSequenceAlgorithm
Sequence Clustering アルゴリズムは、オプションでこのインターフェイスをサポートできるので、分析サーバーのクエリ
プロセッサは Sequence() などの、アルゴリズム固有の関数を呼び出すクエリの結果を適切に返すことができます。
IDMTimeSeriesAlgorithm
Sequence Clustering アルゴリズムは、オプションでこのインターフェイスをサポートできるので、分析サーバーのクエリ
プロセッサは Time() などの、アルゴリズム固有の関数を呼び出すクエリの結果を適切に返すことができます。
IDMCustomFunctionInfo
プラグイン アルゴリズムは、カスタム関数をサポートすることができます。このような機能のメタデータは、アルゴリズムのメタデータ
オブジェクトから取得できるこのインターフェイスを使用して、プラグイン アルゴリズムによって公開されます。
IDMDispatch
プラグイン アルゴリズムによってカスタム関数がサポートされている場合、および IDMCustomFunctionInfo メタデータ
インターフェイスを使用してカスタム関数のメタデータが公開されている場合、プラグイン アルゴリズムはそのアルゴリズム オブジェクトの
IDMDispatch インターフェイスもサポートし、分析サーバーがこれらの関数を呼び出せるようにする必要があります。
IDMTableResult
カスタム関数によってテーブルの結果が返される場合、カスタム関数は IDMTableResults インターフェイス
ポインタとして返される必要があります。このインターフェイスによって、分析サーバーは (前方参照のみの手法で)
結果を移動し、データ行をフェッチすることができます。
アルゴリズム プロバイダによって利用されるインターフェイス
メソッド定義とパラメータの説明が提供されます。これらのインターフェイスのメソッド定義については、dmalgo.h を参照してください。
IDMPushCaseSet
このインターフェイスを使用して、分析サーバーとアルゴリズム インスタンス間でケース処理の情報が渡されます。
IDMAttributeset
このインターフェイスによって、入力ケースに含まれる属性に関する情報がカプセル化されます。
IDMAttributeGroup
特定の条件 (たとえば、関連する属性または入れ子になったテーブル) に基づいて、属性をグループ化できます。IDMAttributeGroup
によって、このような属性のグループを繰り返す方法が提供されます。
IDMPersistenceWriter
これは、アルゴリズムがコンテンツを保存できるストリームの抽象インターフェイスです。ストリームは、アルゴリズムの親マイニング
モデルの独自のストレージ システム上に、分析サーバーによって実装され、IDMPersist::Save メソッドのアルゴリズムに渡されます。
IDMPersistenceReader
これは、アルゴリズムが以前に保存したコンテンツを読み込めるストリームの抽象インターフェイスです。ストリームは、アルゴリズムの親マイニング
モデルの独自のストレージ システム上に、分析サーバーによって実装され、IDMPersist::Load メソッドのアルゴリズムに渡されます。
IDMServices
これは、サーバー領域からアルゴリズムに共有情報を渡す、基本インターフェイスです。このインターフェイスによって、メモリ
アロケータ、文字列やバリアントの処理、ファイルへの保存、トランザクションのようなサービスが公開されます。このインターフェイスがコンテキスト
オブジェクトでどのように使用されるかについては、「DMContext オブジェクト」(セクション 2.5) を参照してください。
IDMContextServices
これは、分析サーバーからのほとんどのアルゴリズム呼び出しが渡されるコンテキスト インターフェイスです。このインターフェイスは、上記で説明した
IDMServices から派生されており、ロケール、メモリ アロケータ、および現在の要求固有のその他の情報へのアクセスを提供します。
IDMModelServices
これは、アルゴリズム インスタンスが作成されるときに渡されるコンテキスト インターフェイスです。このインターフェイスは、有効期間がサーバー
モデル
オブジェクトに関連付けられているアロケータと同様に、モデル固有の情報にアクセスするために使用されます。これには、以下の操作を行うメソッドが含まれています。
- モデルのロケール情報の取得
- 進行状況通知の起動
- 更新されたノード キャプションのモデルのコンテンツ マップの取得
- PMML コンテンツの解析とレンダリング
IDMMemoryAllocator
プラグイン
アルゴリズムは、このインターフェイスによって、サーバーのメモリ領域内のメモリの割り当てと解放を行えます。詳細については、「メモリ管理」(セクション
2.3) を参照してください。
IDMStringHandler
このインターフェイスによって、分析サーバーの内部文字列データ型にアクセスできます。アルゴリズム
メソッドに渡されるサーバーの文字列へのポインタは、IDMStringHandler
メソッドによってデコードできるあいまいなハンドルとして扱われます。このインターフェイスの使用方法に関する詳細については、「共有データ型へのアクセス」(セクション
2.4) を参照してください。
IDMVariantPtrHandler
このインターフェイスによって、分析サーバーの内部バリアント データ型にアクセスできます。アルゴリズム
メソッドに渡されるサーバーのバリアントへのポインタは、IDMVariantHandler
メソッドによってデコードできるあいまいなハンドルとして扱われます。このインターフェイスの使用方法に関する詳細については、「共有データ型へのアクセス」(セクション
2.4) を参照してください。
IDMContentMap
このインターフェイスによって、アルゴリズムに代わって、分析サーバー フレームワークによって管理されている、アルゴリズム
コンテンツの更新可能な部分にアクセスできます。現在、このインターフェイスには、ユーザーが DMX
を使用して更新できるノードのキャプションが含まれています。アルゴリズム
ナビゲータがこのインターフェイスをどのように使用する必要があるかの詳細については、「ユーザーが更新可能なアルゴリズム
コンテンツ」を参照してください。
メモリ管理
アルゴリズム プロバイダは、分析サーバーのメモリ アロケーション インターフェイスを使用する必要があり、メモリ クォータ
インターフェイスを使用してメモリを予約する必要があります。Aggregator
アルゴリズムは、割り当てられたオブジェクトの有効期間に応じて、コンテキスト サービスまたはモデル サービスのいずれかからメモリ
アロケータを使用する必要があります。分析サーバーでメモリを効果的に管理し、制御できるようにするには、プラグイン アルゴリズム
プロバイダのすべてのメモリ割り当てが、これらのメモリ管理インターフェイスを使用して行われる必要があります。
共有データ型へのアクセス
以下の内部のサーバー型が、プラグイン アルゴリズム プロバイダの実装者に公開されます。
- String (ハンドルとして、DMString)
- Variant (ハンドルとして、DMVariantPtr)
- XMLWriter (ハンドルとして、DMXMLWriterPtr)
- MiningFunctionsInfo (ハンドルとして、DMFunctionRecPtr)
- ExecutionContext (「DMContext オブジェクト」セクションで個別に説明しています)
DMString と DMVariantPtr
DMString と DMVariant は、さまざまなインターフェイスで使用され、文字列または値をサーバー
コードに渡し、文字列または値をサーバーからフェッチします。
プラグイン アルゴリズムは、IDMStringHandler と IDMVariantPtrHandler の 2
つのインターフェイスを使用して、文字列およびバリアント ハンドルを操作します。
これらのインターフェイスは、スレッドセーフでステートレスです。このため、キャッシュすることができます。
これらのインターフェイス (ハンドラ) の実装は、初期化時およびコンテキストから IDMServices 経由で取得できます。
注意:
コンテキストから取得されたサービスは、すべて、コンテキストのメモリに割り当てられます。このため、プラグイン アルゴリズムの領域内部でコンテキスト
ハンドルを返す関数が終了する前にメモリを解放する必要があります。
ハンドラによって使用される一連のメモリ
アロケータは、ハンドラが取得された方法によって決定されます。同様に、文字列やバリアントの処理で使用されるメモリ
アロケータは、ハンドラによって決定されます。
以下に例を示します。
- ハンドラは Initialize に渡された IDMServices ポインタ (つまり、モデルのサービス プロバイダ)
から取得されます。そのハンドラによって実行されるすべての操作は、モデルのアロケータを使用します。このため、このアロケータを使用して作成された文字列ハンドルは、呼び出し間で安全にキャッシュできます。
- ハンドラは実行コンテキストの IDMServices (つまり、実行コンテキストのサービス プロバイダ)
から取得されます。そのハンドラによって実行されるすべての操作は、実行コンテキストのアロケータを使用します。このため、このアロケータを使用して作成された文字列ハンドルは、呼び出し間で安全にキャッシュできません。
IDMStringHandler のメソッド
HRESULT CreateNewHandle(DMString** out_phString)
後にアルゴリズムの領域内部で使用できる新しい文字列ハンドルを作成します。out_phString
パラメータは、新しく作成された文字列ハンドラを格納する場所です。
HRESULT CopyHandleToBuffer(DMString* in_hString,
WCHAR* out_pchBuff,
UINT* io_pcAllocated)
文字列ハンドルのコンテンツを char
バッファにコピーします。このメソッドは、プラットフォーム SDK の関数のように動作します。つまり、io_pcAllocated
にはエラーの発生時には必要なサイズ (提供されたバッファ
サイズが要求されたサイズよりも小さい場合)、関数が適切に動作した場合は実際のサイズが含まれます。
HRESULT CopyBufferToHandler(DMString* in_hString,
WCHAR* in_pchBuff,
UINT in_pcLength)
バッファのコンテンツを文字列ハンドルにコピーします。
HRESULT GetConstStringFromHandle(DMString* in_hString,
const WCHAR** out_ppchBuff)
パフォーマンスを向上するために、ユーザーが用意したバッファにコピーする代わりに、ハンドルに含まれる内部文字列バッファへのconst
ポインタを返します。
HRESULT AttachHandleToBSTR(DMString* in_hString,
BSTR in_bstrBuffer)
パフォーマンスを向上するために、入力 BSTR
にハンドルをアタッチします。これにより、コピーの時間が短縮されます。in_bstrBuffer
の有効期間は、この関数から返された後、in_hString で制御されます。
HRESULT CopyHandleToHandle(DMString* in_hString,
DMString* out_hString)
ある文字列ハンドルから別の文字列ハンドルに文字列をコピーします。
IDMVariantPtrHandler のメソッド
HRESULT CreateNewHandle(DMVariantPtr** out_phVariant)
後にアルゴリズムの領域内で使用できる新しいバリアント
ハンドルを作成します。out_phVariant パラメータは、新しく作成されたバリアント ハンドラを格納する場所です。
HRESULT CopyVariantToHandle(DMVariantPtr* in_hVariant,
VARIANT* in_pVar)
入力バリアントをハンドル バリアントにコピーします。
HRESULT GetVariantCopyFromHandle(
DMVariantPtr* in_hVariant,
VARIANT* out_pVar)
ハンドル バリアントを out_pVar の場所にコピーします。
HRESULT DetachHandleVariant(DMVariantPtr* in_hVariant,
VARIANT* out_pVar)
ハンドル
バリアントをデタッチし、デタッチしたバリアントのアドレスを返します。これは、GetVariantCopyFromHandle
のパフォーマンスが高いバージョンで、明示的なコピーが必要ではないところで使用できます。
HRESULT AttachHandleVariant(DMVariantPtr* in_hVariant,
VARIANT* out_pVar)
ハンドル
バリアントをアタッチします。これは、CopyVariantToHandle
のパフォーマンスが高いバージョンで、明示的なコピーが必要ではないところで使用できます。
DMContext オブジェクト
DMContext オブジェクトには、ロケールやモデル アクセスなど、現在実行中の要求に関する情報が含まれています。DMContext
オブジェクトは、IDMServices から継承されたインターフェイス (IDMContextServices) として公開されます。
サービス プロバイダ アーキテクチャ
プラグイン アルゴリズムは、IDMServices メカニズムを経由してサーバー コンポーネントにアクセスします。
プラグイン アルゴリズムは、ほとんどの場合、2 つの異なるサービス プロバイダを利用できます。
- モデル サービス プロバイダ は、分析サーバー マイニング モデル オブジェクトによって論理的に所有されます。このモデル
サービス プロバイダによって、以下のサービスへのアクセスが提供されます。
- 呼び出し間に存在するオブジェクト (たとえば、アルゴリズムと同じ有効期間のオブジェクト)
を作成するために使用できる、モデルごとのアロケータ
- モデルの名前やロケールなどの、モデルの情報
- 進行状況通知
- PMML のレンダリングと解析
コンテキスト サービス プロバイダ は、分析サーバーの要求または "実行コンテキスト"
によって論理的に所有されます。このコンテキスト サービス プロバイダによって、以下のサービスへのアクセスが提供されます。
- 現在のコンテキストの有効期間内のみ存在するオブジェクトを作成するために使用できるコンテキスト (EC ごとの) アロケータ
- ロケール情報
- メモリの推定を更新するメソッド
- キャンセル状態のポーリング
プラグイン アルゴリズムは、モデル サービス プロバイダを
IDMAlgorithm::Initialize メソッドのパラメータとして受け取ります。モデル サービス プロバイダ
(および、これによって取得されるサービス) は、アルゴリズムの有効期間内 (アンロードされるか、破棄されるまで) は安全にキャッシュできます。
モデル サービス プロバイダによって公開される各サービスは、スレッドセーフにするかどうかがドキュメント化されます。
共有定義と列挙値
これらは、データ型の定義と列挙値で、アルゴリズムにケースや属性情報を通知するために使用されます。
dmalgo.h ファイルには、DM_Attribute や DM_STATE_STAT
などの、型と構造体が含まれています。説明が提供されます。
アルゴリズムの登録
分析サーバーのインスタンスに利用できる各データ マイニング アルゴリズムは、サーバーの INI
ファイルにエントリがあります。これには、分析サーバーのネイティブ アルゴリズムとサード パーティ
アルゴリズムの両方が含まれます。エントリには、以下の情報が含まれます。
- アルゴリズム名 (Microsoft_Decision_Trees など)
- ProgID (これは省略可能で、サード パーティ プロバイダのみに提供されます)
- アルゴリズムが有効か無効かを示すフラグ
以下にサンプル プラグイン アルゴリズム プロバイダの "\Program Files\Microsoft SQL
Server\MSSQL.1\OLAP\bin\msmdsrv.ini" にあるエントリを示します。
<ConfigurationSettings>
<DataMining>
<Algorithms>
<Microsoft_Sample_PlugIn_Algorithm>
<Enabled>1</Enabled>
<ProgID>Microsoft.DataMining.SamplePlugInAlgorithm.Factory</ProgID>
</Microsoft_Sample_PlugIn_Algorithm>
</Algorithms>
</DataMining>
</ConfigurationSettings>
上記の構成エントリで、"Microsoft_Sample_PlugIn_Algorithm" は、サーバーに送信される DLL
ステートメントのアルゴリズムを識別するために使用される名前です。分析サーバーでは、起動時にこの名前が
IDMAlgorithmMetadata::GetServiceName()
のアルゴリズムによって返されるアルゴリズム名と同じであることが確認されます。名前が一致しない場合、サーバーによってアルゴリズム
プロバイダが読み込まれず、Microsoft® Windows® イベント ログにエラーが記録されます。
以前に作成したモデル
インスタンスがユーザーによってアクセスされ、アルゴリズムが現在無効になっている場合、分析サーバーは要求に失敗し、モデルのアルゴリズムが現在のサーバー
インスタンスで利用できないことが報告されます。
アルゴリズム コンテンツの保存
プラグイン アルゴリズムのコンテンツは、IDMPersist インターフェイスにより、サーバー
モデルの領域に読み込まれて保存されます。このシリアル化メカニズムによって、プラグイン アルゴリズム
インスタンスは、そのコンテンツを抽象ストリーム、つまり分析サーバーによって提供される IDMPersistenceWriter と
IDMPersistenceWriter
に保存および読み込むことができます。分析サーバーは、これらのインターフェイスを使用して、アルゴリズムのコンテンツをストアに対してトランザクションとして保存および読み込む役割があります。そのため、アルゴリズム
コンテンツを部分的に読み込みおよび保存する場合に、発生する可能性がある処理エラーを心配する必要はありません。
アルゴリズム固有のモデリング フラグ
プラグイン アルゴリズムは、IDMAlgorithmMetadata メソッドを経由して情報を公開する、カスタム モデリング
フラグをサポートできます。これらは、分析サーバーによって検証され、アルゴリズムに渡されます。
カスタム関数
プラグイン アルゴリズムは、OLE DB for DM
仕様の一部である標準関数に加え、カスタム関数もサポートできます。カスタム関数のメタデータは、IDMCustomFunctionInfo
インターフェイスにより公開されます。この情報に基づいて、分析サーバーは解析、およびユーザーによって発行される DMX
クエリ内のカスタム関数呼び出しのセマンティクスの検証を処理します。分析サーバーは、予測時間にアルゴリズムの IDMDispatch
インターフェイスを取得し、PrepareFunction メソッドと InvokeFunction
メソッドを呼び出します。これにより、カスタム関数を評価し、予測の結果内に含めるメタデータまたはデータを取得します。
分析サーバー フレームワークとプラグイン アルゴリズム間の制御フローは以下のとおりです。
- プラグイン アルゴリズムは、アルゴリズムのIDMAlgorithmMetadata::GetSupportedFunctions
メソッドによって返されるサポート関数の一覧にカスタム関数を含めることで、カスタム関数をアドバタイズします。dmalgo.idl の
DM_SUPPORTED_FUNCTION 列挙値には、OLE DB for DM
仕様で公開された既知の関数の列挙値の一覧があります。カスタム関数には、上記の DMSF_CUSTOM_FUNCTION_BASE
以降の列挙値を持つことになります。
- カスタム関数がプラグイン アルゴリズムの IDMAlgorithmMetadata::GetSupportedFunctions
メソッドによって返される一覧に含まれている場合、分析サーバー フレームワークはプラグイン アルゴリズムの
IDMCustomFunctionInfo インターフェイスの IDMAlgorithmMetadata インターフェイス
(この場合はサポートされている必要があります) へのポインタをクエリし、MINING_FUNCTIONS
スキーマ行セットに返すため、およびユーザーの DMX
クエリでのカスタム関数の呼び出しの解析および検証を行うために使用できるメタデータ情報を取得します。メタデータ情報には、以下の内容が含まれています。
- シグニチャ
- 説明
- 関数がスカラ値またはテーブルのいずれを返すか
- 受け取るパラメータとフラグ
カスタム関数を含む DMX 要求を受け取るときは、分析サーバー フレームワークは、プラグイン アルゴリズムのIDMDispatch
インターフェイスの IDMAlgorithm インターフェイスへのポインタをクエリします。
クエリの実行開始時 (バインド時) に IDMDispatch::PrepareFunction
が一度呼び出され、結果の列メタデータを取得します。列情報はテーブル結果の配列になります。
ケースごとに、IDMAlgorithm::Predict への予測呼び出しと共に、DMX クエリ内の各カスタム関数で
IDMDispatch::InvokeFunction への呼び出しが行われます。 ユーザーが更新可能なアルゴリズム コンテンツ
分析サーバーでは、ユーザーが DMX UPDATE ステートメントを使用してアルゴリズム コンテンツの一部を更新できます。現在は、ノード
キャプションのみを更新できます。プラグイン アルゴリズムは、モデル サービス オブジェクト
(IDMModelServices::GetContentMap) から利用できる IDMContentMap
インターフェイスにより、更新されたコンテンツにアクセスできます。分析サーバー フレームワークでは、プラグイン アルゴリズムのコンテンツ
ナビゲータから DMNP_CAPTION プロパティが要求されたときに、適切な (更新された) ノード キャプションを返すために、モデル サービス
オブジェクトのコンテンツ マップからキャプションをフェッチする必要があります。このコードは、以下に示すサンプルのようなコードです
(簡単にするために、エラー処理コードを省略しています)。
// TODO : キャプション文字列を空文字列に初期化します
CComPtr<IDMContentMap> spContentMap;
m_spModelServices->GetContentMap(in_pContext, &spContentMap));
if (S_FALSE == spContentMap->IsEmpty())
{
spContentMap->FindNodeCaption(&strNodeUniqueName,&pstrCaption));
if (pstrCaption)
{
// TODO : キャプション文字列にコピーします
}
}
// TODO : 出力バリアントに文字列をコピーします
アーキテクチャ
ここでは、分析サーバーとアルゴリズム プロバイダ間のデータと制御の流れについて説明します。
サーバーの起動
分析サーバーは起動時に、登録済みで有効なすべてのプラグイン アルゴリズム
プロバイダのインスタンスを作成し、IDMAlgorithmFactory インターフェイス ポインタをキャッシュします。
マイニング アルゴリズムの情報
サーバーは、MINING_SERVICES の Discover 要求に応答して、アルゴリズム プロバイダ (対応するキャッシュされた
IDMAlgorithmFactory インターフェイスによって表されます) のアルゴリズム
マネージャの一覧全体を繰り返し、IDMAlgorithmMetadata インターフェイス経由で関連する情報を取得します。
マイニング モデルの作成
マイニング モデルが作成されると、メタデータ オブジェクトがマイニング
モデル用にサーバー内でインスタンスが作成され、ディスクに保存されます。この時点では、マイニング モデルに関連付けられたアルゴリズム
インスタンスはありません。ただし、インスタンスは対応するアルゴリズム プロバイダの IDMAlgorithmMetadata
インターフェイスから取得された情報に対して検証されます。
マイニング構造の処理
マイニング モデルの親マイニング構造が処理された後、サーバーによって作成された Attributeset
オブジェクトがそれぞれの子モデルのアルゴリズム プロバイダに対して検証され、Attributeset
がアルゴリズムによって利用できる形式であることが確認されます。これは、アルゴリズム プロバイダの IDMAlgorithmMetadata
インターフェイスで ValidateAttributeset メソッドを呼び出すことで実現されます。
マイニング モデルの学習
処理中の要求がマイニング モデルのサーバーによって実行される場合、対応するアルゴリズム プロバイダの IDMAlgorithmFactory
の CreateAlgorithm メソッドが呼び出され、モデルに関連付けられる新しいアルゴリズム
インスタンスが作成されます。以下で説明するように、アルゴリズム インスタンスの IDMAlgorithm インターフェイスおよびアルゴリズム
インスタンスから取得された関連するインターフェイスは、サーバーによって使用され、ケースを渡し、アルゴリズム
インスタンスを学習し、インスタンスのコンテンツを保存します。
- アルゴリズム インスタンスは、まず、学習中にアルゴリズムによってクエリできる Attributeset オブジェクト
(IDMAttributeSet) で初期化され、属性情報を取得し、オプションで限界統計オブジェクト (IDMMarginalStats)
を取得します。
- その後、サーバーでは、IDMPushCaseSet パラメータを指定して IDMAlgorithm::InsertCases
を呼び出すことで、学習を開始します。アルゴリズム プロバイダは、実際には IDMCaseProcessor
インターフェイスを公開するコールバック オブジェクトを実装する必要があります。コールバック オブジェクトは InsertCases
要求に応答して、IDMPushCaseSet::StartCases を経由で分析サーバーに返されます。
- サーバーがアルゴリズムの CaseProcessor オブジェクトを受け取った後、サーバーはケースごとに CaseProcessor の
ProcessCase メソッドを呼び出すことによって、CaseProcessor オブジェクトにケースをプッシュします。
- 学習の最後で、分析サーバーはアルゴリズムへの追加の呼び出しを行い、下記の「マイニング モデルのドリルスルー」(セクション3.9)
で説明している Drillthrough ストアを構築できます。また、追加の呼び出しを行い、下記の「マイニング ディメンション」(セクション
3.10) で説明しているようにデータ マイニング ディメンションを構築することもできます。
マイニング モデルの予測
分析サーバーのクエリ プロセッサは、予測クエリに応答して、モデルのキャッシュされたアルゴリズム インターフェイス
(IDMAlgorithm:Predict) の Predict メソッドを使用して、予測参加を評価します。カスタム関数呼び出しは、アルゴリズム
プロバイダの IDMAlgorithmMetadata
インターフェイスにより取得されたメタデータを使用して評価されます。IDMAlgorithmMetadata
インターフェイスによって取得されたメタデータでは、プロバイダ固有の関数の呼び出し規約とパラメータについて説明されます。この情報は、後でプロバイダ固有の関数呼び出しを評価するときに使用されます。
マイニング モデルの参照
サーバーは、MINING_MODEL_CONTENT の Discover 要求に応答して、対応するモデルのキャッシュされたアルゴリズム
インターフェイス IDMAlgorithm で呼び出しを使用して、IDMAlgorithmNavigation インターフェイスを公開するコンテンツ
ナビゲーション
オブジェクトを要求します。その後、サーバーはナビゲータによって公開されるグラフのノードを調べ、さまざまなプロパティを各ノードにクエリすることで、結果行セットを構築します。
マイニング モデルの保存
アルゴリズム インターフェイスの主要なインターフェイス IDMAlgorithm は、COM を使用して IDMPersist
インターフェイスにクエリできます。このインターフェイスを使用して、アルゴリズム インスタンスを所有しているマイニング モデル
オブジェクトのストレージ領域に対してアルゴリズム
コンテンツの読み込みと保存が行われます。このストレージのバージョン管理とトランザクション更新は、分析サーバーによって管理されます。
マイニング モデルのドリルスルー
ユーザーは、マイニング モデルのコンテンツをビューアで参照している間は、コンテンツ
グラフの特定のノードに属している基になるケースの表示を要求できます。アルゴリズムによってこの Drillthrough
操作がサポートされている場合、分析サーバーでは、学習ケースをコンテンツ
グラフ内の対応するノードにマップするモデルに関連付けられた、内部データ構造体が構築されます。参照中に使用するためにこの構造体を構築するには、サーバーは学習の最後にケースごとに
IDMAlgorithm::GetNodeIDs メソッドを使用します。
マイニング ディメンション
分析サーバーでは、ユーザーがマイニング モデルのコンテンツに基づいて、データ マイニング
ディメンションを構築できます。このディメンションは、マイニング モデルが構築されたのと同じディメンションを使用する OLAP
キューブに含めることができます。また、OLAP
キューブの発見済みの階層を使用して、興味深い方法で実際のデータをスライスしたり、ダイスしたりできます。アルゴリズムでデータ マイニング
ディメンションがサポートされていて、ユーザーがデータ マイニング
ディメンションをモデルから作成することを要求した場合、分析サーバーでは、学習の最後に DIMENSION_CONTENT フラグを持つケースごとに
IDMAlgorithm::GetNodeIDs メソッドを呼び出すことによって、この特別なディメンションが構築されます。
データ マイニング ディメンションの目的は通常のモデル参照を行うことですが、アルゴリズム
プロバイダでは、これとは異なる形式でコンテンツを表示することを選択できることに注意してください。そのため、IDMAlgorithm::GetNodeIDs
と IDMAlgorithm::GetNavigator の両方で、コンテンツ
ノード情報がどのように使用されるかをサーバーが指定できるフラグがサポートされています。
サンプル ケースの生成
ユーザーが "SELECT * FROM model.CASES WHERE IsInNode(xxxx)"
クエリを発行することによってサンプル ケース セットを要求すると、分析サーバーは、モデルのアルゴリズム インスタンスから IPullCaseSet
インターフェイスを要求することで、このケース セットを取得します。サンプル ケース
セットは、学習中に習得した属性値を使用して、アルゴリズムによって生成される、単なる仮想のケースのセットです。このセットは、コンテンツ
グラフ内の特定のノードによって表されるルールに適合します。
PMML のインポートと生成
ユーザーは、PMML の形式でマイニング モデルのコンテンツを要求できます。Microsoft Analysis Services 2005
では、PMML 2.1 がサポートされています。要求は、"SELECT * FROM [Model].PMML"
の形式になります。また、ユーザーはモデルが PMML 2.1 ドキュメントから読み込まれるように要求できます。構文は "CREATE MINING
MODEL [ModelName] FROM PMML 'pmml here' " です。フレームワークは、PMML
(データ辞書および、オプションでモデルの統計) 内の構造情報を管理します。それに対して、プラグイン アルゴリズムは、PMML
のコンテンツ部分の解析とレンダリングを行う役割があります。
PMML 2.1 のレンダリングをサポートするプラグインは、IDMAlgorithm インターフェイスの RenderPMMLContent
メソッドを実装する必要があります。このメソッドから E_NOTIMPL が返される場合、フレームワークは、プラグインでは PMML
がサポートされていないと見なします。RenderPMMLContent は、ISAXContentHandler
インターフェイスをパラメータとして受け取り、プラグインは、出力ストリームに書き込むために、このインターフェイスで XML
イベントを生成する必要があります。PMML 2.1 標準には、モデルのコンテンツ要素の内部に、モデル統計とモデル
スキーマが含まれています。プラグインは、フレームワークによって提供された IDMModelServices インターフェイスの
RenderPMMLModelStatistics、RenderPMMLMiningSchema および
RenderPMMLModelCreationFlags を呼び出すことによって、フレームワークへのこの情報のレンダリングを委任できます。
一般的に、PMML 2.1 ドキュメントのレンダリング操作は、以下の表に従って実行されます。
| 分析サーバー フレームワーク | プラグイン アルゴリズム |
| コンテンツ ハンドラを作成し、PMML into3 をレンダリングします | |
| PMML 2.1 のレンダリングを開始します | |
| データ辞書をレンダリングします | |
| コンテンツのプラグインを呼び出します | |
| | RenderPMMLContent が、モデル コンテンツのレンダリングを開始します (アルゴリズム
コンテンツを識別する XML 要素を開始します) |
| | 統計をレンダリングするか、フレームワークを呼び出します |
| RenderPMMLModelStatistics
が呼び出された場合、統計をレンダリング後、プラグインに制御を返します | |
| | マイニング スキーマをレンダリングするか、フレームワークを呼び出します |
| RenderPMMLMiningSchema
が呼び出された場合、統計をレンダリング後、プラグインに制御を返します | |
| | モデル作成フラグ (マイクロソフトのPMML 2.1 への拡張で、PMML 2.1
の仕様に応じて開発されました) をレンダリングするか、フレームワークを呼び出します |
| RenderPMMLModelCreationFlags
が呼び出された場合、統計をレンダリング後、プラグインに制御を返します | |
| | マイニング モデルの実際のコンテンツをレンダリングします |
| | アルゴリズム コンテンツを識別する XML 要素を閉じます (RenderPMMLContent
関数の最後) |
| PMML ドキュメントのレンダリングを終了します | |
PMML 2.1 ストリームを読み取るため (および PMML 2.1 ドキュメントからマイニング モデルを作成するため)、プラグインは 2
つのメソッドを実装する必要があります。これらのいずれかのメソッドから E_NOTIMPL が返される場合、フレームワークは、プラグインでは PMML
2.1 の解析がサポートされていないと見なします。
PreInitializeForPMMLParsing によって、PMML
を読み取るためのプラグインを準備できます。フレームワークは、PMML 2.1
の構造部分を解析し、その後、プラグインのこのメソッドを呼び出します。このとき、構造情報が含まれる削減された属性セットの実装
(IDMAttributeSet) をパラメータとして渡します。
フレームワークでは、プラグインの GetPMMLAlgorithmSAXHandler メソッドが呼び出され、PMML
ドキュメントのコンテンツの SAX ハンドラが取得されます。プラグインは、PMML
ストリームからのすべてのアルゴリズム固有の情報を解析する必要があります。プラグインは、フレームワークによって提供された、IDMModelServices
インターフェイスの ParsePMMLModelStatistics
を呼び出すことによって、モデルの統計を解析するか、このタスクをフレームワークに委任できます。
コンテンツの解析が完了した後、プラグインは IDMModelServices インターフェイスの ContinuePMMLParsing
を呼び出すことによって、フレームワークに制御を返す必要があります。
PMML 2.1 ドキュメントの解析操作は、以下の表に従って実行されます。
| 分析サーバー フレームワーク | プラグイン アルゴリズム |
| PMML 2.1 の解析を開始します (このために XML SAX コンテンツ
ハンドラを作成します) | |
| データ辞書を読み取ります | |
| PMML 2.1 ドキュメントを事前解析し、マイニング
モデル、マイニング構造、列のメタデータを作成します | |
| コンテンツを解析するプラグインを呼び出します | |
| | GetPMMLAlgorithmSAXHandler により、コンテンツを処理する SAX コンテンツ
ハンドラが返されます |
| プラグインによって返されるハンドラに XML 解析をリダイレクトします | |
| | マイニング モデルのコンテンツを読み取るための XML を処理します |
| | ModelStats
要素が検出されたときは、プラグインは統計を解析できるか、このタスクをフレームワークに委任できます |
| ParsePMMLModelStatistics
が呼び出された場合、統計をIDMMarginalStats 実装に読み込み、プラグインに制御を返します | |
| | PMML のコンテンツ部分が完了したら、ContinuePMMLParsing
を呼び出すことによってフレームワークに制御を返します |
| ContinuePMMLParsing が呼び出されるときに、XML
解析を基になるハンドラにリダイレクトします | |
| PMML ドキュメントの解析を終了します | |
| 新しく作成されたオブジェクトを保存します | |
エラー処理
アルゴリズム プロバイダは、標準エラーを発生させ、IErrorInfo オブジェクトを設定する必要があります。