培训
聚类分析模型查询示例
适用于:SQL Server 2019 及更早版本的 Analysis Services
Azure Analysis Services
Fabric/Power BI Premium
重要
数据挖掘在 SQL Server 2017 Analysis Services 中已弃用,现在在 SQL Server 2022 Analysis Services 中已停止使用。 对于已弃用和停止使用的功能,文档不会更新。 若要了解详细信息,请参阅 Analysis Services 后向兼容性。
依据数据挖掘模型创建查询时,可以检索有关模型的元数据,或者创建内容查询以提供有关分析时发现的模式的详细信息。 或者,可以创建预测查询,以使用模型中的模式来对新数据进行预测。 每一类查询都提供不同的信息。 例如,内容查询可能提供有关发现的分类的更多详细信息,而预测查询可能指出新数据点最有可能属于哪个分类。
本部分介绍如何为基于 Microsoft 聚类分析算法的模型创建查询。
内容查询
预测查询
所有挖掘模型都公开算法根据标准化架构(即挖掘模型架构行集)学习的内容。 可以使用数据挖掘扩展插件 (DMX) 语句来针对挖掘模型架构行集创建查询。 在 2017 SQL Server中,还可以将架构行集直接查询为系统表。
下面的查询返回您在基本数据挖掘教程中创建的聚类分析模型 TM_Clustering
的基本元数据。 聚类分析模型的父节点中可用的元数据包括模型的名称、存储模型的数据库以及模型中的子节点数目。 此查询使用 DMX 内容查询从模型的父节点中检索元数据:
SELECT MODEL_CATALOG, MODEL_NAME, NODE_CAPTION,
NODE_SUPPORT, [CHILDREN_CARDINALITY], NODE_DESCRIPTION
FROM TM_Clustering.CONTENT
WHERE NODE_TYPE = 1
备注
必须将列名 CHILDREN_CARDINALITY 括在括号中,以便将它与同名的多维表达式 (MDX) 保留关键字区分开来。
示例结果:
行 | 元数据 |
---|---|
MODEL_CATALOG | TM_Clustering |
MODEL_NAME | Adventure Works DW |
NODE_CAPTION | 群集模型 |
NODE_SUPPORT | 12939 |
CHILDREN_CARDINALITY | 10 |
NODE_DESCRIPTION | 全部 |
有关这些列在聚类分析模型中的含义的定义,请参阅用于聚类分析模型的挖掘模型内容 (Analysis Services - 数据挖掘) 。
通过查询数据挖掘架构行集,可以找到在 DMX 内容查询中返回的相同信息。 但是,架构行集还提供一些额外的列。 这包括创建模型时使用的参数、上次处理模型的日期和时间以及模型的所有者。
下面的示例返回创建、修改和上次处理模型的日期,以及用于生成模型的聚类分析参数和定型集的大小。 这些信息对于模型的归档或者确定使用了哪些聚类分析选项来创建现有模型很有用。
SELECT MODEL_NAME, DATE_CREATED, LAST_PROCESSED, PREDICTION_ENTITY, MINING_PARAMETERS
from $system.DMSCHEMA_MINING_MODELS
WHERE MODEL_NAME = 'TM_Clustering'
示例结果:
行 | 元数据 |
---|---|
MODEL_NAME | TM_Clustering |
DATE_CREATED | 10/12/2007 7:42:51 PM |
LAST_PROCESSED | 10/12/2007 8:09:54 PM |
PREDICTION_ENTITY | Bike Buyer |
MINING_PARAMETERS | CLUSTER_COUNT=10, CLUSTER_SEED=0, CLUSTERING_METHOD=1, MAXIMUM_INPUT_ATTRIBUTES=255, MAXIMUM_STATES=100, MINIMUM_SUPPORT=1, MODELLING_CARDINALITY=10, SAMPLE_SIZE=50000, STOPPING_TOLERANCE=10 |
聚类分析模型中最有用的内容查询通常返回与使用 “分类查看器”可浏览的信息同类的信息。 这包括分类配置文件、分类特征以及分类对比。 本节提供检索这些信息的查询示例。
因为所有分类的节点类型都为 5,所以通过仅仅查询该类型的节点的模型内容可轻松地检索分类的列表。 您还可以筛选按概率或支持所返回的节点,如下例所示。
SELECT NODE_NAME, NODE_CAPTION ,NODE_SUPPORT, NODE_DESCRIPTION
FROM TM_Clustering.CONTENT
WHERE NODE_TYPE = 5 AND NODE_SUPPORT > 1000
示例结果:
行 | 元数据 |
---|---|
NODE_NAME | 002 |
NODE_CAPTION | Cluster 2 |
NODE_SUPPORT | 1649 |
NODE_DESCRIPTION | 英语教育=研究生学位,32 <=年龄 <=48,拥有的数量汽车=0,35964.0771121808 <=年收入 <=97407.7163 393957 ,英语职业=专业,通勤距离=2-5英里,区域=北美,自行车购买者=1,家庭儿童数=0,拥有汽车数=1,通勤Distance=0-1 英里,英语教育=学士,总儿童数=1,家庭儿童数=2,英语职业=熟练手册,婚姻状态=S,总计儿童=0,房主标志=0,性别=F,Total Children=2,Region=Pacific |
定义分类的属性可以在数据挖掘架构行集中的两列找到。
NODE_DESCRIPTION 列包含逗号分隔的属性列表。 请注意,为便于显示,可能对属性列表进行了缩略。
NODE_DISTRIBUTION 列中的嵌套表包含分类的属性的完整列表。 如果您的客户端不支持分层行集,可以通过在 SELECT 列列表前添加 FLATTENED 关键字来返回嵌套表。 有关使用 FLATTENED 关键字 (keyword) 的详细信息,请参阅 SELECT FROM <模型>。内容 (DMX) 。
对于每个分类, “分类查看器” 都显示列出属性及其值的配置文件。 此查看器还显示一个直方图,以显示当模型中完全填充了事例时值的分布。 如果您是在查看器中浏览模型,则可以轻松地将直方图从挖掘图例复制并粘贴到 Excel 或 Word 文档。 您还可以使用查看器的“分类特征”窗格以图形方式比较不同分类的属性。
但是,如果您必须一次获取多个分类的值,则查询模型更容易。 例如,浏览模型时,您可能注意到最上面的两个分类在属性 Number Cars Owned
上存在不同。 因此,您需要提取每个分类的值。
SELECT TOP 2 NODE_NAME,
(SELECT ATTRIBUTE_VALUE, [PROBABILITY] FROM NODE_DISTRIBUTION WHERE ATTRIBUTE_NAME = 'Number Cars Owned')
AS t
FROM [TM_Clustering].CONTENT
WHERE NODE_TYPE = 5
代码的第一行指定您只需要最上面的两个分类。
备注
默认情况下,分类按支持排序。 因此,NODE_SUPPORT 列可以忽略。
代码的第二行添加仅仅从嵌套表列返回某些列的嵌套 Select 语句。 此外,它将嵌套表中的行限定为与目标属性 Number Cars Owned
有关的那些行。 为了简化显示,使用嵌套表的别名。
备注
嵌套表列 PROBABILITY
必须括在括号中,因为它也是保留的 MDX 关键字的名称。
示例结果:
NODE_NAME | T.ATTRIBUTE_VALUE | T.PROBABILITY |
---|---|---|
001 | 2 | 0.829207754 |
001 | 1 | 0.109354156 |
001 | 3 | 0.034481552 |
001 | 4 | 0.013503302 |
001 | 0 | 0.013453236 |
001 | Missing | 0 |
002 | 0 | 0.576980023 |
002 | 1 | 0.406623939 |
002 | 2 | 0.016380082 |
002 | 3 | 1.60E-05 |
002 | 4 | 0 |
002 | Missing | 0 |
作为快捷方式,还可以调用SQL Server Analysis Services用于处理群集的系统存储过程,而不是使用 DMX 编写自己的查询。 下面的示例说明如何使用内部存储过程来返回 ID 为 002 的分类的配置文件。
CALL System.Microsoft.AnalysisServices.System.DataMining.Clustering.GetClusterProfiles('TM_Clustering", '002',0.0005
同样,可以使用系统存储过程来返回特定分类的特征,如下面的示例所示:
CALL System.Microsoft.AnalysisServices.System.DataMining.Clustering.GetClusterCharacteristics('TM_Clustering", '009',0.0005
示例结果:
属性 | 值 | 频率 | 支持 |
---|---|---|---|
Number Children at Home | 0 | 0.999999829076798 | 899 |
区域 | 北美 | 0.999852875241508 | 899 |
Total Children | 0 | 0.993860958572323 | 893 |
备注
数据挖掘系统存储过程供内部使用,Microsoft 保留根据需要更改它们的权利。 如果用于生产,建议您使用 DMX、AMO 或 XMLA 来创建查询。
使用分类查看器的“分类对比”选项卡,可以轻松地将一个分类与另一个分类进行比较,或者将一个分类与其余所有事例(分类的补充)进行比较。
但是,创建查询来返回这些信息很复杂,您可能需要在客户端上进行一些额外的处理来存储临时结果并比较两个或更多查询的结果。 作为一种快捷方式,可以使用系统存储过程。
下面的查询返回一个表,该表指示节点 ID 分别为 009 和 007 的两个分类之间的主对比因子。 具有正值的属性有利于分类 009,而具有负值的属性则有利于分类 007。
CALL System.Microsoft.AnalysisServices.System.DataMining.Clustering.GetClusterDiscrimination('TM_Clustering','009','007',0.0005,true)
示例结果:
属性 | 值 | 分数 |
---|---|---|
区域 | 北美 | 100 |
English Occupation | 技术工人 | 94.9003803898654 |
区域 | 欧洲 | -72.5041051379789 |
English Occupation | 手动 | -69.6503163202722 |
这与当你从第一个下拉列表中选择分类 9,从第二个下拉列表中选择分类 7 时, 分类对比 查看器的图中所显示的信息相同。 若要将分类 9 与其补数进行比较,应在第二个参数中使用空字符串,如下面的示例所示:
CALL System.Microsoft.AnalysisServices.System.DataMining.Clustering.GetClusterDiscrimination('TM_Clustering','009','',0.0005,true)
备注
数据挖掘系统存储过程供内部使用,Microsoft 保留根据需要更改它们的权利。 如果用于生产,建议您使用 DMX、AMO 或 XMLA 来创建查询。
如果对挖掘模型启用了钻取,则可以创建查询来返回有关在模型中使用的事例的详细信息。 此外,如果已在挖掘结构上启用了钻取,则可以使用 StructureColumn (DMX) 函数包括基础结构中的列。
下面的示例返回模型中使用的两列 Age 和 Region,以及模型中未使用的一列 First Name。 此查询仅仅返回归为分类 1 的事例。
SELECT [Age], [Region], StructureColumn('First Name')
FROM [TM_Clustering].CASES
WHERE IsInNode('001')
若要返回属于某个分类的事例,必须知道该分类的 ID。 可以通过在某个查看器中浏览模型来获取分类的 ID。 或者,为便于引用,可以重命名分类,之后,即可使用名称来代替 ID 号。 但要注意的是,在重新处理模型后,您分配给分类的名称将会丢失。
尽管 聚类分析 通常用于描述和理解数据,但 Microsoft 实现还允许你对群集成员身份进行预测,并返回与预测相关的概率。 本节提供关于如何在聚类分析模型上创建预测查询的示例。 您可以通过指定表格格式数据源来针对多个事例进行预测,或者可以通过创建单独查询来一次提供一个新的值。 为清楚起见,本节中的示例均为单独查询。
有关如何使用 DMX 创建预测查询的详细信息,请参阅 数据挖掘查询工具。
如果您创建的聚类分析模型包含可预测的属性,则可以使用该模型来对结果进行预测。 但是,根据您将可预测列设置为 Predict 还是 PredictOnly,模型处理该可预测属性的方式也不同。 如果您将列的用法设置为 Predict,则该属性的值会添加到聚类分析模型,并在完成的模型中显示为属性。 但是,如果将列的用法设置为 PredictOnly,则值不会用于创建分类。 模型完成后,聚类分析算法会基于每个事例所属的分类为 PredictOnly 属性创建新的值。
下面的查询向模型提供一个新事例,在该模型中,有关该事例的唯一信息是年龄和性别。 SELECT 语句指定感兴趣的可预测属性/值对, PredictProbability (DMX) 函数告知具有这些属性的事例具有目标结果的概率。
SELECT
[TM_Clustering].[Bike Buyer], PredictProbability([Bike Buyer],1)
FROM
[TM_Clustering]
NATURAL PREDICTION JOIN
(SELECT 40 AS [Age],
'F' AS [Gender]) AS t
用法设置为 Predict时的结果示例:
Bike Buyer | Expression |
---|---|
1 | 0.592924735740338 |
用法设置为 PredictOnly 且模型重新处理时的结果示例:
Bike Buyer | Expression |
---|---|
1 | 0.55843544003102 |
在本示例中,模型中的区别不是很明显。 但是,有时可能必须检测出值的实际分布与模型所预测的情况之间的区别。 PredictCaseLikelihood (DMX) 函数在此方案中很有用,因为它可告知给定模型的情况的可能性。
PredictCaseLikelihood 函数返回的数是概率,因此总是在 0 和 1 之间,值 .5 表示随机结果。 因此,小于 .5 的分数意味着预测的事例不太可能适用于此模型,而大于 .5 的分数则意味着预测的事例适用于模型的可能性比不适用于模型的可能性大。
例如,下面的查询返回两个值,这两个值指出新示例事例的可能性。 非规范化值表示适用于当前模型的概率。 使用 NORMALIZED 关键字时,此函数返回的可能性分数是用“有模型的概率”除以“没有模型的概率”来得到的。
SELECT
PredictCaseLikelihood(NORMALIZED) AS [NormalizedValue], PredictCaseLikelihood(NONNORMALIZED) AS [NonNormalizedValue]
FROM
[TM_Clustering_PredictOnly]
NATURAL PREDICTION JOIN
(SELECT 40 AS [Age],
'F' AS [Gender]) AS t
示例结果:
NormalizedValue | NonNormalizedValue |
---|---|
5.56438372679893E-11 | 8.65459953145182E-68 |
请注意这些结果中的数是用科学记数法来表示的。
此示例使用 Cluster (DMX) 函数返回新案例最有可能所属的群集,并使用 ClusterProbability (DMX) 函数返回该群集中成员身份的概率。
SELECT Cluster(), ClusterProbability()
FROM
[TM_Clustering]
NATURAL PREDICTION JOIN
(SELECT 40 AS [Age],
'F' AS [Gender],
'S' AS [Marital Status]) AS t
示例结果:
$CLUSTER | Expression |
---|---|
Cluster 2 | 0.397918596951617 |
注意 默认情况下, ClusterProbability 函数返回最可能分类的概率。 但是,您可以通过使用语法 ClusterProbability('cluster name')
来指定另一分类。 如果这样做,请注意每个预测函数的结果都独立于其他结果。 因此,第二列中的概率分数可能引用另一个分类,而不是第一列中所指定的分类。
在上一个示例中,概率分数不是非常高。 若要确定是否有更好的分类,可以使用 PredictHistogram (DMX) 函数与 Cluster (DMX) 函数一起使用,以返回包含所有可能分类的嵌套表,以及属于每个分类的新事例的概率。 FLATTENED 关键字用于将分层行集改为平面表,以便于查看。
SELECT FLATTENED PredictHistogram(Cluster())
From
[TM_Clustering]
NATURAL PREDICTION JOIN
(SELECT 40 AS [Age],
'F' AS [Gender],
'S' AS [Marital Status])
Expression.$CLUSTER | Expression.$DISTANCE | Expression.$PROBABILITY |
---|---|---|
Cluster 2 | 0.602081403048383 | 0.397918596951617 |
分类 10 | 0.719691686785675 | 0.280308313214325 |
分类 4 | 0.867772590378791 | 0.132227409621209 |
分类 5 | 0.931039872200985 | 0.0689601277990149 |
分类 3 | 0.942359230072167 | 0.0576407699278328 |
分类 6 | 0.958973668972756 | 0.0410263310272437 |
分类 7 | 0.979081275926724 | 0.0209187240732763 |
分类 1 | 0.999169044818624 | 0.000830955181376364 |
分类 9 | 0.999831227795894 | 0.000168772204105754 |
群集 8 | 1 | 0 |
默认情况下,结果按概率进行排序。 结果指出,尽管分类 2 的概率非常低,分类 2 仍然最适合于新数据点。
注意 额外的一列 $DISTANCE
表示从数据点到分类的距离。 默认情况下,Microsoft 聚类分析算法使用可缩放的 EM 聚类分析,它将多个群集分配给每个数据点,并对可能的群集进行排名。 但是,如果您使用 K-means 算法来创建聚类分析模型,则只能为每个数据点分配一个分类,并且此查询仅仅返回一行。 若要解释 PredictCaseLikelihood (DMX) 函数的结果,必须了解这些差异。 有关 EM 与 K-means 聚类分析之间的区别的详细信息,请参阅 Microsoft 聚类分析算法技术参考。
所有 Microsoft 算法都支持一组通用函数。 但是,使用 Microsoft 聚类分析算法生成的模型支持下表中列出的其他函数。
预测函数 | 使用情况 |
---|---|
Cluster (DMX) | 返回最可能包含输入事例的分类。 |
ClusterDistance (DMX) | 返回输入事例与指定分类之间的距离;如果未指定分类,则返回输入事例与可能性最大的分类之间的距离。 返回输入事例属于指定分类的概率。 |
ClusterProbability (DMX) | 返回输入事例属于指定分类的概率。 |
IsDescendant (DMX) | 确定一个节点是否是模型中另一个节点的子节点。 |
IsInNode (DMX) | 指示指定的节点是否包含当前事例。 |
PredictAdjustedProbability (DMX) | 返回加权的概率。 |
PredictAssociation (DMX) | 预测关联数据集中的成员身份。 |
PredictCaseLikelihood (DMX) | 返回输入事例适合现有模型的可能性。 |
PredictHistogram (DMX) | 返回与当前预测值相关的值的表。 |
PredictNodeId (DMX) | 返回每个事例的 Node_ID。 |
PredictProbability (DMX) | 返回预测值的概率。 |
PredictStdev (DMX) | 返回指定列的预测标准偏差。 |
PredictSupport (DMX) | 返回指定状态的支持值。 |
PredictVariance (DMX) | 返回指定列的方差。 |
有关特定函数的语法,请参阅 DMX (数据挖掘扩展插件) 函数参考。