最新在一个项目中要求用到微软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一个很蛋疼的设定。。。