本文是對英文原文SQL Server Data Mining Managed Plug-In Algorithms Tutorial的部分翻譯及整理,主要是描述SSAS數據挖掘算法的基本擴展方法和開發過程。本文的內容只是原文的一部分,如果想了解更多信息可以下載原文。英文原文在本文附件中下載。
SSAS為我們提供了九種數據挖掘算法,但是在應用中我們需要根據實際問題設計適當的算法,這個時候就需要擴展SSAS,使它能應用更多的算法,SSAS有比較好的可擴展性,它提供了一個完整的機制來進行擴展,只要繼承一些類並按適當的方法進行注冊就可以在SSAS中使用自己的算法了。下面我將通過實例分別用幾篇文章來介紹一下如何開發SSAS算法插件。本文介紹的算法插件開發方法是基於托管代碼的,是用C#開發的(算法插件也可以用C++開發,並且SQLSERVER2005的案例中附帶C++版本的代碼stub)。整個過程大至為六個步驟。在開始開發之前需要做一些准備工作,就是要去下載一個用C++編寫的COM組件,叫DMPluginWrapper(可以通過下載本文附帶的附件獲得),它作為SSAS與算法插件的中間層,用於處理SSAS與算法插件之間的交互以及封裝從SSAS到算法插件的參數和從算法插件到SSAS的處理結果。DMPluginWrapper、SSAS和算法插件之間的關系可以由下圖來描述。
圖表 1: DMPluginWrapper、SSAS和算法插件之間的關系
下面開始創建算法擴展的項目。
首先新建一個類庫項目(名為AlgorithmPlugin)將剛才的DMPluginWrapper項目引用到新建的這個AlgorithmPlugin類庫項目中。你可以選擇為這個類庫項目進行程序集簽名,這樣就可以將其注冊到GAC中。另外還要為DMPluginWrapper添加後生成腳本將程序集注冊到GAC,參考腳本如下(根據機器具體設置而定):
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" $(TargetPath)
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /u $(TargetName)
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /if $(TargetPath)
如果第一行腳本不能正確運行的話,算法插件是不能被SQLSERVER分析服務器識別的。另外兩行腳本就是將算法程序集注冊到GAC。
接下來的幾個步驟主要是繼承一些基類的工作,包括AlgorithmMetadataBase類、AlgorithmBase類和ICaseProcessor接口和AlgorithmNavigationBase類。首先在AlgorithmPlugin中新建一個類文件並命名為Metadata,為這個類添加ComVisible、MiningAlgorithmClass(typeof(Algorithm))和Guid屬性(Algorithm是下面要創建的算法類),並為Guid屬性指定一個GUID編碼。這個類要繼承於AlgorithmMetadataBase類。現在要做的事情就是覆蓋基類的方法。下面是所有需要覆蓋的方法(對於較簡單的實現寫在表格中):
方法名
實現(參考)
備注
GetServiceName
return "MyFirstAlgorithmPlugin"
這個方法的返回值中不能帶有空格字符
GetServiceDescription
return "Sample Algorithm Plugin";
GetServiceType
PlugInServiceType.ServiceTypeOther;
GetViewerType
return string.Empty
GetScaling
return MiningScaling.Medium;
用於指定算法適用的規模,這個值不會被服務器使用而是顯示在模式行集中,為用戶提供算法的一些相關信息。
GetTrainingComplexity
return MiningTrainingComplexity.Low
用於指定算法訓練適用的復雜度,這個值不會被服務器使用而是顯示在模式行集中,為用戶提供算法的一些相關信息。
GetPredictionComplexity
return MiningPredictionComplexity.Low
用於指定預測復雜度,這個值不會被服務器使用而是顯示在模式行集中,為用戶提供算法的一些相關信息。
GetSupportsDMDimensions
retrun false;
GetSupportsDrillThrough
return false;
指定這個算法是否支持鑽透功能。
GetDrillThroughMustIncludeChildren
return false;
GetCaseIdModeled
return false;
GetMarginalRequirements
return MarginalRequirements.AllStats
GetParametersCollection
return null;
算法參數,因為本文中的例子沒有參數,所以這裡返回空。
GetSupInputContentTypes
MiningColumnContent[] arInputContentTypes = new MiningColumnContent[]
指定算法所支持的輸入屬性的數據類型,如連續型、離散型等。
GetSupPredictContentTypes
{
MiningColumnContent.Discrete,
MiningColumnContent.Continuous,
MiningColumnContent.Discretized,
MiningColumnContent.NestedTable,
MiningColumnContent.Key
};
return arInputContentTypes;MiningColumnContent[] arPredictContentTypes = new MiningColumnContent[]
與上一個方法類似,這裡是指定預測屬性所支持的數據類型。
GetSupportedStandardFunctions
{
MiningColumnContent.Discrete,
MiningColumnContent.Continuous,
MiningColumnContent.Discretized,
MiningColumnContent.NestedTable,
MiningColumnContent.Key
};
return arPredictContentTypes;SupportedFunction[] arFuncs
指定DMX所支持的函數。
CreateAlgorithm
= new SupportedFunction[] {
SupportedFunction.PredictSupport,
SupportedFunction.PredictHistogram,
SupportedFunction.PredictProbability,
SupportedFunction.PredictAdjustedProbability,
SupportedFunction.PredictAssociation,
SupportedFunction.PredictStdDev,
SupportedFunction.PredictVariance,
SupportedFunction.RangeMax,
SupportedFunction.RangeMid,
SupportedFunction.RangeMin,
SupportedFunction.DAdjustedProbability,
SupportedFunction.DProbability,
SupportedFunction.DStdDev,
SupportedFunction.DSupport,
SupportedFunction.DVariance,
// content-related functions
SupportedFunction.IsDescendent,
SupportedFunction.PredictNodeId,
SupportedFunction.IsInNode,
SupportedFunction.DNodeId,
};
return arFuncs;return new Algorithm();
返回算法實例,Algorithm是接下來要創建的類。