将数据拆分为训练集和测试集是评估数据挖掘模型的重要组成部分。 通常,将数据集分隔成训练集和测试集时,大部分数据用于训练,并且部分数据用于测试。 Analysis Services 会随机采样数据,以帮助确保测试和训练集相似。 通过使用类似的数据进行训练和测试,可以最大程度地减少数据差异的影响,并更好地了解模型的特征。
使用训练集处理模型后,可以通过针对测试集进行预测来测试模型。 由于测试集中的数据已包含要预测的属性的已知值,因此可以轻松确定模型的猜测是否正确。
为数据挖掘结构创建测试和训练集
在 SQL Server 2014 中,将原始数据集分隔在挖掘结构的级别。 有关训练和测试数据集的大小以及哪些行属于哪个集的信息随结构一起存储,以及基于该结构的所有模型都可以使用集进行训练和测试。
可以通过以下方式在挖掘结构上定义测试数据集:
创建挖掘结构时,使用数据挖掘向导来划分该结构。
修改数据挖掘设计器的 “挖掘结构 ”选项卡中的结构属性。
使用分析管理对象(AMO)或 XML 数据定义语言(DDL)以编程方式创建和修改结构。
使用数据挖掘向导划分挖掘结构
默认情况下,为挖掘结构定义数据源后,数据挖掘向导会将数据划分为两组:一组包含 70% 的源数据,用于训练模型,一个数据集包含 30% 的源数据,用于测试模型。 之所以选择此默认值,是因为数据挖掘中经常使用 70-30 比率,但使用 Analysis Services,可以更改此比率以满足你的要求。
还可以将向导配置为设置最大训练事例数,也可以组合限制,以允许最大事例百分比达到指定的最大事例数。 当同时指定最大事例百分比和最大事例数时,Analysis Services 会将两个限制中的较小值用作测试集的大小。 例如,如果为测试用例指定 30% 的保留,并且测试用例的最大数目为 1000,则测试集的大小永远不会超过 1000 个事例。 如果要确保测试集的大小保持一致,即使向模型添加了更多的训练数据,这一点也很有用。
如果对不同的挖掘结构使用相同的数据源视图,并且希望确保所有挖掘结构及其模型的数据以大致相同的方式划分,则应指定用于初始化随机采样的种子。 指定值 HoldoutSeed
时,Analysis Services 将使用该值开始采样。 否则,采样使用挖掘结构名称上的哈希算法来创建种子值。
注释
如果使用EXPORT
和IMPORT
语句创建挖掘结构的副本,则新的挖掘结构将具有相同的训练和测试数据集,因为导出过程会创建一个新的 ID,但仍使用相同的名称。 但是,如果两个挖掘结构使用相同的基础数据源,但具有不同的名称,则为每个挖掘结构创建的集将有所不同。
修改结构属性以创建测试数据集
如果创建和处理挖掘结构,然后稍后决定要预留测试数据集,则可以修改挖掘结构的属性。 若要更改数据分区的方式,请编辑以下属性:
资产 | DESCRIPTION |
---|---|
HoldoutMaxCases |
指定要包含在测试集中的最大事例数。 |
HoldoutMaxPercent |
指定要包含在测试集中的案例数,占完整数据集的百分比。 如果没有数据集,需要指定 0。 |
HoldoutSeed |
指定一个整数值作为种子,用于在随机选择分区数据时。 此值不会影响训练集中的样本数量,而是确保分区可以重复使用。 |
如果将测试数据集添加到现有结构,则必须重新处理结构和所有关联的模型。 此外,由于划分源数据会导致模型在不同的数据子集上训练,因此你可能会看到模型的不同结果。
以编程方式指定保留
可以使用 DMX 语句、AMO 或 XML DDL 在挖掘结构上定义测试和训练数据集。 ALTER MINING STRUCTURE 语句不支持使用留出参数。
DMX 在数据挖掘扩展插件(DMX)语言中,CREATE MINING STRUCTURE 语句已扩展为包含 WITH HOLDOUT 子句。
ASSL 可以使用 Analysis Services 脚本语言(ASSL)创建新的挖掘结构,或将测试数据集添加到现有挖掘结构。
AMO 还可以使用 AMO 查看和修改保留数据集。
可以通过查询数据挖掘架构行集来查看有关现有挖掘结构中保留数据集的信息。 可以通过进行 DISCOVER ROWSET 调用来实现这一点,也可以使用 DMX 查询。
检索有关保留数据的信息
默认情况下,缓存有关训练和测试数据集的所有信息,以便可以使用现有数据来训练和测试新模型。 还可以定义要应用于缓存的测试数据的筛选器,以便在数据子集上评估模型。
事例划分为训练和测试数据集的方式取决于配置保留的方式以及提供的数据。 如果要确定用于训练或测试的事例数,或者想要查找有关训练集和测试集中包含的事例的其他详细信息,可以通过创建 DMX 查询来查询模型结构。 例如,以下查询返回模型训练集中使用的事例。
SELECT * from <structure>.CASES WHERE IsTrainingCase()
若要仅检索测试用例,并额外筛选挖掘结构中某个列的测试用例,请使用以下语法:
SELECT * from <structure>.CASES WHERE IsTestCase() AND <structure column name> = '<value>'
保留数据的使用限制
要使用保留集功能,必须将挖掘结构的MiningStructureCacheMode属性设置为默认值
KeepTrainingCases
。 如果将属性ClearAfterProcessing
更改为CacheMode
,然后重新处理挖掘结构,分区将丢失。不能从时序模型中删除数据;因此,不能将源数据分为训练集和测试集。 如果开始创建挖掘结构和模型并选择Microsoft时序算法,则会禁用创建保留数据集的选项。 如果挖掘结构在事例级别或嵌套表级别包含 KEY TIME 列,则也会禁用使用预留数据。
可能会不小心设置抽样数据集,以致使用完整的数据集进行测试,且没有数据保留用于训练。 但是,如果这样做,Analysis Services 将引发错误,以便您可以更正问题。 如果超过 50% 的数据被保留用于测试,Analysis Services 还会在处理结构时发出警告。
在大多数情况下,默认保留值 30 在训练和测试数据之间提供了良好的平衡。 没有简单的方法可以确定数据集应该有多大才能提供足够的训练,也无法简单确定训练集的稀疏程度,同时还能够避免过度拟合。 但是,在生成模型后,可以使用交叉验证来评估特定模型的数据集。
除了上表中列出的属性外,
HoldoutActualSize
AMO 和 XML DDL 中还提供了只读属性。 但是,由于在处理结构后才能准确确定分区的实际大小,因此应在检索属性的值HoldoutActualSize
之前检查模型是否已处理。
相关内容
主题 | 链接 |
---|---|
描述模型上的筛选器如何与训练和测试数据集交互。 | 挖掘模型的筛选器 (Analysis Services - 数据挖掘) |
描述训练和测试数据的使用如何影响交叉验证。 | 交叉验证 (Analysis Services - 数据挖掘) |
提供有关在挖掘结构中使用训练和测试集的编程接口的信息。 |
AMO 概念和对象模型 MiningStructure 元素 (ASSL) |
提供用于创建保留集的 DMX 语法。 | CREATE MINING STRUCTURE (DMX) |
检索有关训练集和测试集中事例的信息。 |
数据挖掘架构行集 查询数据挖掘架构行集 (Analysis Services - 数据挖掘) |