SSAS は 9 つのデータ マイニング アルゴリズムを提供していますが、実際の問題に基づいて適切なアルゴリズムを設計する必要があります。このとき、より多くのアルゴリズムを適用できるように SSAS を拡張する必要があります。SSAS は優れたスケーラビリティを備えており、拡張のための完全なメカニズムを提供します。いくつかのクラスを継承し、適切な方法で登録する限り、SSAS で独自のアルゴリズムを使用できます。 以下では、いくつかの記事を使用して、例を通して SSAS アルゴリズム プラグインを開発する方法を紹介します。この記事で紹介するアルゴリズム プラグインの開発方法は、マネージ コードに基づいており、C# で開発されています (アルゴリズム プラグインは C++ でも開発でき、SQLSERVER2005 の場合は C++ バージョンのコード スタブが付属しています)。全体のプロセスは 6 つのステップで構成されます。開発を始める前に、準備作業を行う必要があります。それは、C++ で記述された COM コンポーネント DMPluginWrapper をダウンロードすることです (この記事に添付されている添付ファイルをダウンロードすることで入手できます)。これは、SSAS とアルゴリズム プラグインの間の中間層として機能し、SSAS とアルゴリズム プラグイン間のやり取りを処理するだけでなく、SSAS からアルゴリズム プラグインへのパラメーターと、アルゴリズム プラグインから SSAS への処理結果をカプセル化するために使用されます。 DMPluginWrapper、SSAS、アルゴリズム プラグインの関係は、次の図で説明できます。 図 1: DMPluginWrapper、SSAS、アルゴリズム プラグインの関係 アルゴリズムを拡張するためのプロジェクトの作成を始めましょう。 まず、新しいクラス ライブラリ プロジェクト (AlgorithmPlugin という名前) を作成し、新しく作成された AlgorithmPlugin クラス ライブラリ プロジェクトに DMPluginWrapper プロジェクトを参照します。クラス ライブラリ プロジェクトをアセンブリ署名して、GAC に登録できるようにすることができます。さらに、DMPluginWrapper のビルド後スクリプトを追加して、アセンブリを GAC に登録します。参照スクリプトは次のとおりです (マシンの特定の設定によって異なります)。 "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" $(ターゲットパス) "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /u $(ターゲット名) "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /if $(TargetPath)
|
スクリプトの最初の行が正しく実行できない場合、アルゴリズム プラグインは SQLSERVER 分析サーバーによって認識されません。スクリプトの他の 2 行は、アルゴリズム アセンブリを GAC に登録します。 次のいくつかの手順は、主に、AlgorithmMetadataBase クラス、AlgorithmBase クラス、ICaseProcessor インターフェイス、および AlgorithmNavigationBase クラスを含むいくつかの基本クラスを継承することです。まず、AlgorithmPlugin に新しいクラス ファイルを作成し、Metadata という名前を付け、このクラスに ComVisible、MiningAlgorithmClass (typeof (Algorithm))、および Guid 属性 (Algorithm は以下で作成するアルゴリズム クラス) を追加し、Guid 属性に GUID コードを指定します。このクラスは AlgorithmMetadataBase クラスから継承する必要があります。今必要なのは、基本クラスのメソッドをオーバーライドすることだけです。オーバーライドする必要があるすべてのメソッドは次のとおりです (実装を簡素化するために表に記述されています)。 メソッド名 実装(参考) 備考
サービス名の取得 「MyFirstAlgorithmPlugin」を返す このメソッドの戻り値にはスペース文字を含めることはできません。
サービスの説明を取得する 「サンプルアルゴリズムプラグイン」を返します。
サービスタイプの取得 PlugInServiceType.ServiceTypeその他;
ビューアタイプの取得 文字列を返す。空
スケーリングを取得 MiningScaling.Medium を返します。 |
アルゴリズムが適用されるスケールを指定するために使用されます。この値はサーバーでは使用されませんが、アルゴリズムに関する関連情報をユーザーに提供するためにモデル行セットに表示されます。 トレーニングの複雑さ MiningTrainingComplexity.Low を返す アルゴリズムのトレーニングに適用可能な複雑さを指定するために使用されます。この値はサーバーでは使用されませんが、アルゴリズムに関する関連情報をユーザーに提供するためにパターン行セットに表示されます。 予測の複雑さを取得する MiningPredictionComplexity.Low を返す 予測の複雑さを指定するために使用されます。この値はサーバーでは使用されませんが、アルゴリズムに関する関連情報をユーザーに提供するためにモデル行セットに表示されます。 サポートDMディメンションの取得 戻り値は false です。
GetSupportsDrillThrough false を返します。 このアルゴリズムがドリルスルー機能をサポートするかどうかを指定します。
ドリルスルーに子供を含める false を返します。
ケースIDモデルを取得 false を返します。
マージナル要件を取得する MarginalRequirements.AllStatsを返す
パラメータコレクションの取得 null を返します。 アルゴリズム パラメータ。この記事の例にはパラメータがないため、空が返されます。
取得SupInputContentTypes MiningColumnContent[] arInputContentTypes = 新しい MiningColumnContent[]
{
マイニング列コンテンツ.離散、
マイニング列コンテンツ.継続的、
MiningColumnContent.離散化、
MiningColumnContent.ネストされたテーブル、
マイニング列コンテンツ.キー
};
arInputContentTypes を返します。 連続、離散など、アルゴリズムでサポートされる入力属性のデータ型を指定します。
GetSupPredictコンテンツタイプ MiningColumnContent[] arPredictContentTypes = 新しい MiningColumnContent[]
{
マイニング列コンテンツ.離散、
マイニング列コンテンツ.連続、
MiningColumnContent.離散化、
MiningColumnContent.ネストされたテーブル、
マイニング列コンテンツ.キー
};
arPredictContentTypes を返します。 前の方法と同様に、ここでは予測属性でサポートされるデータ型を指定します。
サポートされる標準関数を取得する サポートされている関数[] arFuncs
= 新しいサポート関数[] {
サポートされる関数.予測サポート、
サポートされる関数.予測ヒストグラム、
サポートされる関数.予測確率、
サポートされる関数.予測調整確率、
サポートされる関数.予測関連付け、
サポートされる関数.PredictStdDev、
サポートされる関数.予測分散、
サポートされる関数.RangeMax、
サポートされる関数.RangeMid、
サポートされる関数.範囲最小値、
サポートされる関数.DAdjustedProbability、
サポートされる関数.DProbability、
サポートされる関数.DStdDev、
サポートされる機能.Dサポート、
サポートされる関数.DVariance、
// コンテンツ関連の関数
サポートされる関数。
サポートされる関数.予測ノードID、
サポートされる関数.IsInNode、
サポートされている関数.DNodeId、
};
arFuncs を返します。 DMX でサポートされる機能を指定します。
アルゴリズムの作成 新しいアルゴリズム() を返します。 アルゴリズム インスタンスを返します。アルゴリズムは次に作成されるクラスです。
次に、2 番目のクラスを作成し、Algorithm.cs という名前を付けます。このクラスは、AlgorithmBase を継承し、ICaseProcesses インターフェイスを実装する必要があります。これはアルゴリズムを実装するための最も重要なクラスであり、主要なアルゴリズム処理はこのクラスで実行されます。このクラスにはメンバー変数 TaskProgressNotification trainingProgress が必要です。このクラスには、アルゴリズムの主な処理ロジックが含まれています。やり方は次のとおりです: メソッド名:
//サンプルを処理する
挿入ケース
リファレンス実装:
コード //すべてのサンプルを走査し、100 サンプルごとに処理の進行状況を更新します。 トレーニングの進行状況 = this.Model.CreateTaskNotification();
// 現在の処理の進行状況を 0 に設定する トレーニング進捗状況.Current = 0;
// サンプルの合計数を取得します。 トレーニング進捗状況合計 = (int)this.MarginalStats.GetTotalCasesCount();
// 追跡プロンプト情報のフォーマット文字列を設定する trainingProgress.Format = "処理中のケース: {1} 件中 {0} 件";
// 処理を開始 トレーニングの進行状況を開始します。 ブール成功 = false; 試す { caseSet.StartCases(これ); 成功 = true; } ついに { トレーニングの進行状況.End(成功); }
メソッド名: ProcessCase
リファレンス実装:
コード // 処理が中断されていないことを確認します。 this.Context.CheckCancelled();
// 現在の進行状況の値を更新します トレーニングの進捗状況。
(ケースID % 100 == 0)の場合
{
トレーニングの進捗状況。
}
//TODO: ここで実際のモデルトレーニング処理ロジックを実行します
メソッド名: SaveContent
リファレンス実装:
コード //処理結果を保存するためのカスタムタグコンテンツを作成します(構造はXMLに似ています)。MyPersistenceTagはカスタム列挙型です
writer.OpenScope((PersistItemTag)MyPersistenceTag.ShellAlgorithmContent); ライター。SetValue(System.DateTime.Now); writer.SetAttribute((PersistItemTag)MyPersistenceTag.NumberOfCases, this.MarginalStats.GetTotalCasesCount()); ライター.CloseScope();
メソッド名: LoadContent
リファレンス実装:
コード //カスタム タグを開きます (SaveContent メソッドに対応) reader.OpenScope((PersistItemTag)MyPersistenceTag.ShellAlgorithmContent);
//読み取り処理時間
System.DateTime 処理時間; reader.GetValue(処理時間の出力);
// 処理されたサンプルの数を取得します uint ケース数 = 0;
reader.GetAttribute((PersistItemTag)MyPersistenceTag.NumberOfCases, 出力 numberCases); リーダー.CloseScope();
メソッド名: 予測
リファレンス実装:
コード 属性グループ targetAttributes = predictionResult.OutputAttributes; ターゲット属性をリセットします。 uint nAtt = AttributeSet.Unspecified;
//各ターゲット属性について、トレーニングセットから予測結果をコピーします (targetAttributes.Next(nAtt から出力)) の間 { //現在のターゲット属性の予測結果を保存するAttributeStatisticsオブジェクトを作成します AttributeStatistics 結果 = 新しい AttributeStatistics();
//予測結果のターゲット属性、つまり現在の予測結果がどの入力属性であるかを設定します 結果.Attribute = nAtt;
// 現在の属性の確率統計、つまりモデルトレーニングを通じて得られた限界統計確率を取得します。 属性統計のトレーニング統計 = this.MarginalStats.GetAttributeStats(nAtt);
//残りのデータを結果オブジェクトにコピーします 結果.調整済み確率 = トレーニング統計.調整済み確率; 結果の最大値 = トレーニング統計の最大値; 結果.Min = トレーニング統計.Min; 結果の確率 = trainingStats.確率; 結果.Support = trainingStats.Support;
//ステータス統計を結果オブジェクトにコピーします if (予測結果.統計情報を含む) { ( int nIndex = 0; nIndex < trainingStats.StateStatistics.Count; nIndex++) の場合 { ブールbAddThisState = true;
// 値が欠落している場合は、必要な場合にのみ結果に含めます。 (trainingStats.StateStatistics[0].Value.IsMissing)の場合 { bAddThisState = predictionResult.IncludeMissingState; }
if (bAddThisState) { 結果.StateStatistics.Add() トレーニング統計情報。状態統計情報[(uint)nIndex]); } } }
//予測にコンテンツノードが必要な場合は、コンテンツノードに一意の番号を設定する必要があります if (予測結果.ノードIDを含む) { 結果.NodeId = "000"; } 予測結果を追加します。
メソッド名: GetNavigator
リファレンス実装:
コード //AlgorithmNavigatorは以下に作成されるクラスです 新しい AlgorithmNavigator(this, forDMDimensionContent) を返します。
次に実装するのは、AlgorithmNavigationBase から継承する AlgorithmNavigator クラスです。このクラスは主に、アルゴリズム処理結果のすべてのノードの情報を表示するために使用されます。このクラスには、Algorithm 型の algorithm、bool 型の forDMDimension、int 型の currentNode という 3 つのメンバー変数があります。このクラスが実装するメソッドは次のとおりです。
メソッド名 (コンストラクタ): AlgorithmNavigator
リファレンス実装:
コード this.algorithm = 現在のアルゴリズム; this.forDMDimension = dmDimension; this.currentNode = 0;
メソッド名 成し遂げる 述べる
次のツリーに移動 false を返します。
現在のノードIDを取得する 現在のノードを返します。
ノードIDの検証 戻り値 (nodeId == 0);
ノードの位置 if (!ValidateNodeId(nodeId))
false を返します。
現在のノード = ノードID;
true を返します。
一意の名前からノード ID を取得する int nNode = Convert.ToInt32(ノードの一意の名前);
nNode を返します。
ノードIDから一意の名前を取得する nodeId.ToString("D3") を返します。 ノード番号を3桁の形式で出力します
親の数を取得する 0を返します。
親ノードIDを取得する 0を返します。
子供のカウントを取得する 0を返す
子ノードIDを取得する -1 を返します。
ノードタイプの取得 NodeType.Model を返します。
ノードの一意の名前を取得する GetUniqueNameFromNodeId(currentNode) を返します。
ノード属性を取得する null を返します。
メソッド名:
//このメソッドはノードを記述する数値特性を返します
ダブルノードプロパティを取得する
リファレンス実装:
コード ダブルdRet = 0; ダブルdTotalSupport = lgorithm.MarginalStats.GetTotalCasesCount(); ダブルdNodeSupport = 0.0; dNodeSupport = dTotalSupport; スイッチ (プロパティ) { //ノードのサポート NodeProperty.Supportの場合: dRet = dNodeSupport; 壊す; NodeProperty.Scoreの場合: dRet = 0; 壊す; //ノード確率 ケース NodeProperty.Probability: dRet = dNodeSupport / dTotalSupport; 壊す; //ノードのエッジ確率 ケース NodeProperty.MarginalProbability: dRet = dNodeSupport / dTotalSupport; 壊す; } dRet を返します。
メソッド名:
//ノードの文字列表現を取得する
文字列ノードプロパティを取得する
リファレンス実装:
コード 文字列 strRet = ""; スイッチ (プロパティ) { NodeProperty.Captionの場合: { strRet = algorithm.Model.FindNodeCaption(GetNodeUniqueName()); (strRet.Length == 0)の場合 { strRet = "すべて"; } } 壊す;
NodeProperty.ConditionXmlの場合: strRet = ""; 壊す;
ケース NodeProperty.Description: strRet = "すべてのケース"; 壊す;
NodeProperty.ModelColumnNameの場合: strRet = ""; 壊す;
NodeProperty.RuleXmlの場合: strRet = ""; 壊す;
NodeProperty.ShortCaptionの場合: strRet = "すべて"; 壊す; } strRet を返します。
メソッド名:
//ノードの分布を取得する
ノード配布の取得
リファレンス実装:
コード int attStats = (int)algorithm.AttributeSet.GetAttributeCount(); AttributeStatistics[] marginalStats = 新しい AttributeStatistics[attStats]; (uint nIndex = 0; nIndex < attStats; nIndex++) の場合 { marginalStats[nIndex] = algorithm.MarginalStats.GetAttributeStats(nIndex); } marginalStats を返します。
実装する必要のあるすべてのクラスを実装したので、最後にアルゴリズム プラグインを分析サーバーにデプロイします。コードを完了したら、分析サーバーがプラグインを読み込むことができるように、アセンブリを GAC に登録する必要があります。次のコードは、DMPluginWrapper を GAC に読み込むスクリプトです。この記事の冒頭で Visual Studio でビルド後スクリプトを正しく設定している場合は、次のスクリプト コードは機能が同じなのでスキップできます。
// DMPluginWrapper.dll を GAC に登録します "%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /u DMPluginWrapper
"%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /if DMPluginWrapper.dll // AlgorithmPluging.dll を GAC に登録し、アセンブリを REGASM 経由でレジストリに登録して、COM 呼び出しに使用できるようにします。 "%WINDIR%\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" アルゴリズムプラグイン.dll
"%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /u アルゴリズムプラグイン
"%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /if AlgorithmPlugin.dll |
上記のパスはマシンの設定と一致する必要があることに注意してください。上記のスクリプトを正常に実行すると、アルゴリズム プラグインがコンピューターに登録されますが、このアルゴリズムを分析サーバーで使用するには、このアルゴリズムを分析サーバーに登録するというタスクがまだ 1 つ残っています。分析サーバーにアルゴリズムを登録する方法は 2 つあります。1 つは、分析サーバーに XMLA コードを送信して登録する方法です。もう 1 つは、SQLSERVER 構成ファイルを変更してアルゴリズム プラグインを登録する方法です。最初の種類について話しましょう: XMLA経由でアルゴリズムプラグインを登録する—— <!--プラグインアルゴリズムを登録するためのテンプレート MyPluginAlgorithmをアルゴリズムのServiceNameに置き換えます。 00000000-0000-0000-0000-0000000000000 をアルゴリズムのGuidに置き換えます デプロイ後、プラグインをロードするためにサーバーを再起動する必要があります。 --><ALTER AllowCreate="true" ObjectExpansion="ObjectProperties" xmlns="<A href="http://schemas.microsoft.com/analysisservices/2003/engine"> "> |
SQLSERVER構成ファイル登録アルゴリズムを変更することにより—— SQLSERVER インストール ディレクトリで MSSQL.2\OLAP\Config\msmdsrv.ini ファイルを見つけます。これは XML 形式のドキュメントです。ドキュメントの内容は次のコードのようになります。 <構成設定> <データマイニング> <アルゴリズム> <!-- ノード内の文字列はアルゴリズム名である必要があります --> <アルゴリズムプラグイン> <!-- アルゴリズムを有効にするかどうか --> <有効>1</有効> <!-- アルゴリズムの GUID (アルゴリズム クラスで指定された GUID) --> <CLSID>00000000-0000-0000-0000-0000000000000</CLSID> </アルゴリズムプラグイン> |
上記の構成情報では、アルゴリズム名は Metadata クラスの GetServiceName メソッドから取得されます。つまり、構成で設定されたアルゴリズム名は、このメソッドの戻り値と同じである必要があります。この時点で、基本的なアルゴリズム プラグイン プログラムが完成します。分析サーバーを再起動すると、マイニング モデルを構築するウィンドウのアルゴリズム ドロップダウン リストに新しいアルゴリズムが表示されます。 アルゴリズム プラグインを確立するプロセス全体の観点から見ると、前後の準備作業と展開に加えて、3 つのクラスの書き換えが主な作業であり、最も重要なクラスはアルゴリズム クラスの書き換えです。他の 2 つのクラスの主な機能は、アルゴリズムのメタデータ情報と結果の説明を提供することです。アルゴリズム クラスでは、アルゴリズムの最も重要な部分であるマイニング モデルのサンプル トレーニングと予測を実装する必要があります。アルゴリズム クラスの ProcessCase メソッドと Predict メソッドを書き換えることが、アルゴリズム プラグインの核心です。アルゴリズムを拡張する方法を理解した後の次のステップは、新しいアルゴリズムを設計するか、すでに完成したアルゴリズムをプラグインに統合することです。 |