下一步需要选择为预测年收入所需要用到的OLAP多维数据集中的那部分数据。选中Customers维、Customers维中所有的层及Name层中Member属性下的所有层,如图2所示(这些都是缺省的设置)。需要注意的是,Yearly Income既是输入也是输出,这是因为我们正在训练挖掘模型。为训练挖掘模型,算法需要正确的答案。(如:现有用户的实际年收入)
(图2)
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)点击Next按钮,创建一个OLAP维和一个虚拟多维数据集。对话框设置按图3所示。挖掘向导模式将根据Sales多维数据集创建一个虚拟多维数据集,增加一个名为PredictIncome的新数据挖掘维, 点击Next后,为建立挖掘模型起个名字并决定是否立刻执行。我们将建立的挖掘模型命名为IncomModel, 点击Save按钮并立刻执行。当点击Finish按钮后,分析服务将对数据进行处理,并在挖掘模型编辑器中显示挖掘的结果。
图4显示的就是OLAP挖掘模式编辑器,中间的窗口显示了结果决策树的几个结点(图5显示的是一棵完整的决策树)图4右上方标题为Content Navigator(内容导航员)窗口用颜色表示数据密度,用图形的方式描述了整棵决策树,其中颜色越深就代表用户越多。在中间的窗口,我选择了一个结点Customers.Name.Member Card = Normal,该结点代表所有成员属性会员卡的值为Normal的用户。中间靠右的窗口显示了该类别中用户不同年份年收入的条形图。我们发现他们中的83%的人的收入介于10000美元至30000美元之间,这就意味着会员卡值为normal可以很好地预测这一收入水平的用户。(我们对这一结论不应该感到意外,因为Member Cards属性是挖掘模型通过挖掘年收入和教育水平而创建的。)
不使用分析管理器分析多维数据集
现在假设你从客户端应用程序分析Trained Income多维数据集,不具有OLAP管理员权限来运行分析管理器(Analysis Manager),就可以用下面的多维表达查询(MDX)来得到相同的条形图信息,查询将返回每一个收入水平符合Member Card = Normal条件的用户编号。查询首先创建一个持有普通成员卡的用户的集合(CustMembers),然后创建新的方法来统计符合当前所选收入水平的用户有多少。
WITH SET [CustMembers] as 'Filter([Customers].[Name].Members, not IsEmpty([Customers].CurrentMember))' MEMBER [Measures].[Cust Count] as 'Count( Filter( [CustMembers], [Customers].CurrentMember.Properties("Yearly Income") =[Yearly Income].CurrentMember.Name))' SELECT { [Measures].[Cust Count] } ON COLUMNS ,[Yearly Income].[All Yearly Income].Children ON ROWS FROM [TrainedIncome] WHERE ([PredictIncome].[All].[Customers.Name.Member Card = Normal] )
在客户端创建挖掘模型
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)尝试不同的挖掘模型,从其中找到效果最好的。尽管目前的客户端应用程序还不支持这一功能,但用户希望在客户机端,而不是在服务器端创建挖掘模型。客户分析程序需要支持这项功能,可以利用MDX扩展通过OLE DB for OLAP或ADO MD来创建挖掘模型。在客户机端创建挖掘模型需要运行SQL Server企业版,因为该功能依赖于企业版的自定义累积功能。
用数据挖掘维创建虚拟数据集需要三个步骤。第一,创建挖掘模型。下面的命令生成一个挖掘决策树来根据用户的性别、婚姻和教育状况预测年收入。
CREATE OLAP MINING MODEL [Local Find Salary] FROM [Sales] ( CASE DIMENSION [Customers] LEVEL [Name] PROPERTY [Gender] , PROPERTY [Marital Status] , PROPERTY [Education] , PROPERTY [Yearly Income] PREDICT ) USING Microsoft_Decision_Trees
注意调用数据集名字的FROM语句和引出Customers维Name层的成员属性的每个PROPERTY关健字。运行上面的命令后,就会得到一个空的挖掘模型,它对你的分析服务(Analysis Services)连接是唯一的,也会与其它工作站共享。(要创建共享的挖掘模型,需要用分析管理器或DSO编程接口)。下面的命令是将Sales多维数据集中的数据送入挖掘模型。这是一个简单的指定了挖掘模型名字的INSERT INTO语句:
INSERT INTO [Local Find Salary]
最后,将根据挖掘模型、其它维以及从源多维数据集中引用的度创建一个虚拟多维数据集。下面是创建多维数据集的代码:
CREATE SESSION VIRTUAL CUBE [PredictIncomeCube] FROM [Sales] ( MEASURE [Sales].[Unit Sales] , DIMENSION [Sales].[Customers], DIMENSION [Sales].[Time], DIMENSION [PredictIncome] NOT_RELATED_TO_FACTS FROM [Local Find Salary] COLUMN [Customers.Name.Yearly Income] )
在这一语句中,我仅仅使用了Unit Sales度、Customers和Time维。最后一个维━━PredictIncome是作为CREATE VIRTUAL CUBE语句的一部分而创建的。NOT_RELATED_TO_FACTS关键字让分析服务(Analysis Services)知道该维不是由同多维数据集相关的表得来的,FROM和COLUMN子句进一步说明了在创建虚拟多维数据集时使用了挖掘模型和挖掘模型的预测实体。
下面是用Visual Basic编写的用来演示上述的命令运行的一小段程序:
Const sGUID_SCHEMA_SERVICE_PARAMETERS As String = "{3ADD8A75-D8B9-11D2-8D2A-00E029154FDE}" Const sGUID_SCHEMA_MINING_SERVICES As String = "{3ADD8A95-D8B9-11D2-8D2A-00E029154FDE}" Const sGUID_SCHEMA_MINING_MODELS As String = "{3ADD8A77-D8B9-11D2-8D2A-00E029154FDE}" Const sGUID_SCHEMA_MINING_COLUMNS As String = "{3ADD8A78-D8B9-11D2-8D2A-00E029154FDE}" Const sGUID_SCHEMA_MODEL_CONTENT As String = "{3ADD8A76-D8B9-11D2-8D2A-00E029154FDE}" Const sGUID_SCHEMA_MODEL_CONTENT_PMML As String = "{4290B2D5-0E9C-4AA7-9369-98C95CFD9D13}" Dim m_conn As New ADODB.Connection Private Sub ExecuteMDX(ByVal v_sMDX As String) On Error GoTo ErrHandler Dim cmd As New ADODB.Command Dim rec As Recordset Dim nNum As Integer Set cmd.ActiveConnection = m_conn cmd.CommandText = v_sMDX Set rec = cmd.Execute(nNum) MsgBox "Command Executed Successfully. " & nNum & " rows affected.", vbOKOnly + vbInformation Exit Sub ErrHandler: MsgBox Err.Description, vbExclamation End Sub Private Sub Form_Load() ' Specify .2 on the provider so only SQL 2000 will work ' Connect to a server on the local PC. Change this if you are connecting ' to another PC with Analysis Services. Call m_conn.Open("PROVIDER=MSOLAP.2;Data Source=LOCALHOST;") ' Create the mining model Call ExecuteMDX( _"CREATE OLAP MINING MODEL [Local Find Salary] " & _ "From [Sales] " & "( " & " CASE " & _ " Dimension [Customers] " & _ " Level [Name] " & _ " PROPERTY [Gender] ," & _ " PROPERTY [Marital Status] ," & _ " PROPERTY [Education] ," & _ " PROPERTY [Yearly Income] PREDICT " & _ ")" & _ "USING Microsoft_Decision_Trees") ' Fill the mining model Call ExecuteMDX("INSERT INTO [Local Find Salary]") ' Create a virtual cube based on the mining model Call ExecuteMDX( _ "CREATE SESSION VIRTUAL CUBE [PredictIncomeCube] " & _ "FROM [Sales] " & _ "( " & _ " MEASURE [Sales].[Unit Sales] , " & _ " DIMENSION [Sales].[Customers], " & _ " DIMENSION [Sales].[Time], " & _ " DIMENSION [PredictIncome] NOT_RELATED_TO_FACTS " & _ " FROM [Local Find Salary] " & _ " COLUMN [Customers.Name.Yearly Income] " & _ ") ") Dim recCols As Recordset Dim vtRestrict As Variant vtRestrict = Array(Empty, Empty, "Local Find Salary") ' open the data mining model's content as a rowset Set recCols = m_conn.OpenSchema(adSchemaProviderSpecific, vtRestrict, sGUID_SCHEMA_MODEL_CONTENT) ' display each node caption of the resulting decision tree Do While Not recCols.EOF MsgBox recCols.Fields("NODE_CAPTION").Value recCols.MoveNext Loop m_conn.Close End Sub