属性缩放
简介
属性缩放算法是一种实用算法,用于对节点属性进行模型训练预处理,或对 PageRank 分数等算法结果进行后处理。它根据指定的缩放器对节点属性进行缩放。多个属性可以同时缩放,并以列表属性的形式返回。
输入属性必须是数字或数字列表。所有列表必须具有相同的大小。输出属性将始终是一个列表。输出列表的大小等于输入属性长度的总和。也就是说,如果输入属性是两个标量数值属性和一个长度为三的列表属性,则输出列表的总长度将为五。
如果节点缺少某个属性的值,该节点将从该属性的缩放中省略。它将接收 `NaN` 的输出值。这包括列表属性。
属性缩放算法支持多种缩放器。这些可以通过 `scaler` 配置参数进行配置。
列表属性是逐索引缩放的。有关更多详细信息,请参阅列表示例。
在以下方程式中,`p` 表示包含图中所有节点单个属性的所有属性值的向量。
语法
本节介绍在每种执行模式下执行属性缩放算法所使用的语法。我们正在描述具名图的语法变体。要了解有关通用语法变体的更多信息,请参阅语法概述。
CALL gds.scaleProperties.stream(
graphName: String,
configuration: Map
) YIELD
nodeId: Integer,
scaledProperty: List of Float
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤具名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤具名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
运行算法所使用的并发线程数。 |
|
字符串 |
|
是 |
可以提供的 ID,以便更轻松地跟踪算法进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会记录。 |
|
nodeProperties |
字符串列表 |
|
否 |
要缩放的节点属性名称。所有属性名称都必须存在于投影图中。 |
缩放器 |
字符串或映射 |
|
否 |
应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …}`。 |
名称 | 类型 | 描述 |
---|---|---|
nodeId |
整数 |
节点 ID。 |
scaledProperty |
浮点数列表 |
每个输入节点属性的缩放值。 |
CALL gds.scaleProperties.mutate(
graphName: String,
configuration: Map
) YIELD
scalerStatistics: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
postProcessingMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
mutateProperty |
字符串 |
|
否 |
缩放属性将被写入的 GDS 图中的节点属性。 |
字符串列表 |
|
是 |
使用给定的节点标签过滤具名图。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤具名图。 |
|
整数 |
|
是 |
运行算法所使用的并发线程数。 |
|
字符串 |
|
是 |
可以提供的 ID,以便更轻松地跟踪算法进度。 |
|
nodeProperties |
字符串列表 |
|
否 |
要缩放的节点属性名称。所有属性名称都必须存在于投影图中。 |
缩放器 |
字符串或映射 |
|
否 |
应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …}`。 |
名称 | 类型 | 描述 |
---|---|---|
scalerStatistics |
映射 |
由指定缩放器计算的统计数据(如果有)。 |
preProcessingMillis |
整数 |
数据预处理的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
mutateMillis |
整数 |
将属性添加到投影图的毫秒数。 |
postProcessingMillis |
整数 |
未使用。 |
nodePropertiesWritten |
整数 |
写入的节点属性数量。 |
配置 |
映射 |
运行算法所使用的配置。 |
CALL gds.scaleProperties.stats(
graphName: String,
configuration: Map
)
YIELD
scalerStatistics: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤具名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤具名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
运行算法所使用的并发线程数。 |
|
字符串 |
|
是 |
可以提供的 ID,以便更轻松地跟踪算法进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会记录。 |
|
nodeProperties |
字符串列表 |
|
否 |
要缩放的节点属性名称。所有属性名称都必须存在于投影图中。 |
缩放器 |
字符串或映射 |
|
否 |
应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …}`。 |
名称 | 类型 | 描述 |
---|---|---|
scalerStatistics |
映射 |
由指定缩放器计算的统计数据(如果有)。 |
preProcessingMillis |
整数 |
数据预处理的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
未使用。 |
配置 |
映射 |
运行算法所使用的配置。 |
CALL gds.scaleProperties.write(
graphName: String,
configuration: Map
)
YIELD
scalerStatistics: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
writeMillis: Integer,
postProcessingMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤具名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤具名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
运行算法所使用的并发线程数。 |
|
字符串 |
|
是 |
可以提供的 ID,以便更轻松地跟踪算法进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会记录。 |
|
整数 |
|
是 |
用于将结果写入 Neo4j 的并发线程数。 |
|
字符串 |
|
否 |
缩放属性将被写入的 Neo4j 数据库中的节点属性。 |
|
nodeProperties |
字符串列表 |
|
否 |
要缩放的节点属性名称。所有属性名称都必须存在于投影图中。 |
缩放器 |
字符串或映射 |
|
否 |
应用于属性的缩放器名称。支持的值有 `MinMax`、`Max`、`Mean`、`Log`、`Center` 和 `StdScore`,不区分大小写。要应用特定于缩放器的配置,请使用映射语法:`{scaler: 'name', …}`。 |
名称 | 类型 | 描述 |
---|---|---|
scalerStatistics |
映射 |
由指定缩放器计算的统计数据(如果有)。 |
preProcessingMillis |
整数 |
数据预处理的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
writeMillis |
整数 |
将结果写回 Neo4j 的毫秒数。 |
postProcessingMillis |
整数 |
未使用。 |
nodePropertiesWritten |
整数 |
写入的节点属性数量。 |
配置 |
映射 |
运行算法所使用的配置。 |
示例
以下所有示例都应在一个空数据库中运行。 示例通常使用Cypher 投影。原生投影将在未来版本中弃用。 |
本节将展示在具体图上运行属性缩放算法的示例。目的是说明结果如何,并提供在实际环境中如何使用该算法的指南。我们将在一个小型酒店图上进行演示,该图包含少量节点,以特定模式连接。示例图如下所示
CREATE
(:Hotel {avgReview: 4.2, buildYear: 1978, storyCapacity: [32, 32, 0], name: 'East'}),
(:Hotel {avgReview: 8.1, buildYear: 1958, storyCapacity: [18, 20, 0], name: 'Plaza'}),
(:Hotel {avgReview: 19.0, buildYear: 1999, storyCapacity: [100, 100, 70], name: 'Central'}),
(:Hotel {avgReview: -4.12, buildYear: 2005, storyCapacity: [250, 250, 250], name: 'West'}),
(:Hotel {avgReview: 0.01, buildYear: 2020, storyCapacity: [1250, 1250, 900], name: 'Polar'}),
(:Hotel {avgReview: 3.3, buildYear: 1981, storyCapacity: [240, 240, 0], name: 'Beach'}),
(:Hotel {avgReview: 6.7, buildYear: 1984, storyCapacity: [80, 0, 0], name: 'Mountain'}),
(:Hotel {avgReview: -1.2, buildYear: 2010, storyCapacity: [55, 20, 0], name: 'Forest'})
有了 Neo4j 中的图,我们现在可以将其投影到图目录中,为算法执行做准备。我们使用 Cypher 投影来完成此操作,目标是 `Hotel` 节点,包括它们的属性。请注意,缩放节点属性不需要任何关系。因此,我们对关系使用星形投影 ('*')。
MATCH (hotel:Hotel)
RETURN gds.graph.project(
'myGraph',
hotel,
null,
{
sourceNodeProperties: hotel { .avgReview, .buildYear, .storyCapacity },
targetNodeProperties: {}
}
)
在以下示例中,我们将演示如何缩放此图的节点属性。
内存估算
首先,我们将使用 `estimate` 过程估算运行算法的成本。这可以在任何执行模式下完成。在本例中,我们将使用 `stream` 模式。估算算法有助于了解在图上运行算法对内存的影响。当您稍后实际以某种执行模式运行算法时,系统将执行估算。如果估算显示执行极有可能超出其内存限制,则禁止执行。要了解更多信息,请参阅自动估算和执行阻止。
有关 `estimate` 的更多详细信息,请参阅内存估算。
CALL gds.scaleProperties.stream.estimate('myGraph', {
nodeProperties: ['buildYear', 'storyCapacity'],
scaler: 'MinMax'
})
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
节点数 | 关系数 | 最小字节数 | 最大字节数 | 所需内存 |
---|---|---|---|---|
8 |
0 |
480 |
480 |
"480 字节" |
流模式
在 `stream` 执行模式下,算法返回每个节点的缩放属性。这使我们能够直接检查结果或在 Cypher 中对其进行后处理,而不会产生任何副作用。请注意,输出始终是单个列表属性,其中包含按输入顺序排列的所有缩放节点属性。
有关 `stream` 模式的更多详细信息,请参阅流模式。
CALL gds.scaleProperties.stream('myGraph', {
nodeProperties: ['buildYear', 'avgReview'],
scaler: 'MinMax'
}) YIELD nodeId, scaledProperty
RETURN gds.util.asNode(nodeId).name AS name, scaledProperty
ORDER BY name ASC
名称 | scaledProperty |
---|---|
"Beach" |
[0.3709677419354839, 0.3209342560553633] |
"Central" |
[0.6612903225806451, 1.0] |
"East" |
[0.3225806451612903, 0.35986159169550175] |
"Forest" |
[0.8387096774193549, 0.12629757785467127] |
"Mountain" |
[0.41935483870967744, 0.4679930795847751] |
"Plaza" |
[0.0, 0.5285467128027681] |
"Polar" |
[1.0, 0.17863321799307957] |
"West" |
[0.7580645161290323, 0.0] |
在结果中,我们可以观察到 `scaledProperty` 的第一个元素是我们得到的 `buildYear` 的最小-最大缩放值,其中 `Plaza` 酒店具有最小值并缩放到零,而 `Polar` 酒店具有最大值并缩放到一。这可以通过示例图进行验证。`scaledProperty` 结果中的第二个值是 `avgReview` 属性的缩放值。
修改模式
在 `mutate` 执行模式下,您可以更新具名图,为其中的节点添加一个包含缩放属性的新节点属性。新属性的名称通过强制配置参数 `mutateProperty` 指定。结果是包含计算指标的单个摘要行。`mutate` 模式在多个算法结合使用时特别有用。
有关 `mutate` 模式的更多详细信息,请参阅修改模式。
在本例中,我们将使用平均值缩放器缩放 `buildYear` 和 `avgReview` 这两个酒店属性。输出是一个列表属性,我们将其命名为 `hotelFeatures`,设想稍后将其用作机器学习模型的输入。
CALL gds.scaleProperties.mutate('myGraph', {
nodeProperties: ['buildYear', 'avgReview'],
scaler: 'Mean',
mutateProperty: 'hotelFeatures'
}) YIELD nodePropertiesWritten, scalerStatistics
nodePropertiesWritten | scalerStatistics |
---|---|
8 |
{avgReview={avg=[4.49875], max=[19.0], min=[-4.12]}, buildYear={avg=[1991.875], max=[2020.0], min=[1958.0]}} |
结果显示,内存中图现在有八个新的节点属性。这些属性包含输入属性的缩放值,其中缩放后的 `buildYear` 值位于列表的第一个位置,缩放后的 `avgReview` 值位于第二个位置。要了解如何检查内存中图的新模式,请参阅列出目录中的图。
统计模式
在 `stats` 执行模式下,算法返回包含算法结果摘要的单行数据。此执行模式没有任何副作用。通过检查 `computeMillis` 返回项,它可用于评估算法性能。在下面的示例中,我们将省略返回计时。该过程的完整签名可在语法部分中找到。
有关 `stats` 模式的更多详细信息,请参阅统计模式。
CALL gds.scaleProperties.stats('myGraph', {
nodeProperties: ['buildYear', 'avgReview'],
scaler: 'center'
}) YIELD scalerStatistics
scalerStatistics |
---|
{avgReview={avg=[4.49875]}, buildYear={avg=[1991.875]}} |
不同的缩放器在计算过程中需要计算不同的统计数据。这将在返回的 `scalerStatistics` 中体现。由于“中心化”计算各种输入属性的平均值,因此在这种情况下,我们获得的就是缩放器统计结果。
写入模式
`write` 执行模式在 `stats` 模式的基础上增加了一个重要的副作用:将每个节点的缩放属性作为属性写入 Neo4j 数据库。新属性的名称通过强制配置参数 `writeProperty` 指定。结果是类似于 `stats` 的单个摘要行,但包含一些额外的指标。`write` 模式可以直接将结果持久化到数据库。
有关 `write` 模式的更多详细信息,请参阅写入模式。
CALL gds.scaleProperties.write('myGraph', {
nodeProperties: ['buildYear', 'avgReview'],
scaler: 'stdscore',
writeProperty: 'hotelStdScore'
}) YIELD nodePropertiesWritten, scalerStatistics
nodePropertiesWritten | scalerStatistics |
---|---|
8 |
{avgReview={avg=[4.49875], std=[6.6758378454]}, buildYear={avg=[1991.875], std=[18.9171714323]}} |
结果显示,数据库图中的节点现在有八个新的节点属性,它们对应于投影 `'myGraph'` 中的节点。这些节点属性包含输入属性的缩放值,其中缩放后的 `buildYear` 值位于列表的第一个位置,缩放后的 `avgReview` 值位于第二个位置。
列表属性
`storyCapacity` 属性表示酒店每层的房间数量。该属性已归一化,因此楼层较少的酒店具有零值。这是因为属性缩放算法要求同一属性的所有值具有相同的长度。在此示例中,我们将展示如何使用属性缩放算法缩放这些列表中的值。我们设想将输出用作特征向量以输入到机器学习算法中。此外,我们还将 `avgReview` 属性包含在我们的特征向量中。
CALL gds.scaleProperties.stream('myGraph', {
nodeProperties: ['avgReview', 'storyCapacity'],
scaler: 'StdScore'
}) YIELD nodeId, scaledProperty
RETURN gds.util.asNode(nodeId).name AS name, scaledProperty AS features
ORDER BY name ASC
名称 | 特征 |
---|---|
"Beach" |
[-0.17956547594003253, -0.03401933556831381, 0.00254261210704973, -0.5187592498702616] |
"Central" |
[2.172199255871029, -0.3968922482969945, -0.3534230828799124, -0.2806402499298136] |
"East" |
[-0.0447509371737933, -0.5731448059080679, -0.526320706159294, -0.5187592498702616] |
"Forest" |
[-0.8536381697712284, -0.513529970245499, -0.5568320514438908, -0.5187592498702616] |
"Mountain" |
[0.32973389273242665, -0.4487312358296632, -0.6076842935848854, -0.5187592498702616] |
"Plaza" |
[0.5394453974799097, -0.609432097180936, -0.5568320514438908, -0.5187592498702616] |
"Polar" |
[-0.672387512096618, 2.583849534831454, 2.5705808402272767, 2.542770749364069] |
"West" |
[-1.2910364511016934, -0.00809984180197948, 0.027968733177547028, 0.3316657499170525] |
结果特征向量在列表的第一个位置包含 `avgReview` 属性的标准分数缩放值。我们可以看到一些值是负数,并且 `Central` 酒店的最大值很突出。
其他三个列表位置是 `storyCapacity` 列表属性的缩放值。请注意,每个列表项仅相对于其他列表中对应的项进行缩放。因此,`Polar` 酒店在所有列表位置都具有最大的缩放值。
缩放器特定配置
`log` 缩放器支持可配置的偏移量参数。在本示例中,我们将说明如何配置该偏移量。
我们想要缩放 `avgReview` 属性,但它包含负数,而对数对于负数是未定义的。首先,我们将使用 Cypher 的 `min()` 聚合函数确定最小值。
CALL gds.graph.nodeProperty.stream('myGraph', 'avgReview') YIELD propertyValue RETURN min(propertyValue) AS minimumAvgReview
minimumAvgReview |
---|
-4.12 |
了解这个值后,我们可以使用一个更大的值,从而确保对数是一个有限值。我们将使用 `5.12`,因为这将使最小的缩放值为零。
CALL gds.scaleProperties.stream('myGraph', {
nodeProperties: ['avgReview'],
scaler: {type: 'Log', offset: 5.12}
}) YIELD nodeId, scaledProperty
RETURN gds.util.asNode(nodeId).name AS name, scaledProperty
ORDER BY name ASC
名称 | scaledProperty |
---|---|
"Beach" |
[2.130609828254235] |
"Central" |
[3.183041371858985] |
"East" |
[2.2321626286975] |
"Forest" |
[1.366091653802371] |
"Mountain" |
[2.469793011977952] |
"Plaza" |
[2.581730834423540] |
"Polar" |
[1.635105659182678] |
"West" |
[0.0] |
正如我们所见,所有缩放值都是有限数字。特别是,最小缩放值为零。如果您对结果感到好奇,请尝试使用小于 `4.12` 的偏移量运行此示例。