假如你有一個購物類的網站,那麼你如何給你的客戶來推薦產品呢?這個功能在很多電商類網站都有,那麼,通過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來實現預測查詢。