第 5 课:执行预测查询

在本课中,你将使用 SELECT 语句的 SELECT FROM <模型> PREDICTION JOIN (DMX) 形式基于第 2 课中创建的决策树模型创建两种不同类型的预测 :将挖掘模型添加到关联挖掘结构。 下面定义了这些预测类型。

单例查询
使用单例查询在进行预测时提供临时值。 例如,可以通过将输入(例如通勤距离、区号或客户的子女人数)传递给查询来确定某个客户是否可能是自行车买家。 单例查询返回一个数值,该数值指示根据这些输入,一个人购买自行车的可能性。

批量查询
使用批处理查询来确定潜在客户表中哪些客户可能会购买自行车。 例如,如果你的营销部门提供了客户和客户属性的列表,则可以使用批处理预测来确定表中可能购买自行车的人员。

SELECT 语句的 SELECT FROM <model> PREDICTION JOIN (DMX) 形式包含三个部分:

  • 结果中返回的挖掘模型列和预测函数的列表。 结果中还可以包含源数据的输入列。

  • 定义用于创建预测的数据的源查询。 例如,在批处理查询中,这可能是客户列表。

  • 挖掘模型中的列与源数据之间的映射。 如果这些名称匹配,则可以使用 NATURAL 语法并省略列映射。

可以使用预测函数进一步增强查询。 预测函数提供其他信息,例如预测发生的概率,并为训练数据集中的预测提供支持。 有关预测函数的详细信息,请参阅函数(DMX)。

本教程中的预测基于 AdventureWorksDW2012 示例数据库中的 ProspectiveBuyer 表。 ProspectiveBuyer 表包含潜在客户及其相关特征的列表。 此表中的客户独立于用于创建决策树挖掘模型的客户。

还可以使用 SQL Server Data Tools (SSDT)中的预测查询生成器创建预测。

课程任务

在本课中,你将执行以下任务:

  • 创建单一实例查询以确定特定客户是否可能购买自行车。

  • 创建一个批处理查询,以确定客户表中列出的客户中,哪些可能购买自行车。

单一实例查询

第一步是在单一实例预测查询中使用SELECT FROM <模型> PREDICTION JOIN(DMX)。 下面是单一实例语句的一般示例:

SELECT <select list> FROM [<mining model name>]   
NATURAL PREDICTION JOIN  
(SELECT '<value>' AS [<column>], ...)  
AS [<input alias>]  

代码的第一行定义查询应返回的挖掘模型中的列,并指定用于生成预测的挖掘模型:

SELECT <select list> FROM [<mining model name>]   

代码的下一行定义用于创建预测的客户的特征:

NATURAL PREDICTION JOIN  
(SELECT '<value>' AS [<column>], ...)  
AS [<input alias>]  
ORDER BY <expression>  

如果指定 NATURAL PREDICTION JOIN,服务器将根据列名将模型中的每个列与输入中的列匹配。 如果列名不匹配,则这些列将被忽略。

创建单例预测查询

  1. 对象资源管理器中,右键单击 Analysis Services 实例,指向 “新建查询”,然后单击 “DMX”。

    查询编辑器打开后,将包含一个新的空白查询。

  2. 将单一实例语句的泛型示例复制到空白查询中。

  3. 替换以下内容:

    <select list>   
    

    替换为:

    [Bike Buyer] AS Buyer, PredictHistogram([Bike Buyer]) AS Statistics  
    

    AS 语句用于给查询返回的列设置别名。 PredictHistogram 函数返回有关预测的统计信息,包括概率和支持。 有关可在预测语句中使用的函数的详细信息,请参阅 Functions (DMX)。

  4. 替换以下内容:

    [<mining model>]   
    

    替换为:

    [Decision Tree]  
    
  5. 替换以下内容:

    (SELECT '<value>' AS [<column name>], ...)  AS t  
    

    替换为:

    (SELECT 35 AS [Age],  
      '5-10 Miles' AS [Commute Distance],  
      '1' AS [House Owner Flag],  
      2 AS [Number Cars Owned],  
      2 AS [Total Children]) AS t  
    

    完整语句现在应如下所示:

    SELECT  
       [Bike Buyer] AS Buyer,  
       PredictHistogram([Bike Buyer]) AS Statistics  
    FROM  
       [Decision Tree]  
    NATURAL PREDICTION JOIN  
    (SELECT 35 AS [Age],  
       '5-10 Miles' AS [Commute Distance],  
       '1' AS [House Owner Flag],  
       2 AS [Number Cars Owned],  
       2 AS [Total Children]) AS t  
    
  6. 在“ 文件 ”菜单上,单击“ 保存 DMXQuery1.dmx As”。

  7. 在“ 另存为 ”对话框中,浏览到相应的文件夹,并命名该文件 Singleton_Query.dmx

  8. 在工具栏上,单击“ 执行 ”按钮。

    该查询返回有关客户是否会购买自行车的预测,并提供该预测的统计信息。

批量查询

下一步是在批预测查询中使用SELECT FROM <模型> PREDICTION JOIN 【DMX】。 下面是批处理语句的一般示例:

SELECT TOP <number> <select list>   
FROM [<mining model name>]  
PREDICTION JOIN  
OPENQUERY([<datasource>],'<SELECT statement>')  
  AS [<input alias>]  
ON <on clause, mapping,>  
WHERE <where clause, boolean expression,>  
ORDER BY <expression>  

与单一实例查询中一样,代码的前两行定义查询返回的挖掘模型中的列,以及用于生成预测的挖掘模型的名称。 TOP <number> 语句指定查询将仅返回数字>或数字<指定的结果。

代码的下一行定义预测所基于的源数据:

OPENQUERY([<datasource>],'<SELECT statement>')  
  AS [<input alias>]  

对于检索源数据的方法,有几个选项,但在本教程中,将使用 OPENQUERY。 有关可用选项的详细信息,请参阅 <源数据查询>

下一行定义挖掘模型中的源列与源数据中的列之间的映射:

ON <column mappings>  

WHERE 子句筛选预测查询返回的结果:

WHERE <where clause, boolean expression,>  

代码的最后一行(可以是可选行)指定按哪一列排序结果。

ORDER BY <expression> [DESC|ASC]  

使用 ORDER BY 与 TOP <number> 语句结合,以筛选返回的结果。 例如,在此预测中,你将返回十大自行车购买者,按预测正确概率排序。 可以使用 [DESC|ASC] 语法,用于控制结果的显示顺序。

创建批量数据预测查询

  1. 对象资源管理器中,右键单击 Analysis Services 实例,指向 “新建查询”,然后单击 “DMX”。

    查询编辑器打开后,将包含一个新的空白查询。

  2. 将批处理语句的泛型示例复制到空白查询中。

  3. 替换以下内容:

    <select list>   
    

    替换为:

    SELECT  
      TOP 10  
      t.[LastName],  
      t.[FirstName],  
      [Decision Tree].[Bike Buyer],  
      PredictProbability([Bike Buyer])  
    

    TOP 10 子句指定查询仅返回前十个结果。 此查询中的 ORDER BY 语句按预测正确概率对结果进行排序,因此将只返回十个最有可能的结果。

  4. 替换以下占位符:

    [<mining model>]   
    

    模型的名称:

    [Decision Tree]  
    
  5. 替换以下通用的 OPENQUERY 语句:

    OPENQUERY([<datasource>],'<SELECT statement>')  
    

    使用引用当前 Adventureworks 数据仓库的语句,例如:

    OPENQUERY([Adventure Works DW 2014],  
      'SELECT  
        [LastName],  
        [FirstName],  
        [MaritalStatus],  
        [Gender],  
        [YearlyIncome],  
        [TotalChildren],  
        [NumberChildrenAtHome],  
        [Education],  
        [Occupation],  
        [HouseOwnerFlag],  
        [NumberCarsOwned]  
      FROM  
        [dbo].[ProspectiveBuyer]  
      ') AS t  
    
  6. 替换以下泛型语法:

    <ON clause, mapping,>   
    WHERE <where clause, boolean expression,>  
    ORDER BY <expression>  
    

    使用此模型和输入数据集所需的列映射:

    [Decision Tree].[Marital Status] = t.[MaritalStatus] AND  
      [Decision Tree].[Gender] = t.[Gender] AND  
      [Decision Tree].[Yearly Income] = t.[YearlyIncome] AND  
      [Decision Tree].[Total Children] = t.[TotalChildren] AND  
      [Decision Tree].[Number Children At Home] = t.[NumberChildrenAtHome] AND  
      [Decision Tree].[Education] = t.[Education] AND  
      [Decision Tree].[Occupation] = t.[Occupation] AND  
      [Decision Tree].[House Owner Flag] = t.[HouseOwnerFlag] AND  
      [Decision Tree].[Number Cars Owned] = t.[NumberCarsOwned]  
    WHERE [Decision Tree].[Bike Buyer] =1  
    ORDER BY PredictProbability([Bike Buyer]) DESC  
    

    指定 DESC 以先列出概率最高的结果。

    完整语句现在应如下所示:

    SELECT  
      TOP 10  
      t.[LastName],  
      t.[FirstName],  
      [Decision Tree].[Bike Buyer],  
      PredictProbability([Bike Buyer])  
    FROM  
      [Decision Tree]  
    PREDICTION JOIN  
      OPENQUERY([Adventure Works DW 2014],  
        'SELECT  
          [LastName],  
          [FirstName],  
          [MaritalStatus],  
          [Gender],  
          [YearlyIncome],  
          [TotalChildren],  
          [NumberChildrenAtHome],  
          [Education],  
          [Occupation],  
          [HouseOwnerFlag],  
          [NumberCarsOwned]  
        FROM  
          [dbo].[ProspectiveBuyer]  
        ') AS t  
    ON  
      [Decision Tree].[Marital Status] = t.[MaritalStatus] AND  
      [Decision Tree].[Gender] = t.[Gender] AND  
      [Decision Tree].[Yearly Income] = t.[YearlyIncome] AND  
      [Decision Tree].[Total Children] = t.[TotalChildren] AND  
      [Decision Tree].[Number Children At Home] = t.[NumberChildrenAtHome] AND  
      [Decision Tree].[Education] = t.[Education] AND  
      [Decision Tree].[Occupation] = t.[Occupation] AND  
      [Decision Tree].[House Owner Flag] = t.[HouseOwnerFlag] AND  
      [Decision Tree].[Number Cars Owned] = t.[NumberCarsOwned]  
    WHERE [Decision Tree].[Bike Buyer] =1  
    ORDER BY PredictProbability([Bike Buyer]) DESC  
    
  7. 在“ 文件 ”菜单上,单击“ 保存 DMXQuery1.dmx As”。

  8. 在“ 另存为 ”对话框中,浏览到相应的文件夹,并命名该文件 Batch_Prediction.dmx

  9. 在工具栏上,单击“ 执行 ”按钮。

    该查询返回一个表,包含客户名称、每位客户是否会购买自行车的预测,以及此预测的概率。

这是 Bike Buyer 教程中的最后一步。 现在,你有一组挖掘模型,可用于探索客户之间的相似之处,并预测潜在客户是否会购买自行车。

若要了解如何在市场篮方案中使用 DMX,请参阅 市场篮 DMX 教程