解读SQL Server分析服务中的数据挖掘功能.docx
《解读SQL Server分析服务中的数据挖掘功能.docx》由会员分享,可在线阅读,更多相关《解读SQL Server分析服务中的数据挖掘功能.docx(12页珍藏版)》请在冰点文库上搜索。
解读SQLServer分析服务中的数据挖掘功能
解读SQLServer分析服务中的数据挖掘功能
数据挖掘是SQLServer2000中最令人激动的新功能之一。
我将数据挖掘看作是一个能够自动分析数据以获取相关信息的过程,数据挖掘可以和任一关系数据库或者OLAP数据源集成使用,但它和OLAP的集成所带来的好处却是极为显著的。
因为结构化的数据源使得用户无需再向数据挖掘算法提供海量信息了。
尽管不是什么专家,但我从同事GregBernhardt那里学到东西已经足够我来对数据挖掘作一翻解释了,我还希望由此使得分析服务的数据挖掘功能不再神秘并向你展示如何在分析应用中使用数据挖掘。
数据挖掘功能
数据挖掘弥补了分析服务功能中的重要不足之处。
微软在SQLServer7.0中引入了针对特定问题的分析和探测性分析功能。
在针对特定问题的分析中,分析器要清楚用户需要回答什么问题并简单地利用OALP引擎获取相关信息。
例如,一个快餐店的经理可能想知道:
“最近四个季度,汉堡包的营业额和利润怎么样?
”
在探测性分析中,分析器可能对用户的兴趣有所了解,但不需要回答具体的问题。
例如,一个公司可能知道自己的一些零售商店没有利润,但却不知道原因何在。
分析器在一个OLAP多维数据集中通过获取更多的细节资料,进行多维查找,获得最感兴趣的数据,我们称这一过程为数据冲浪。
数据挖掘同“针对特定问题”的分析和探测性分析都不相同。
通过数据挖掘,分析服务可以浏览信息,寻找相关数据并提交数据。
数据挖掘可以说是探测性分析的理想搭档。
SQLServer2000通过新的API━━OLEDBforDataMining(OLEDBforDM)实现了数据挖掘的功能,这是一个为方便各种应用程序使用数据挖掘功能而设计的编程接口。
通过OLEDBforDM,微软提供了两种数据挖掘算法(其它软件供应商也可以插入新的算法)。
理论上,利用OLEDBforDM开发的分析程序能够使用新发明的算法。
SQLSever2000中包含的两种算法是决策树和群。
决策树将信息分类为一个树状结构,可以帮助我们预测数据的某些特性。
例如,可以将用户信息(如收入、婚姻状况及受教育程度)交由决策树算法,对预测该用户是否具有信用风险提供帮助。
可以用群集算法寻找数据中的自然分组。
例如,可以将所有的用户信息送入群集算法,要求把所有客户分为三个组。
算法可能会找到一个已婚、受教育程度较高而收入偏低的分组,一个单身、高收入的分组和一个受教育程度较低而收入较高的分组。
通过进一步的分析可能个发现每个分组都有一个特定的购物方式。
利用这些资料,我们可以进行高效益、针对性强的广告活动。
注意第二、三分组并没有完全使用所有的三项输入的信息,因为对于分组来说,并不是所有的输入信息都很重要。
因此,第二组的描述之所以不包括受教育程度是由于分组不是根据教育水平来划分的。
使用分析服务
如果进行数据挖掘的对象是OLAP多维数据集而不是关系数据库,就不能直接使用OLEDBforDM,因为分析服务可以通过自己的编程接口来实现数据挖掘功能。
在服务器端,可以通过决策支持对象(DecisionSupportObjects,DSO)使用数据挖掘功能,而在客户机端则可以通过OLEDBforOLAP或ActiveX多维数据对象(ADOMD)使用数据挖掘功能。
与群集算法相比,我更喜欢决策树算法,因为它可以根据决策树算法进行数据挖掘的结果创建新的“维”,我们可以将这些“维”纳入一个新的虚拟多维数据集,还可以用数据挖掘的结果浏览现有的维。
创建挖掘模型
创建挖掘模型,需要打开分析管理器(AnalysisManager),展开左边的树形浏览窗口,打开FoodMart2000数据库。
你将看到挖掘模型文件夹(挖掘模型定义了所挖掘的具体数据和根据该信息所做的预测类型。
),右击该文件夹,选择新挖掘模型(NewMiningModel)运行挖掘模型向导。
该向导首先要求选择是在关系型数据还是在多维数据集中进行数据挖掘。
选择Multidimensional后单击Next按钮。
然后选择要挖掘的数据集(在本例中选择Sale数据集)。
向导的第三步是选择数据挖掘算法,选择MicrosoftDecisionTrees(微软的决策树)后单击Next按钮。
y/us/e|et0
下一步就该选择数据挖掘容器了(容器是新挖掘多维模型挖掘的数据实体)。
选择Customers维和Name层。
下一步,选择所作预测的类型。
假设数据挖掘算法有输入输出,本例将用户的相关信息作为输入,年收入作为被预测的实体或输出。
年收入是Customer维中Name层的一个成员属性。
依次选择Amemberpropertyofthecaselevel(容器层的成员属性)―>YearlyIncome,如图1所示。
CO#G8zH1d0
*b$DTU-sTG0
dOF7o$y0
下一步需要选择为预测年收入所需要用到的OLAP多维数据集中的那部分数据。
选中Customers维、Customers维中所有的层及Name层中Member属性下的所有层,如图2所示(这些都是缺省的设置)。
需要注意的是,YearlyIncome既是输入也是输出,这是因为我们正在训练挖掘模型。
为训练挖掘模型,算法需要正确的答案。
(如:
现有用户的实际年收入)
.|FgSoV0
(图2)
N*H?
bBw;F3Wp0
点击Next按钮,创建一个OLAP维和一个虚拟多维数据集。
对话框设置按图3所示。
挖掘向导模式将根据Sales多维数据集创建一个虚拟多维数据集,增加一个名为PredictIncome的新数据挖掘维,点击Next后,为建立挖掘模型起个名字并决定是否立刻执行。
我们将建立的挖掘模型命名为IncomModel,点击Save按钮并立刻执行。
当点击Finish按钮后,分析服务将对数据进行处理,并在挖掘模型编辑器中显示挖掘的结果。
ITPUB个人空间hiFRBxDt
图4显示的就是OLAP挖掘模式编辑器,中间的窗口显示了结果决策树的几个结点(图5显示的是一棵完整的决策树)图4右上方标题为“ContentNavigator”(内容导航员)窗口用颜色表示数据密度,用图形的方式描述了整棵决策树,其中颜色越深就代表用户越多。
在中间的窗口,我选择了一个结点Customers.Name.MemberCard=Normal,该结点代表所有成员属性会员卡的值为Normal的用户。
中间靠右的窗口显示了该类别中用户不同年份年收入的条形图。
我们发现他们中的83%的人的收入介于10000美元至30000美元之间,这就意味着会员卡值为normal可以很好地预测这一收入水平的用户。
(我们对这一结论不应该感到意外,因为MemberCards属性是挖掘模型通过挖掘年收入和教育水平而创建的。
)
不使用分析管理器分析多维数据集
现在假设你从客户端应用程序分析TrainedIncome多维数据集,不具有OLAP管理员权限来运行分析管理器(AnalysisManager),就可以用下面的多维表达查询(MDX)来得到相同的条形图信息,查询将返回每一个收入水平符合“MemberCard=Normal”条件的用户编号。
查询首先创建一个持有普通成员卡的用户的集合(CustMembers),然后创建新的方法来统计符合当前所选收入水平的用户有多少。
WITHSET[CustMembers]as'Filter([Customers].[Name].Members,notIsEmpty([Customers].CurrentMember))'ITPUB个人空间8R:
ydv5F-~G)W*[$p
MEMBER[Measures].[CustCount]as'Count(Filter([CustMembers],
fT1JVh&jj+xY0 [Customers].CurrentMember.Properties("YearlyIncome")=[YearlyIncome].CurrentMember.Name))'ITPUB个人空间9k8EV!
]B3elG9~
SELECT{[Measures].[CustCount]}ONCOLUMNS,[YearlyIncome].[AllYearlyIncome].ChildrenONROWSFROM[TrainedIncome]ITPUB个人空间rd\)OX8j?
WHERE([PredictIncome].[All].[Customers.Name.MemberCard=Normal])
在客户端创建挖掘模型
尝试不同的挖掘模型,从其中找到效果最好的。
尽管目前的客户端应用程序还不支持这一功能,但用户希望在客户机端,而不是在服务器端创建挖掘模型。
客户分析程序需要支持这项功能,可以利用MDX扩展通过OLEDBforOLAP或ADOMD来创建挖掘模型。
在客户机端创建挖掘模型需要运行SQLServer企业版,因为该功能依赖于企业版的自定义累积功能。
本文发表于(编程入门)
用数据挖掘维创建虚拟数据集需要三个步骤。
第一,创建挖掘模型。
下面的命令生成一个挖掘决策树来根据用户的性别、婚姻和教育状况预测年收入。
CREATEOLAPMININGMODEL[LocalFindSalary]
!
`yJJe%E/kO;eV0 FROM[Sales]
9ZH2chq+Xj4Y0 (
fW+`+ir!
z0 CASEITPUB个人空间+\%|[([d9F
DIMENSION[Customers]ITPUB个人空间[G4L^/KG
LEVEL[Name]ITPUB个人空间l)NE1O3KiV;G
PROPERTY[Gender],
RZ^*U0lnaO9fsX0 PROPERTY[MaritalStatus],
b6J2tc&W7m}0 PROPERTY[Education],ITPUB个人空间4By)H/zr&c9e9w
PROPERTY[YearlyIncome]PREDICTITPUB个人空间2e5Zq#i+_5V"^|c:
O
)ITPUB个人空间A%KR:
~7@r8ck
USINGMicrosoft_Decision_Trees
注意调用数据集名字的FROM语句和引出Customers维Name层的成员属性的每个PROPERTY关健字。
运行上面的命令后,就会得到一个空的挖掘模型,它对你的分析服务(AnalysisServices)连接是唯一的,也会与其它工作站共享。
(要创建共享的挖掘模型,需要用分析管理器或DSO编程接口)。
下面的命令是将Sales多维数据集中的数据送入挖掘模型。
这是一个简单的指定了挖掘模型名字的INSERTINTO语句:
INSERTINTO[LocalFindSalary]
最后,将根据挖掘模型、其它维以及从源多维数据集中引用的度创建一个虚拟多维数据集。
下面是创建多维数据集的代码:
CREATESESSIONVIRTUALCUBE[PredictIncomeCube]ITPUB个人空间pRN:
Dhh6S#`d3K
FROM[Sales]
okn%g5vQT:
Ha0 (ITPUB个人空间1\jN-}
a%_4^P
MEASURE[Sales].[UnitSales],
:
WN|4W+R5i0 DIMENSION[Sales].[Customers],ITPUB个人空间K9s(juJ#{ao&C
DIMENSION[Sales].[Time],ITPUB个人空间0{)g0_3zaXb-s#g
DIMENSION[PredictIncome]NOT_RELATED_TO_FACTS
mx}6R7b%u@@0 FROM[LocalFindSalary]ITPUB个人空间LN&h1Dp$u1CzQH|
COLUMN[Customers.Name.YearlyIncome]
)P(S#Cxzb0 )
在这一语句中,我仅仅使用了UnitSales度、Customers和Time维。
最后一个维━━PredictIncome是作为CREATEVIRTUALCUBE语句的一部分而创建的。
NOT_RELATED_TO_FACTS关键字让分析服务(AnalysisServices)知道该维不是由同多维数据集相关的表得来的,FROM和COLUMN子句进一步说明了在创建虚拟多维数据集时使用了挖掘模型和挖掘模型的预测实体。
ITPUB个人空间,r@ga6w
下面是用VisualBasic编写的用来演示上述的命令运行的一小段程序:
ConstsGUID_SCHEMA_SERVICE_PARAMETERSAsString="{3ADD8A75-D8B9-11D2-8D2A-00E029154FDE}"ITPUB个人空间;d5ng$]sD3y(b
ConstsGUID_SCHEMA_MINING_SERVICESAsString="{3ADD8A95-D8B9-11D2-8D2A-00E029154FDE}"
.B6VTpo0 ConstsGUID_SCHEMA_MINING_MODELSAsString="{3ADD8A77-D8B9-11D2-8D2A-00E029154FDE}"
[Ai"f-iw?
`0 ConstsGUID_SCHEMA_MINING_COLUMNSAsString="{3ADD8A78-D8B9-11D2-8D2A-00E029154FDE}"
!
f"f+A,s.W0 ConstsGUID_SCHEMA_MODEL_CONTENTAsString="{3ADD8A76-D8B9-11D2-8D2A-00E029154FDE}"
|_9xF;~bd|0 ConstsGUID_SCHEMA_MODEL_CONTENT_PMMLAsString="{4290B2D5-0E9C-4AA7-9369-98C95CFD9D13}"ITPUB个人空间jpQ,Cet
ITPUB个人空间)K_B4|5mzS!
Y
p
Dimm_connAsNewADODB.Connection
%y2h$C`2b(pa,Ik0
h$V9X&]w,h'P:
y'A0 PrivateSubExecuteMDX(ByValv_sMDXAsString)ITPUB个人空间5j!
}+TLxP+|l
OnErrorGoToErrHandlerITPUB个人空间yF$gov@
ITPUB个人空间7Ge0G-?
'Q9iW2]
DimcmdAsNewADODB.Command
-M%p1b(C?
&UV0 DimrecAsRecordsetITPUB个人空间-U"s#V!
c.E9n2R
DimnNumAsIntegerITPUB个人空间+yRb)cn4C0s
0yt"c*e,_ImV1z(X0 Setcmd.ActiveConnection=m_conn
!
cWD&wqJ0 cmd.CommandText=v_sMDX
rU7VaC"L4Kl0 Setrec=cmd.Execute(nNum)
2j@_.b8a*O3Ks^_-s0
+`!
Tr9o9e0rm0 MsgBox"CommandExecutedSuccessfully."&nNum&"rowsaffected.",vbOKOnly+vbInformationITPUB个人空间'x+lf'HYX
ExitSub
q'I#uZ(}TG'R0
+cs'N2aEL0 ErrHandler:
$b7Mo3R1vc+I`0 MsgBoxErr.Description,vbExclamationITPUB个人空间Q9K3S9Ffo!
|
EndSub
0_I`&Udu-`B.W0 ITPUB个人空间"mq)nQB
PrivateSubForm_Load()
w6^u+UK~}b0 'Specify.2ontheprovidersoonlySQL2000willwork
&P:
Kq{q0 'ConnecttoaserveronthelocalPC.Changethisifyouareconnecting
)}PNw/`pf0 'toanotherPCwithAnalysisServices.ITPUB个人空间|*|v!
Kq]s~
Callm_conn.Open("PROVIDER=MSOLAP.2;DataSource=LOCALHOST;")ITPUB个人空间9V2Dq"^n-O5H_sl
*Kk7?
#b-B}iz0 'Createtheminingmodel
3hoK;|Nxv0 CallExecuteMDX(_"CREATEOLAPMININGMODEL[LocalFindSalary]"&_
*K+X"P]_E&ef0 "From[Sales]"& "("&"CASE"&_ITPUB个人空间_`B;C2]X$Ygs
"Dimension[Customers]"&_ITPUB个人空间rZ`h5oE8t
"Level[Name]"&_
UZP&pAv%_:
d6D3g0 "PROPERTY[Gender],"&_ITPUB个人空间K&CcqW^c^
"PROPERTY[MaritalStatus],"&_ITPUB个人空间%r9~Ec8^.Yn
"PROPERTY[Education],"&_
6j5O%c:
~'c0a0{\(X-T&Z0 "PROPERTY[YearlyIncome]PREDICT"&_
&T,J:
~#hH-v0hW0`jO%[B0 ")"&_
"^3[9~M
V[k2^0 "USINGMicrosoft_Decision_Trees")
|8p(jXm6^`0 ITPUB个人空间'Y\3W7}{$tiuR"I'_M
'FilltheminingmodelITPUB个人空间?
DtJl/v7rS
CallExecuteMDX("INSERTINTO[LocalFindSalary]")
s(z;@H?
W+uRWJ7L0
qi;g!
{UptG(Q9e0 'Createavirtualcubebasedontheminingmodel
F1`R}%I.G|*O0`0 CallExecuteMDX(_ITPUB个人空间2['h'Ve:
q|a/Zs
"CREATESESSIONVIRTUALCUBE[PredictIncomeCube]"&_
OBW4uPna2oI0jh0 "FROM[Sales]"&_
4I4C^)b,Z:
]/e)Ap0 "("&_ITPUB个人空间%iLb'j^qz?
"MEASURE[Sales].[UnitSales],"&_ITPUB个人空间A._%Sb.U*C"ie
"DIMENSION[Sales].[Customers],"&_ITPUB个人空间BnKq(OxVop8^
"DIMENSION[Sales].[Time],"&_ITPUB个人空间Z*kc&T|(TaX;j?
"DIMENSION[PredictIncome]NOT_RELATED_TO_FACTS"&_ITPUB个人空间u?
]{$J(m8Kq
"FROM[LocalFindSalary]"&_
3Z~3U5z_)[{0 "COLUMN[Customers.Name.YearlyIncome]"&_
Mp7Bwe^N0 ")")ITPUB个人空间VS`8`I
ZY*B3W2p%u
P(A,A0n/@]/nhe0 DimrecColsAsRecordset
VRLr_2Q8VB0 DimvtRestrictAsVariantITPUB个人空间%LV?
e'}r:
J#Z
ITPUB个人空间xp{D1_Cy8f.](R
vtRestrict=Array(Empty,Empty,"LocalFindSalary")ITPUB个人空间:
kE2K~_Ql$J
ITPUB个人空间kl6{"y!
v
'openthedataminingmodel'scontentasarowsetITPUB个人空间s\0I)LZ!
KGnC$d$W
SetrecCols=m_conn.OpenSchema(adSchemaProviderSpecific,vtRestrict,sGUID_SCHEMA_MODEL_CONTENT)
'N[(k`M
Cu0
YP5G{8jH\0 'displayeachnodecaptionoftheresultingdecisiontree
-Dv
R-}kR{X;r{0 DoWhileNotrecCols.EOF
J,@`W6z0 MsgBoxrecCols.Fields("NODE_CAPTION").Value
$I~H6[%I0 recCols.MoveNextITPUB个人空间+I0\2l+e%TKf
d#]
LoopITPUB个人空间r{:
]pA/|,oRg
]KE@3d)jB+M0 m_conn.CloseITPUB个人空间\m)`0IX;C
EndSub
不幸的是你不得不使用这样的程序而不是MDX范例,因为命令的执行必须用到一个返回记录集