假如你有一個購物類的網站,那么你如何給你的客戶來推薦產品呢?這個功能在很多電商類網站都有,那么,通過SQL Server Analysis Services的數據挖掘功能,你也可以輕松的來構建類似的功能。
將分為三個部分來演示如何實現這個功能。
- 構建挖掘模型
- 為挖掘模型編寫服務接口
- 開發簡單的前端應用
此篇介紹如何使用SQL Server Analysis Services基於此問題來構建簡單的挖掘模型。
關於數據挖掘,簡單的就是說從海量數據中發現信息的一個過程。如果說商業智能分為三個層次:告訴你發生了什么,為什么會發生,將來會發生什么。那么,數據挖掘絕對算是商業智能中最高的一個層次,告訴你將來會發生什么,也就是預測。而預測的基礎就是根據海量的歷史數據,結合一定的算法,以概率為基礎,告訴你一條新數據某條屬性的趨勢。
數據挖掘的模型很多,貝葉斯,時間序列,關聯規則等都是常用的模型,根據不同的問題特征可以套用不同的模型算法。比如此篇提到的商品推薦,就是典型的適合用關聯規則來解決。在數據挖掘中典型的啤酒和尿布的問題,大體上就是基於這個方法。
創建挖掘模型項目
筆者注:如果你是一個c#或者相關的應用程序開發人員,以下的內容看起來可能會有些陌生,筆者建議此部分跟着文章中介紹的步驟來做就可以,相關細節我會盡量以開發人員的角度去解釋。后面有適合開發人員邏輯的一些介紹可以幫助你更好的理解數據挖掘項目。
打開SQL Server Data Tools,點擊File->New->Project
選擇項目類型:
Analysis Services Multidimensional and Data Mining Models
為項目添加數據源。
如圖,在Solution Explorer中,右鍵單擊Data Sources,選擇New Data Source:
這里用到的數據源是微軟官方示例庫Adventure Works DW 2012,是Data Warehouse的示例庫。
關於如何獲取並且部署這些示例庫,可以參考此篇下面的文章列表。
然后,添加數據源視圖,在Solution Explorer中右鍵Data Source Views,選擇New Data Source View。
在Relational data source中,選擇剛才建立的數據源名稱:
點擊下一步。
這個界面中選擇用到的表。根據微軟官方教程以及示例數據,只選擇vAssocSeqLineItems和vAssocSeqOrders兩個視圖就可以。
如果要用關聯規則來解決問題,那么你的數據就要符合一定的結構。而具體的結構要求就可以參考這兩個視圖。
vAssocSeqOrders是訂單主表,里面記錄了基本的訂單信息,一條訂單一行記錄。
vAssocSeqLineItems是訂單相信信息表,里面記錄了每條訂單里都包含了哪些商品。
兩張表邏輯上通過OrderNumber關聯,我們關注的字段是Model,這里面記錄了商品名稱。
選擇好用到的表之后,可以直接點擊完成結束數據源視圖的設置。
這兩個視圖是沒有邏輯關系的,但這里需要指定一下。
方法就是在數據源視圖里,拖拽vAssocSeqLineItems里的OrderNumber字段到vAssocSeqOrders的OrderNumber字段。完成后可以看到一個從vAssocSeqLineItems視圖指向vAssocSeqOrders的箭頭。
到這里數據源視圖設置完畢。
下面建立基於關聯規則的挖掘模型。在Solution Explorer中,右鍵單擊Mining Structures,選擇New Mining Structure。
第一個界面,使用已經存在的關系數據庫或者數據倉庫,所以直接下一步。
然后在這個界面中指定挖掘結構要采用的挖掘模型。點擊下拉框,選擇Microsoft Association Rules,也就是關聯規則。點下一步。
這里指定數據源視圖,默認選擇剛才建立的就可以,直接點擊下一步。
這一步比較關鍵,理解起來也比較繞。這里主要是要指定事例表和嵌套表。在這里,記錄訂單基本信息的是事例表,而記錄訂單里有哪些產品的表為嵌套表。
在這個模型當中,我們要清楚的是,我們的事例單位,是一條條訂單,而不是訂單里的一個個產品。如果每次在建立模型的過程中無法區分哪個應該是事例表哪個應該是嵌套表的話,那么可以回頭來先想下這個問題。
指定完畢事例表和嵌套表,點擊下一步。
這里指定在分析模型中如何使用這些列。首先指定鍵列為OrderNumber和Model,然后再把Model列指定為輸入列和可預測列。因為這里就是要根據已經選擇的商品來預測客戶將會購買什么商品。
按如圖所示的方法指定完畢后,點擊下一步。
選擇列的類型,這里根據系統自動判斷的類型選擇就可以,直接點擊下一步。
然后這個界面中主要是用來指定測試數據集的多少。默認是30%,也就是在數據中,保留30%的數據來驗證建立好的挖掘模型的正確性。此篇不對其做過詳細的介紹,所以先設置成0,然后直接點擊Finish完成模型設置向導。
可以看到建立好的挖掘結構。
模型建立好了之后,需要將其部署到一個分析服務的實例上去,然后將其處理。
這里直接右鍵點擊Solution Explorer根目錄的項目名稱,然后右鍵菜單中選擇Process。
系統會提示服務器內容已過期,VS的判斷是只要你的Source Code比目標服務器的版本新,那么都會報這個out of date錯誤,即使目標服務器上根本沒有這個庫。所以這里選擇Yes。
第一次 部署可能會彈出這個提示框讓你指定可以方位數據源鏈接的賬戶,這里通常直接敲本地管理員的賬戶就 ok。
出現這個界面,直接點擊Run處理挖掘模型。
然后系統會自動去做很多工作,這里的細節你可以不去關心。(當然在其不報Error的情況下)
處理完成之后,挖掘模型就建立好了。后續的實現商品推薦的功能,就是基於此模型來實現的。
這里再介紹一個概念,叫DMX,也許你從沒聽說過,但你一定知道SQL,簡單的來說SQL就是用來查表得,那么DMX就是用來查數據挖掘模型的。
它跟SQL一樣,也是SELECT FROM的結構。具體的語法信息大家有興趣的可以去參考微軟的SQL Server聯機數據庫。在此篇中,下面會給出一個簡單的DMX查詢,大家只要基本知道它是干什么的就可以了。
DAX示例查詢:
SELECT FLATTENED
PredictAssociation([Association].[v Assoc Seq Line Items],INCLUDE_STATISTICS,3)
FROM
[Association]
NATURAL PREDICTION JOIN
(SELECT (SELECT 'Touring Tire' AS [Model]
) AS [v Assoc Seq Line Items]) AS t
這個語句的大體意思就是,購買了產品Touring Tire的用戶當中,根據歷史信息,還有可能會購買哪些產品。
那么我們來看查詢結果:
Model |
SUPPORT |
PROBABILITY |
ADJUSTEDPROBABILITY |
Touring Tire Tube |
1397 |
0.860385925 |
0.783460119 |
Sport-100 |
6171 |
0.267877412 |
0.489939538 |
Patch kit |
3010 |
0.244040863 |
0.567612365 |
然后我們來簡單解釋下相關列的信息:
SUPPORT-支持度,所處行的項支持度,這里跟傳統的支持度有些不同,這里,比如第一行,指的是有多少個訂單中包含了產品Touring Tire Tube。
在數據倉庫中,我們可以用SQL語句來驗證下這個結果
SELECT COUNT(1)
FROM [AdventureWorksDW2012].[dbo].[vAssocSeqLineItems]
WHERE [Model]='Touring Tire Tube'
返回的結果就是1397。
PROBABILITY-概率
購買Touring Tire的訂單中又包含Touring Tire Tube的個數。再簡單點說就是概率中的P(A|B)的問題了。
那么我們還是來驗證下第一行的計算結果,同時購買Touring Tire Tube和Touring Tire的訂單數量:
SELECT T1.[OrderNumber]
FROM [AdventureWorksDW2012].[dbo].[vAssocSeqLineItems] T1
INNER JOIN
(
SELECT T2.[OrderNumber]
FROM [AdventureWorksDW2012].[dbo].[vAssocSeqLineItems] T2
WHERE T2.[Model]='Touring Tire Tube'
) TZ ON T1.OrderNumber=TZ.OrderNumber
WHERE T1.[Model]='Touring Tire'
我們可以看到查詢返回的結果數量是758行。
然后再計算下訂單中只包含Touring Tire的數量:
SELECT [OrderNumber]
FROM [AdventureWorksDW2012].[dbo].[vAssocSeqLineItems]
WHERE [Model]='Touring Tire'
返回的記錄行數是881行。
用758除以881,得到的數字正好是0.860385925。
這個概率正好反映了這樣一個事實,就是購買Touring Tire的客戶會有很大的可能性購買Touring Tire Tube,所以當客戶購買Touring Tire之后系統自動的向其推薦Touring Tire Tube准沒錯。
也許你已經看出了那條DMX語句的一些門道,當然,有些關鍵字你暫時可以不用去關心,必要的時候可以參考微軟的文檔。那么擴展一下,比如,客戶買了指定的兩樣產品,那么我根據這兩樣已選的產品應該推薦給客戶什么呢?
SELECT FLATTENED
PredictAssociation([Association].[v Assoc Seq Line Items],INCLUDE_STATISTICS,3)
FROM
[Association]
NATURAL PREDICTION JOIN
(SELECT (SELECT 'Touring Tire' AS [Model]
UNION SELECT 'Touring Tire Tube' AS [Model]
) AS [v Assoc Seq Line Items]) AS t
看到熟悉的UNION語句了吧,好吧,相信你不懂DMX的話你也看出這條語句的規律了,這些就夠了,后續文章中將會在c#邏輯代碼中根據這條基本的語句來動態的來拼DMX語句。
以上數據挖掘模型的建立部分到此完畢,這是通常一個商業智能項目中底層架構的基本部分。
后續我再寫兩篇在挖掘模型之上的文章,其中一個是基於這個模型開發service服務接口的,這個接口將方便各個客戶端應用,winform, asp.net或者silverlight等調用。最后一篇將選用一個客戶端程序,構建簡單的界面,調用這個services來實現預測查詢。