将数据分区为定型集和测试集(Analysis Services - 数据挖掘)

将数据分为定型集和测试集是评估数据挖掘模型的一个重要部分。通常,将数据集分区为定型集和测试集时,大多数数据用于定型,小部分数据用于测试。Analysis Services 会随机地进行数据抽样,以帮助确保测试分区和定型分区相似。通过使用相似的数据来进行定型和测试,可以最小化数据差异所造成的影响并更好地了解模型的特征。

使用定型集处理模型后,可通过对测试集进行预测来测试该模型。由于测试集内的数据已经包含要预测属性的已知值,因此可以方便地确定模型的预测准确性。

通常,用“提升图”或分类准确性对挖掘模型的预测准确性进行度量。有关提升图和其他准确性图表的详细信息,请参阅模型准确性图表工具(Analysis Services - 数据挖掘)

为数据挖掘结构创建分区

在 SQL Server 2008 中,可以在挖掘结构级别对数据进行分区。有关分区大小以及每个分区中数据的信息将随挖掘结构一起存储,而且所有基于该结构的模型都将分区用于定型和测试。

您可以按以下方式针对挖掘结构定义分区:

  • 在创建挖掘结构时,使用数据挖掘向导对挖掘结构进行分区。

  • 在数据挖掘设计器的**“挖掘结构”**选项卡中修改结构属性。

  • 使用分析管理对象 (AMO) 或 XML 数据定义语言 (DDL) 以编程方式创建和修改结构。

使用数据挖掘向导对挖掘结构进行分区

默认情况下,在为挖掘结构定义了数据源之后,数据挖掘向导会将数据拆分成不同的分区:70 % 的数据用于定型,30 % 的数据用于测试。在数据挖掘中通常使用此比率,但是,在 Analysis Services 中,您可以根据自己的需求更改此比率。

您还可以配置该向导以设置定型事例的最大数量,也可以组合不同的限制来允许事例的最大百分比达到所指定的最大事例数。如果您既指定了事例的最大百分比又指定了事例的最大数量,Analysis Services 会将这两个限制的较小者用作测试集的大小。例如,如果指定测试事例维持在 30% 的比率,测试事例的最大数量为 1000,则测试集的大小决不会超过 1000 个事例。如果您想确保测试集的大小保持一致(即使向模型中添加更多的定型数据也是如此),则这可能非常有用。

如果您在不同的挖掘结构中使用相同的数据源视图,并希望以大体相同的方式对所有挖掘结构及其模型中的数据进行分区,则应当指定用来初始化随机抽样的种子。当您为 HoldoutSeed 指定值时,Analysis Services 将使用该值来开始抽样。否则,抽样功能将根据挖掘结构的名称使用哈希算法来创建种子值。

注意注意

如果您使用 EXPORT 和 IMPORT 语句来创建挖掘结构的副本,则新挖掘结构将具有相同的分区定义,因为导出过程将创建新 ID,但是使用的是相同的名称。不过,如果两个挖掘结构使用相同的基础数据源,但是具有不同的名称,那么,为每个挖掘结构创建的分区将有所不同。

修改结构属性

如果您在创建和处理挖掘结构之后又决定添加一个测试分区,则可以修改挖掘结构的属性。若要更改数据的分区方式,请编辑下列属性:

属性

说明

HoldoutMaxCases

指定要包括在测试集内的最大事例数。

HoldoutMaxPercent

指定测试集内要包括的事例数在整个数据集中所占的百分比。如果没有数据集,则将指定 0。

HoldoutSeed

指定为分区随机选择数据时要用作种子的整数值。此值不影响定型集内的事例数,而是将确保分区能够重复。

如果您在现有的结构中添加或更改分区,则必须重新处理该结构以及所有的关联模型。此外,由于添加分区会导致针对数据的另一个子集为模型定型,因此您可能会在模型中看到不同的结果。

以编程方式指定 HOLDOUT

您可以使用 DMX 语句、AMO 或 XML DDL 来创建分区的数据挖掘结构。

  • DMX 在数据挖掘扩展插件 (DMX) 语言中,CREATE MINING STRUCTURE 语句已扩展为包括 WITH HOLDOUT 子句。有关 CREATE STRUCTURE 语句的语法和示例,请参阅 CREATE MINING STRUCTURE (DMX)

    注意注意

    ALTER MINING STRUCTURE 语句不支持使用维持参数。

  • ASSL 使用 Analysis Services 脚本语言 (ASSL),既可以创建新的分区挖掘结构,又可以向现有的数据挖掘结构中添加分区。有关详细信息,请参阅 MiningStructure 元素 (ASSL)

  • AMO 还可以使用 AMO 来查看和修改分区。有关详细信息,请参阅 AMO 概念和对象模型

可以通过查询数据挖掘架构行集来查看现有挖掘结构中分区的信息。可以通过发出 DISCOVER ROWSET 调用,或者使用 DMX 查询,来查看分区信息。有关详细信息,请参阅数据挖掘架构行集查询数据挖掘架构行集(Analysis Services - 数据挖掘)

使用分区信息

默认情况下,关于定型和测试的所有分区信息都会进行缓存,以便您可以使用现有分区为新模型定型,然后进行测试。还可以定义要应用于所缓存的维持分区的筛选器,以便可以针对数据的子集评估模型。有关详细信息,请参阅为挖掘模型创建筛选器(Analysis Services – 数据挖掘)

事例划分为分区的方式取决于您配置维持分区的方式和所提供的数据。如果要确定每个分区中的事例数,或查找有关定型集和测试集内所包括事例的详细信息,可以通过创建 DMX 查询来查询模型结构。例如,下面的查询将返回模型的定型集内所使用的事例。

SELECT * from <structure>.CASES WHERE IsTrainingCase()

若要仅检索测试事例,并针对挖掘结构中的某一列筛选测试事例,请使用下面的语法:

SELECT * from <structure>.CASES WHERE IsTestCase() AND <structure column name> = '<value>'

维持参数的使用限制

  • 若要使用维持参数,必须将挖掘结构的 MiningStructureCacheMode 属性设置为默认值(即 KeepTrainingCases)。如果您将 CacheMode 属性更改为 ClearAfterProcessing,之后又重新处理挖掘结构,则分区将丢失。

  • 不能针对时序模型使用分区。因此,如果您创建了一个分区,并指定要使用 Microsoft 时序算法来创建模型,则分区功能将处于禁用状态。如果挖掘结构的事例级别或嵌套表级别中包含 KEY TIME 列,分区功能也将处于禁用状态。

  • 您可以按照将整个数据集用于测试而不将任何数据集用于定型的方式来配置分区。但是,Analysis Services 将引发一个错误,以便您可以更正该问题。如果在维持 50 % 以上测试数据的情况下处理挖掘结构,则 Analysis Services 也会向您发出警告。

  • 在多数情况下,默认的维持值 (30) 会在定型数据和测试数据之间提供良好的平衡。不能通过任何一种简单的方法来确定数据集应当多大才能提供足够的定型,或者应当多小才能避免过度拟合。不过,在建立模型后,可以使用交叉验证来评估特定模型的数据集。有关详细信息,请参阅交叉验证(Analysis Services – 数据挖掘)

  • 除了上表中列出的属性以外,AMO 和 XML DDL 表中还提供了一个只读属性:HoldoutActualSize。但是,只有在对结构进行处理之后,才能准确地确定分区的实际大小,因此,您应当在检索 HoldoutActualSize 属性的值之前检查模型是否已经过处理。