最新在一個項目中要求用到微軟SSAS中的數據挖掘功能,雖然之前作項目的時候也常常用到SSAS中的多維數據集 (就是CUBE),可是始終沒有對SSAS中的數據挖掘功能進行過了解。因此藉着項目需求這股東風最近了解了下SSAS的數據挖掘,這裏先寫一篇博客作一個簡要的概括。html
說到數據挖掘,咱們首先須要知道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中就是數據挖掘的九大模型算法:函數
這九大模型有位博主作了詳細的介紹,我也正在學習之中,這裏推薦下:大數據時代:深刻淺出微軟數據挖掘算法系列。 學習
選定了上面九大模型的某一個挖掘模型,那麼下一步要作的就是對挖掘模型進行數據訓練,來提升挖掘模型對數據預測的準確性,通俗來講數據訓練就是讓上面公式中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一個很蛋疼的設定。。。