微軟Sql server analysis service數據挖掘技術


最新在一個項目中要求用到微軟SSAS中的數據挖掘功能,雖然以前做項目的時候也經常用到SSAS中的多維數據集 (就是CUBE),但是始終沒有對SSAS中的數據挖掘功能進行過了解。所以借着項目需求這股東風最近了解了下SSAS的數據挖掘,這里先寫一篇博客做一個簡要的歸納。

 

說到數據挖掘,我們首先需要知道SSAS數據挖掘能干什么,為什么需要進行數據挖掘。我們先來看一個例子假設我們數據庫中現在有一張表叫CustomersBoughtCarsSurvey,這張表記錄了公司客戶購買車輛的信息。

CREATE TABLE [dbo].[CustomersBoughtCarsSurvey](
    [CustomerID] [int] IDENTITY(1,1) NOT NULL,--主鍵ID為自增int類型
    [Name] [nvarchar](50) NULL,--客戶姓名
    [Age] [int] NULL,--客戶年齡
    [Sex] [char](1) NULL,--客戶性別
    [Nation] [nvarchar](50) NULL,--客戶所在國家
    [City] [nvarchar](50) NULL,--客戶所在城市
    [YearlySalary] [float] NULL,--客戶年收入
    [BoughtCar] [bit] NULL,--客戶是否購買了汽車
 CONSTRAINT [PK_CustomersBoughtCarsSurvey] PRIMARY KEY CLUSTERED 
(
    [CustomerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

現在這張表里面假如有10000行記錄,其中這10000記錄中[CustomerID],[Name],[Age],[Sex],[Nation],[City],[YearlySalary]這幾列都是有值的,唯獨列[BoughtCar]只有4000行數據有記錄其余6000行都是null值,原因是在表CustomersBoughtCarsSurvey里面有4000個客戶做過了市場調查,所以知道了他們是否購買了汽車,所以這4000個客戶在列[BoughtCar]上是有值的,但是有6000個客戶還沒有做市場調查,所以有6000行數據的[BoughtCar]列都是null。現在我們要做的事情就是通過一個算法來預測這6000個客戶中哪些人在未來是有可能買車的?買車的幾率有多大?

 

那么圍繞上面這個問題,我們來觀察表CustomersBoughtCarsSurvey的結構,我們可以發現其實客戶是否購買汽車可能取決於[Age],[Sex],[Nation],[City],[YearlySalary]這幾列的值,比如年齡很小的人不大可能會買車,男性買車的可能性比女性更大(只是舉個例子沒有其它意思。。。),年收入高的人可能比年收入低的人更有可能買車等。那么簡單來說就是我們現在需要找到一個算法,根據表CustomersBoughtCarsSurvey中每一行[Age],[Sex],[Nation],[City],[YearlySalary]這幾列的值來推斷列[BoughtCar]的值是1還是0,如果是1出現的概率是高還是低?如果推斷出來的某個結果是1而且概率大於80%那么該客戶買車的可能性就是極高的,對於公司來說應該重點關注該客戶。

 

所以現在我們的問題就變成了我們需要一個函數邏輯,根據列[Age],[Sex],[Nation],[City],[YearlySalary]的值來推斷出列[BoughtCar]的結果,用一個數學公式來表達就是

[BoughtCar]=Function([Age],[Sex],[Nation],[City],[YearlySalary])

而在SSAS中的數據挖掘模型就能夠將上面這個公式付諸於實現,上面公式中的Function就是一個函數邏輯,這函數邏輯在SSAS中就是數據挖掘的九大模型算法:

  • Microsoft 決策樹分析算法
  • Microsoft 聚類分析算法
  • Microsoft Naive Bayes 算法
  • Microsoft 時序算法
  • Microsoft 關聯規則分析算法
  • Microsoft 順序分析和聚類分析算法
  • Microsoft 神經網絡分析算法
  • Microsoft 線性回歸分析算法
  • Microsoft 邏輯回歸分析算法 

這九大模型有位博主做了詳細的介紹,我也正在學習之中,這里推薦下:大數據時代:深入淺出微軟數據挖掘算法系列。 

選定了上面九大模型的某一個挖掘模型,那么下一步要做的就是對挖掘模型進行數據訓練,來提高挖掘模型對數據預測的准確性,通俗來說數據訓練就是讓上面公式中Function函數的邏輯更佳正確,能夠更精准的得出公式等號左邊[BoughtCar]的值。在本文的例子中我們前面說過表CustomersBoughtCarsSurvey中有4000行數據的列[BoughtCar]是有值的,這4000行數據就是參加做過市場調研的客戶,我們要通過這4000行數據來做數據訓練,提高數據挖掘模型算法的精度,然后來預測剩下6000行數據中列[BoughtCar]的值。

 

數據訓練的過程大致是這樣的,將訓練數據分為兩部分,第一部分的數據拿出來尋找規律得出一個算法,然后根據這個算法去計算另一部分數據的值,然后和真實值進行比較,得出算法的准確性如何。在我們的例子中就是將表CustomersBoughtCarsSurvey中4000行[BoughtCar]有值的數據拿出來做數據訓練,將4000行中30%的數據作為第一部分數據拿來做邏輯分析得出算法,然后將得出的算法去計算4000行數據中剩下70%數據的[BoughtCar]的值,然后和真實值進行比較,得出准確率,如果准確率可以接受我們的挖掘模型就構造完成了,我們可以將表CustomersBoughtCarsSurvey中那6000行[BoughtCar]沒有值的數據通過挖掘模型去得出[BoughtCar]的值。如果准確率太低無法接受,那說明4000行數據去做數據訓練還是不夠,需要公司市場調研部去調研更多客戶准備更多[BoughtCar]列有值的數據去做數據訓練,或者從九大模型中選擇其它的挖掘模型看預測的准確率是否能夠提高。這個過程可以用下面這張圖來表示。

 

 

了解了數據訓練的概念之后,我們來看看怎么在SSAS中怎么建立數據挖掘結構和挖掘模型,在SSAS中數據挖掘結構是挖掘模型的容器,挖掘結構定義了挖掘模型要用到哪些數據列,一個挖掘結構可以包含多個挖掘模型。下圖演示了如何在SSAS中建立挖掘結構。

建立挖掘結構的時候可以順便建立一個挖掘模型,下圖中我們在建立挖掘結構的同時建了一個決策樹算法的挖掘模型。

然后我們要選擇的是挖掘結構要用到哪些表,一個挖掘結構要選擇一張事例表(下圖中case列),如果一張事例表的列無法滿足挖掘結構的需求,還可以選擇若干個和事例表相關聯的表作為嵌套表(下圖中Nested列)。本例中我們就只選擇了一張事例表CustomersBoughtCarsSurvey(注意下圖選取的表中的數據會用來做數據訓練,而前面我們說了我們做數據訓練的數據應該是那4000行[BoughtCar]列有值的數據,所以實際上最好的做法是在數據庫中新建一個視圖篩選出[BoughtCar]列有值的數據行,然后在下圖中選擇該視圖作為事例表,但是本例中我們為了簡單起見就直接選用CustomersBoughtCarsSurvey表為挖掘結構的事例表了)。

接着我們要為剛才選擇的決策樹模型定義輸入列和預測列,在挖掘模型中至少要選擇一列作為鍵值列,鍵值列唯一標示挖掘模型中的一行數據就像數據庫表中的主鍵一樣,本例中我們的鍵值列是CustomerID(下圖中Key列)。然后輸入列相當於就是我們前面提到公式中函數Function的參數,所以我們選擇了[Age],[Sex],[Nation],[City],[YearlySalary]作為輸入列(下圖中Input列),預測列就是我們上面公式中等號左邊的返回值,所以我們選擇了列BoughtCar作為預測列(下圖中Predictable列)。當然一個列既可以是輸入列,也可以是預測列,這樣的情況就相當於是一個數據需要傳入一個函數進行數據加工后作為返回值,所以這種情況數據既是輸入列又是預測列。

然后我們要選擇需要用多少數據來做算法分析,就相當於在前面數據訓練部分中提到的需要拿一部分數據得出挖掘模型的算法,前面我們提到了在4000行[BoughtCar]列有值的數據中的30%來得出挖掘模型算法,所以下圖中我們配置了測試數據比例為30%(30%也是默認值)。

最后我們為定義的挖掘結構和挖掘模型起一個名字,整個定義過就結束了。

建立好挖掘結構后我們可以將其部署到SSAS服務器上,然后查看當前挖掘模型的算法的准確率,下圖中我們本例建立的挖掘模型的准確率只有16.67%非常低,一個重要的原因就是我們用於數據訓練的數據量太少了。增加數據訓練的數據量后這個數字會有明顯改善。

最后我們可以在建立的挖掘模型上調用DMX語句做數據預測,下圖中我們使用圖形化設計器來構造數據預測查詢,左邊的結構是挖掘模型列,右邊的表結構表示的是我們要預測的數據行(相當於是我們本文前面提到的6000行[BoughtCar]列無值的數據行)。中間的連線表示的是挖掘模型的輸入列和預測數據結構列的映射關系,通過這個映射關系可以將預測數據的數據列傳入挖掘模型的輸入列得出預測列的值,我們可以手動編輯這個映射關系。

當然我們也可以不使用設計器自己手動寫DMX語句做查詢

最后我們可以通過查詢得到三行列[Bought Car]值本來為null的數據行,通過挖掘模型計算出來預測值:

 

友情提醒:如果挖掘結構的基礎表中沒有數據,數據挖掘在處理的時候會報錯

請注意,如果你在SSAS中定義的挖掘結構基礎表無數據,比如本例中如果數據庫表CustomersBoughtCarsSurvey中有0行數據,那么挖掘結構Customers Bought Cars Survey在處理的時候會報如下錯誤:

錯誤 (數據挖掘): “Customers Bought Cars Survey”對象中沒有事例。鑽取存儲區是空的,這可能是因為 ProcessType 枚舉設置為 ProcessClearStructureOnly,也可能是因為 DMX DELETE 語句已清除該存儲區。

原因就是挖掘結構的基礎表CustomersBoughtCarsSurvey中沒有數據,目前還沒有在SSAS中找到相關設置能夠讓挖掘結構基礎表無數據時處理不報錯,這是微軟SSAS一個很蛋疼的設定。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM