预测查询 (数据挖掘)

典型的数据挖掘项目的目标是使用挖掘模型进行预测。 例如,你可能希望预测特定服务器群集的预期停机时间量,或生成一个分数,指示客户细分市场是否可能响应广告市场活动。 若要完成所有这些事情,请创建预测查询。

在功能上,SQL Server 支持不同类型的预测查询,具体取决于查询的输入类型:

查询类型 查询选项
单例预测查询 如果要预测单个新案例或多个新案例的结果,请使用单例查询。 可以直接在查询中提供输入值,查询将作为单个会话执行。
批量预测 当您有外部数据需要输入到模型中时,请使用批量预测,以此作为预测的依据。 若要对整个数据集进行预测,请将外部源中的数据映射到模型中的列,然后指定要输出的预测数据类型。

整个数据集的查询在单个会话中执行,这使得此选项比发送多个重复查询更有效。
时序预测 如果要预测一些未来步骤的值,请使用时序查询。 SQL Server 数据挖掘在时序查询中还提供以下功能:

可以通过将新数据添加为查询的一部分来扩展现有模型,并根据复合序列进行预测。

可以使用 REPLACE_MODEL_CASES 选项将现有模型应用到新的数据系列。

可以执行交叉预测。

以下部分介绍了预测查询的一般语法、不同类型的预测查询以及如何处理预测查询的结果。

基本预测查询设计

与查询结果合作

基本预测查询设计

创建预测时,通常会提供一些新数据,并要求模型基于新数据生成预测。

  • 在批处理预测查询中,使用 预测联接将模型映射到外部数据源。

  • 在单例预测查询中,键入一个或多个要用作输入的值。 可以使用单例预测查询创建多个预测。 但是,如果需要创建许多预测,则使用批处理查询时性能会更好。

单个和批量预测查询都使用 PREDICTION JOIN 语法来定义新数据。 区别在于如何指定预测联接的输入端。

  • 在批处理预测查询中,数据来自使用 OPENQUERY 语法指定的外部数据源。

  • 在单例预测查询中,数据被内联作为查询的一部分提供。

对于时序模型,输入数据并不总是必需的;可以仅使用模型中已有的数据进行预测。 但是,如果确实指定了新的输入数据,则必须决定是使用新数据来更新和扩展模型,还是替换模型中使用的原始数据系列。 有关这些选项的详细信息,请参阅 时序模型查询示例

添加预测函数

除了预测值之外,还可以自定义预测查询以返回与预测相关的各种信息。 例如,如果预测创建了要推荐给客户的产品列表,你可能还希望返回每个预测的概率,以便你可以对它们进行排名,并仅向用户提供顶级建议。

为此,请将 预测函数 添加到查询。 每个模型或查询类型都支持特定函数。 例如,聚类分析模型支持特殊的预测函数,这些函数提供有关模型创建的分类的额外详细信息,而时序模型具有计算随时间变化的函数。 还有一般预测函数可用于几乎所有模型类型。 有关不同类型的查询中支持的预测函数的列表,请参阅本主题 DMX 参考:常规预测函数(DMX)。

创建单件预测查询

如果需要实时创建快速预测,单例预测查询颇具实用价值。 一种常见的情况可能是,你从客户那里获取了信息,可能是通过网站上的表单,然后你希望将这些数据作为输入提交给一个单例预测查询。 例如,当客户从列表中选择产品时,可以将该选择用作查询的输入,该查询可预测要推荐的最佳产品。

单例预测查询不需要单独的输入表。 而是提供一行或多行值作为模型的输入,并实时返回预测或预测。

警告

尽管名称如此,单例预测查询不仅仅是进行单个预测,您可以为每个输入集生成多个预测。 可以通过为每个输入事例创建 SELECT 语句并将其与 UNION 运算符组合,从而提供多个输入事例。

创建单一预测查询时,必须以 PREDICTION JOIN 的形式向模型提供新数据。 这意味着,即使未映射到实际表,也必须确保新数据与挖掘模型中的现有列匹配。 如果新的数据列和新数据完全匹配,Analysis Services 将为你映射这些列。 这称为 自然预测联接。 但是,如果列不匹配,或者新数据不包含模型中的相同类型和数据量,则必须指定模型中的哪些列映射到新数据,或指定缺失值。

批处理预测查询

当具有要在进行预测时使用的外部数据时,批处理预测查询非常有用。 例如,你可能已经构建了一个模型,该模型按客户的联机活动和购买历史记录对客户进行分类。 可以将该模型应用于新获取的潜在客户列表、为销售创建预测,或确定建议市场活动的目标。

执行预测联接时,必须将模型列映射到新数据源中的列。 因此,为输入选择的数据源必须与模型中的数据有点相似。 新信息不必完全匹配,并且可能不完整。 例如,假设模型是使用有关收入和年龄的信息训练的,但用于预测的客户列表具有年龄,但与收入无关。 在此方案中,你仍然可以将新数据映射到模型,并为每个客户创建预测。 但是,如果收入是模型的重要预测器,则缺乏完整的信息会影响预测的质量。

若要获得最佳结果,应在新数据和模型之间联接尽可能多的匹配列。 但是,即使没有匹配项,查询也会成功。 如果未联接任何列,查询将返回边际预测,这等效于没有 PREDICTION JOIN 子句的语句 SELECT <predictable-column> FROM <model>

成功映射所有相关列后,运行查询,Analysis Services 会根据模型中的模式对新数据中的每个行进行预测。 可以将结果保存回包含外部数据的数据源视图中的新表,或者如果您使用 SQL Server Data Tools(SSDT)或 SQL Server Management Studio,则复制并粘贴数据。

警告

如果在 SQL Server Data Tools(SSDT)中使用设计器,必须先将外部数据源定义为数据源视图。

如果使用 DMX 创建预测联接,则可以使用 OPENQUERY、OPENROWSET 或 SHAPE 命令指定外部数据源。 DMX 模板中的默认数据访问方法是 OPENQUERY。 有关这些方法的信息,请参阅 <源数据查询>

时序挖掘模型中的预测

时序模型与其他模型类型不同;可以使用模型来创建预测,也可以向模型提供新数据来更新模型,并根据最近的趋势创建预测。 如果添加新数据,则可以指定应使用新数据的方式。

  • 扩展模型事例 意味着将新数据添加到时序模型中的现有数据系列。 因此,预测基于新的组合序列。 如果只想向现有模型添加几个数据点,则此选项是很好的。

    例如,假设你有一个基于上一年的销售数据训练的现有时序模型。 收集几个月的新销售数据后,决定更新当前年份的销售预测。 可以通过添加新数据并扩展模型来创建新的预测联接来更新模型。

  • 替换模型事例 意味着保留已训练的模型,但将基础事例替换为一组新的事例数据。 如果要在模型中保留趋势,但将其应用于另一组数据,此选项非常有用。

    例如,原始模型可能已针对一组销售量非常高的数据进行训练;将基础数据替换为新系列(可能来自销售量较低的商店),则保留趋势,但预测从替换系列中的值开始。

无论使用哪种方法,预测的起点始终是原始序列的结尾。

有关如何对时序模型创建预测联接的详细信息,请参阅时序模型查询示例PredictTimeSeries (DMX)。

处理预测查询的结果

保存数据挖掘预测查询结果的选项因创建查询的方式而异。

  • 在 SQL Server Management Studio 或 SQL Server Data Tools (SSDT)中使用预测查询生成器生成查询时,可以将预测查询的结果保存到现有的 Analysis Services 数据源。 有关详细信息,请参阅 “查看并保存预测查询的结果”。

  • 在 SQL Server Management Studio 的“查询”窗格中使用 DMX 创建预测查询时,可以使用查询输出选项将结果保存到文件,或者将结果窗格保存为文本或在网格中。 有关详细信息,请参阅查询和文本编辑器(SQL Server Management Studio)。

  • 使用 Integration Services 组件运行预测查询时,这些任务提供通过使用可用的 ADO.NET 连接管理器或 OLEDB 连接管理器将结果写入数据库的功能。 有关详细信息,请参阅 数据挖掘查询任务

请务必了解,预测查询的结果与关系数据库上的查询结果不一样,后者始终返回一行相关值。 添加到查询的每个 DMX 预测函数都会返回其自己的行集。 因此,当您对单个实例进行预测时,结果可能是一个预测值,并伴随几列包含其他详细信息的嵌套表。

如果在一个查询中合并多个函数,则返回结果将合并为分层行集。 例如,假设使用时序模型来预测销售金额和销售数量的未来值,请使用如下 DMX 语句这样的查询:

SELECT  
  PredictTimeSeries([Forecasting].[Amount]) as [PredictedAmount]  
, PredictTimeSeries([Forecasting].[Quantity]) as [PredictedQty]  
FROM  
  [Forecasting]  
  

此查询的结果是两列,一列用于每个预测序列,其中每行包含一个包含预测值的嵌套表:

PredictedAmount

$TIME 金额
201101 172067.11
$TIME 金额
201102 363390.68

PredictedQty

$TIME 数量
201101 77
$TIME 数量
201102 260

如果提供程序无法处理分层行集,则可以在预测查询中使用 FLATTEN 关键字平展结果。 有关详细信息,包括平展行集的示例,请参阅 SELECT (DMX)。

另请参阅

内容查询 (数据挖掘)
数据定义查询 (数据挖掘)