假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...

解读SQL Server分析服务中的数据挖掘功能

上一篇 / 下一篇  2008-03-09 17:26:36

数据挖掘是SQL Server 2000中最令人激动的新功能之一。我将数据挖掘看作是一个能够自动分析数据以获取相关信息的过 程,数据挖掘可以和任一关系数据库或者OLAP数据源集成使用,但它和OLAP的集成所带来的好处却是极为显著的。因为结构化的数据源使得用户无需再向数 据挖掘算法提供海量信息了。尽管不是什么专家,但我从同事Greg Bernhardt那里学到东西已经足够我来对数据挖掘作一翻解释了,我还希望由此使得分析服务的数据挖掘功能不再神秘并向你展示如何在分析应用中使用数 据挖掘。

  数据挖掘功能

  数据挖掘弥补了分析服务功能中的重要不足之处。微软在SQL Server 7.0中引入了针对特定问题的分析和探测性分析功能。在针对特定问题的分析中,分析器要清楚用户需要回答什么问题并简单地利用OALP引擎获取相关信息。 例如,一个快餐店的经理可能想知道:“最近四个季度,汉堡包的营业额和利润怎么样?”

  在探测性分析中,分析器可能对用户的兴趣有所了解,但不需要回答具体的问题。例如,一个公司可能知道自己的一些零售商店没有利润,但却不知道原 因何在。分析器在一个OLAP多维数据集中通过获取更多的细节资料,进行多维查找,获得最感兴趣的数据,我们称这一过程为数据冲浪。

  数据挖掘同“针对特定问题”的分析和探测性分析都不相同。通过数据挖掘,分析服务可以浏览信息,寻找相关数据并提交数据。数据挖掘可以说是探测性分析的理想搭档。

  SQL Server 2000通过新的API━━OLE DB for Data Mining(OLE DB for DM)实现了数据挖掘的功能,这是一个为方便各种应用程序使用数据挖掘功能而设计的编程接口。通过OLE DB for DM, 微软提供了两种数据挖掘算法(其它软件供应商也可以插入新的算法)。理论上,利用OLE DB for DM开发的分析程序能够使用新发明的算法。

  SQL Sever 2000中包含的两种算法是决策树和群。决策树将信息分类为一个树状结构,可以帮助我们预测数据的某些特性。例如,可以将用户信息(如收入、婚姻状况及受 教育程度)交由决策树算法,对预测该用户是否具有信用风险提供帮助。可以用群集算法寻找数据中的自然分组。例如,可以将所有的用户信息送入群集算法,要求 把所有客户分为三个组。算法可能会找到一个已婚、受教育程度较高而收入偏低的分组,一个单身、高收入的分组和一个受教育程度较低而收入较高的分组。通过进 一步的分析可能个发现每个分组都有一个特定的购物方式。利用这些资料,我们可以进行高效益、针对性强的广告活动。注意第二、三分组并没有完全使用所有的三 项输入的信息,因为对于分组来说,并不是所有的输入信息都很重要。因此,第二组的描述之所以不包括受教育程度是由于分组不是根据教育水平来划分的。

  使用分析服务

  如果进行数据挖掘的对象是OLAP多维数据集而不是关系数据库,就不能直接使用OLE DB for DM,因为分析服务可以通过自己的编程接口来实现数据挖掘功能。在服务器端,可以通过决策支持对象(Decision Support Objects,DSO)使用数据挖掘功能,而在客户机端则可以通过OLE DB for OLAP或ActiveX多维数据对象(ADO MD)使用数据挖掘功能。

  与群集算法相比,我更喜欢决策树算法,因为它可以根据决策树算法进行数据挖掘的结果创建新的“维”,我们可以将这些“维”纳入一个新的虚拟多维数据集,还可以用数据挖掘的结果浏览现有的维。

  创建挖掘模型

  创建挖掘模型,需要打开分析管理器(Analysis Manager),展开左边的树形浏览窗口,打开FoodMart 2000数据库。你将看到挖掘模型文件夹(挖掘模型定义了所挖掘的具体数据和根据该信息所做的预测类型。),右击该文件夹,选择新挖掘模型(New Mining Model)运行挖掘模型向导。该向导首先要求选择是在关系型数据还是在多维数据集中进行数据挖掘。选择Multidimensional后单击Next 按钮。然后选择要挖掘的数据集(在本例中选择Sale数据集)。向导的第三步是选择数据挖掘算法,选择Microsoft Decision Trees(微软的决策树)后单击Next按钮。

ITPUB个人空间jq+Y E&nxLG5^$G

  下一步就该选择数据挖掘容器了(容器是新挖掘多维模型挖掘的数据实体)。选择Customers维和Name层。下一步,选择所作预测的类型。 假设数据挖掘算法有输入输出,本例将用户的相关信息作为输入,年收入作为被预测的实体或输出。年收入是Customer维中Name层的一个成员属性。依 次选择A member property of the case level(容器层的成员属性)―> Yearly Income,如图1 所示。
]/D%g,u'uz Nu0
G;D)y(Pg8X9Ue0

ITPUB个人空间o0UF@te |6?E

下一步需要选择为预测年收入所需要用到的OLAP多维数据集中的那部分数据。选中Customers维、Customers维中所有的层及Name层中 Member属性下的所有层,如图2所示(这些都是缺省的设置)。需要注意的是,Yearly Income既是输入也是输出,这是因为我们正在训练挖掘模型。为训练挖掘模型,算法需要正确的答案。(如:现有用户的实际年收入)ITPUB个人空间huo:[B)ZT

(图2)

ITPUB个人空间5g:uR7RAp0y

  点击Next按钮,创建一个OLAP维和一个虚拟多维数据集。对话框设置按图3所示。挖掘向导模式将根据Sales多维数据集创建一个虚拟多维 数据集,增加一个名为PredictIncome的新数据挖掘维, 点击Next后,为建立挖掘模型起个名字并决定是否立刻执行。我们将建立的挖掘模型命名为IncomModel, 点击Save按钮并立刻执行。当点击Finish按钮后,分析服务将对数据进行处理,并在挖掘模型编辑器中显示挖掘的结果。
X+bKp m0

图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))'ITPUB个人空间+[[3c,^ }~5D[
     MEMBER [Measures].[Cust Count] as 'Count( Filter( [CustMembers],ITPUB个人空间6m/J [H:M_qA+W
   [Customers].CurrentMember.Properties("Yearly Income") =[Yearly Income].CurrentMember.Name))'ITPUB个人空间!i2a v)\N
     SELECT { [Measures].[Cust Count] } ON COLUMNS ,[Yearly Income].[All Yearly Income].Children ON ROWS FROM [TrainedIncome]ITPUB个人空间B:ZlC`o_ Z v
     WHERE ([PredictIncome].[All].[Customers.Name.Member Card = Normal] )

  在客户端创建挖掘模型

  尝试不同的挖掘模型,从其中找到效果最好的。尽管目前的客户端应用程序还不支持这一功能,但用户希望在客户机端,而不是在服务器端创建挖掘模 型。客户分析程序需要支持这项功能,可以利用MDX扩展通过OLE DB for OLAP或ADO MD来创建挖掘模型。在客户机端创建挖掘模型需要运行SQL Server企业版,因为该功能依赖于企业版的自定义累积功能。本文发表于http://bianceng.cn(编程入门)

  用数据挖掘维创建虚拟数据集需要三个步骤。第一,创建挖掘模型。下面的命令生成一个挖掘决策树来根据用户的性别、婚姻和教育状况预测年收入。

      CREATE OLAP MINING MODEL [Local Find Salary]ITPUB个人空间+?/| c(V q0w w
      FROM [Sales]ITPUB个人空间0d2] X*T0w1o'c
       (ITPUB个人空间7bdh"KXe
        CASE
'e)A;o ~+h_k5nAp#i0         DIMENSION [Customers]
~$f _ aC/e0         LEVEL [Name]ITPUB个人空间#sw6\-zz&m4V
         PROPERTY [Gender] ,
i+@U\g0K,]|0         PROPERTY [Marital Status] ,ITPUB个人空间:|0c0c AE*AdG)s
         PROPERTY [Education] ,ITPUB个人空间*^O&A]u8o
         PROPERTY [Yearly Income] PREDICT
3y u'_n#aNc"Cd/\0       )
h5{v"n+[0      USING Microsoft_Decision_Trees

  注意调用数据集名字的FROM语句和引出Customers维Name层的成员属性的每个PROPERTY关健字。运行上面的命令后,就会得到 一个空的挖掘模型,它对你的分析服务(Analysis Services)连接是唯一的,也会与其它工作站共享。(要创建共享的挖掘模型,需要用分析管理器或DSO编程接口)。下面的命令是将Sales多维数 据集中的数据送入挖掘模型。这是一个简单的指定了挖掘模型名字的INSERT INTO语句:

  INSERT INTO [Local Find Salary]

  最后,将根据挖掘模型、其它维以及从源多维数据集中引用的度创建一个虚拟多维数据集。下面是创建多维数据集的代码:

      CREATE SESSION VIRTUAL CUBE [PredictIncomeCube]
f%g"|3],nc0ad6D-W4h$}0      FROM [Sales]ITPUB个人空间C!\$Hy2V2E*gR
       (
)^1oK%Zw0        MEASURE [Sales].[Unit Sales] ,
r Q,BM~ wAQ0        DIMENSION [Sales].[Customers],
'rs J7HM!gJ9q1`8bF3^0        DIMENSION [Sales].[Time],ITPUB个人空间 L]+itI$I f
        DIMENSION [PredictIncome] NOT_RELATED_TO_FACTSITPUB个人空间^m&w!}Kf[S
        FROM [Local Find Salary]ITPUB个人空间m5vT Ya-I
       COLUMN [Customers.Name.Yearly Income]ITPUB个人空间k6wVt'z a
      )

  在这一语句中,我仅仅使用了Unit Sales度、Customers和Time维。最后一个维━━PredictIncome是作为CREATE VIRTUAL CUBE语句的一部分而创建的。NOT_RELATED_TO_FACTS关键字让分析服务(Analysis Services)知道该维不是由同多维数据集相关的表得来的,FROM和COLUMN子句进一步说明了在创建虚拟多维数据集时使用了挖掘模型和挖掘模型 的预测实体。ITPUB个人空间)v"tcpLm
下面是用Visual Basic编写的用来演示上述的命令运行的一小段程序:

      Const sGUID_SCHEMA_SERVICE_PARAMETERS As String = "{3ADD8A75-D8B9-11D2-8D2A-00E029154FDE}"ITPUB个人空间A+L*erf9[`
     Const sGUID_SCHEMA_MINING_SERVICES As String = "{3ADD8A95-D8B9-11D2-8D2A-00E029154FDE}"ITPUB个人空间C4c$XiVk [/a
     Const sGUID_SCHEMA_MINING_MODELS As String = "{3ADD8A77-D8B9-11D2-8D2A-00E029154FDE}"ITPUB个人空间1JL4vhF3?K h~ry
     Const sGUID_SCHEMA_MINING_COLUMNS As String = "{3ADD8A78-D8B9-11D2-8D2A-00E029154FDE}"
zRo k,Ft0     Const sGUID_SCHEMA_MODEL_CONTENT As String = "{3ADD8A76-D8B9-11D2-8D2A-00E029154FDE}"ITPUB个人空间#x(M,T_e)J^5K
     Const sGUID_SCHEMA_MODEL_CONTENT_PMML As String = "{4290B2D5-0E9C-4AA7-9369-98C95CFD9D13}"ITPUB个人空间bE*Yn6l/t@6@(^`
  
*A$j2H8FUXX0     Dim m_conn As New ADODB.ConnectionITPUB个人空间'N9l2kE&C&UzB(A
  
] @F_zM~RCP i0     Private Sub ExecuteMDX(ByVal v_sMDX As String)
i#p2U7|o3Xx#@0      On Error GoTo ErrHandler
8i.F&J?)cz0c0  ITPUB个人空间]H Z Wk7mj Wcb
      Dim cmd As New ADODB.CommandITPUB个人空间#r`&a&g0`pi
      Dim rec As Recordset
r?,XG)lbo N\0      Dim nNum As Integer
R5OzJ^x0  
?9wR_ d!X0      Set cmd.ActiveConnection = m_connITPUB个人空间;I[%tKKC0C!on
      cmd.CommandText = v_sMDX
'V/dS$g;kn0      Set rec = cmd.Execute(nNum)
-g"|8gS*k u!g0  
6e;bJx'lV7u.J^0      MsgBox "Command Executed Successfully. " & nNum & " rows affected.", vbOKOnly + vbInformationITPUB个人空间2Ch*F"S)k$JH]@ bbC
     Exit SubITPUB个人空间ijs??7UG3@E
  ITPUB个人空间W,N7t7h*\Sc2X\
     ErrHandler:ITPUB个人空间,F/c-s6at6Rme
      MsgBox Err.Description, vbExclamation
/c9W$Y)U8` R^8_y/T0     End SubITPUB个人空间0f(u|%Lqu
  ITPUB个人空间&SY\"\`&Zu
     Private Sub Form_Load()ITPUB个人空间w7hE\&{1b
      ' Specify .2 on the provider so only SQL 2000 will work
o K6[ GdQ.G0      ' Connect to a server on the local PC. Change this if you are connecting
8_X8G!~]+cgq0      ' to another PC with Analysis Services.ITPUB个人空间1R#\?ra#TY*uO
      Call m_conn.Open("PROVIDER=MSOLAP.2;Data Source=LOCALHOST;")ITPUB个人空间0Jo8m2M5a#yDLB z+i1c
  
.K)V~#R;Z+g0      ' Create the mining modelITPUB个人空间clR;o2d
      Call ExecuteMDX( _"CREATE OLAP MINING MODEL [Local Find Salary] " & _
7V A3i;@Ij#J0       "From [Sales] " &  "( " & " CASE " & _
D*_{c w7\"t/i0       " Dimension [Customers] " & _
~!l4E&d ?PTt0       " Level [Name] " & _
yVP ]5H!k2|%d\ F&v^:F0       " PROPERTY [Gender] ," & _
K$Du N/R"Y[0       " PROPERTY [Marital Status] ," & _
;U/P'lw+l,@/Wt0       " PROPERTY [Education] ," & _
se%n%MA4io0       " PROPERTY [Yearly Income] PREDICT " & _
0O'L*aK7h4BI#f0       ")" & _ITPUB个人空间ud QB{5B/c?
       "USING Microsoft_Decision_Trees")
Hx1?.fa'f)v0  
-j,F,P$`xT[eZ0       ' Fill the mining modelITPUB个人空间;gh+W g%TIK
       Call ExecuteMDX("INSERT INTO [Local Find Salary]")ITPUB个人空间O&QMI&BJ XC
  ITPUB个人空间tX&[$fOq:@~
       ' Create a virtual cube based on the mining modelITPUB个人空间]Sg_p%aI6Js
       Call ExecuteMDX( _ITPUB个人空间 `q2zj(Ey'Q-}7Y2z R
        "CREATE SESSION VIRTUAL CUBE [PredictIncomeCube] " & _ITPUB个人空间 q2U%Z`Tg8b(U
        "FROM [Sales] " & _ITPUB个人空间&NP:Ng|\ p
        "( " & _
%B:K2P d1J0        " MEASURE [Sales].[Unit Sales] , " & _
6Zsb4p"u/Q8E D0        " DIMENSION [Sales].[Customers], " & _ITPUB个人空间.GDJ2Gs,xNZ#@V
        " DIMENSION [Sales].[Time], " & _ITPUB个人空间#Af'Ga&d"axxT.W }
        " DIMENSION [PredictIncome] NOT_RELATED_TO_FACTS " & _ITPUB个人空间%z.\%|8[+iOx
        " FROM [Local Find Salary] " & _ITPUB个人空间)DtY4k*QW
        " COLUMN [Customers.Name.Yearly Income] " & _ITPUB个人空间-c-zkK]fh2j|#K XC
       ") ")ITPUB个人空间"H U HJ-E:o`
  ITPUB个人空间+DGkW1@x/Sz)V)?
      Dim recCols As RecordsetITPUB个人空间e-P,^3V ? t8Th
      Dim vtRestrict As Variant
j2VR^-WX0  
7Q#nG9aQ h0      vtRestrict = Array(Empty, Empty, "Local Find Salary")
O]@z(o*n0  
J4k'D|1ji i pY})T0      ' open the data mining model's content as a rowset
%G(pJ/nJ A ^u0      Set recCols = m_conn.OpenSchema(adSchemaProviderSpecific, vtRestrict, sGUID_SCHEMA_MODEL_CONTENT)
G8w9U6Ga;C+E0  
O%oHrLJN0      ' display each node caption of the resulting decision treeITPUB个人空间;LsGk5k
      Do While Not recCols.EOFITPUB个人空间$J,jmV"D1L
       MsgBox recCols.Fields("NODE_CAPTION").ValueITPUB个人空间1? o/jqnvf3g3b
       recCols.MoveNextITPUB个人空间G$jrWOV!i-^
      LoopITPUB个人空间"D [ `Z]
  
w&Oj,^2AF?1~t0      m_conn.CloseITPUB个人空间7Uu]B3s9U(ns
     End Sub

  不幸的是你不得不使用这样的程序而不是MDX范例,因为命令的执行必须用到一个返回记录集,而不是在前面讨论的三全命令中使用的标准的多维单元 集,而后打开一个微软专有的图表记录集(我在例程中添加了OpenSchema函数来说明如何获取挖掘模型的内容)。例程仅仅列出了决策树中每一结点的名 称,记录集被组织成象父子维表一样的结构,该记录集的每个记录在决策树中确定一个结点,并具有一个NODE_UNIQUE_NAME和 PARENT_UNIQUE_NAME字段。PARENT_UNIQUE_NAME确定包含当前行的父纪录的记录。

  在例程的开始,是一个包含GUID的列表,可以利用它访问所有和数据挖掘相关的特定提供者的记录集。在上面例程中没有用到它们,但如果你计划开发支持数据挖掘功能的应用程序,不妨试试它们。

  比想象的要简单

  当我第一次看OLE DB for DM的详细说明时,认为要完成一个简单的数据挖掘也需要程序员或应用程序用户提供如此多的信息,以至于怀疑它对于普通决策者是否有用。但通过深入的研究, 我明白了它之所以看起来比较复杂,是因为在挖掘关系数据库需要较多的信息,挖掘OLAP多维数据集则不需要太多的信息。OLAP数据挖掘是简单、快速、有 用的,决策树算法是一种可以帮助我们对大量数据进行结构化处理从而获取有用信息的好方法。


3x QoEh%O0


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-11  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 12302
  • 日志数: 119
  • 建立时间: 2008-02-08
  • 更新时间: 2008-10-01

RSS订阅

Open Toolbar