动态平衡在 SPSS Modeler 中编写脚本要了解如何自动化 SPSS Modeler 中的任务,请先阅读以下文章:
- Julian Clinton 撰写的
- Paul Brown 撰写的
平衡节点允许数据科学家输入条件和用于平衡的系数,但这些系数通常依赖于被分析的数据集中的平衡。因此,在会定期更改数据集和重新训练模型的环境中,用于平衡的系数也会发生更改。如果手动重新训练模型,或者基础数据中的平衡没有显著变化,那么在检查数据后和重新训练模型前,数据科学家不需要做太多额外工作来更改这些系数。但是,如果以自动化方式构建和重新训练模型,使用同一个流为不同的客户细分类别或产品构建模型,则将需要动态平衡来适应具有不同比例的数据集。
可使用流脚本来操作平衡节点,重设系数,以及甚至重设节点的条件。
示例 4:使用脚本的动态平衡 和流脚本。
示例 4 展示了如何动态创建必要的系数和条件,以平衡之前的示例中使用的数据集,通过减少数据集中的男性数量来实现均匀的男女分布。
通过流脚本来执行动态平衡的流 流的最长分支计算系数和条件。count_by_gender 汇总节点仅创建一个分别包含规定数量的男性和女性的数据集。
GENDERCount_by_gender Male 4 Female 2 名为 Target Count 的 通过获取性别计数的最小值来确定平衡方法(在本例中为 reduction)。这是每个类别的目标案例数量,而且可以轻松地将它从 Min(reducing)更改为 Max(boosting)或 Mean(reducing 和 boosting 的组合)。也可使用一个或多个节点代替该节点,以不同方式创建想要的目标数量。
将两个汇总节点合并到一个数据集中,每个性别对应一条记录。
GENDERCount_by_gender Target_count Male 4 2 Female 2 2 系数节点是一个 ,它使用公式 target_count/count_by_gender 导出系数供平衡中的每种性别使用。该公式计算每个类别的目标案例数量与该类别的实际案例数量的比率。
条件节点使用公式 "GENDER = \"" >< GENDER >< "\"" 导出要用于平衡节点中的每个性别的条件。
名为 Directives 的 显示在一个表中显示系数和条件,使表中的值可供脚本使用。
系数条件 0.500 GENDER = "Male" 1.000 GENDER = "Female" 可在指令节点之前添加 ,以便丢弃该系数等于 1 的所有记录,因为这些记录在平衡节点中没有任何用处。
下面的代码展示了执行指令表节点来在表中显示计算出的指令的流脚本。
1
2
3
4
5
| # Execute the "Directives" table node to compute the directives
directivesResults = []
diagram.findByType('tablenode', "Directives .run(directivesResults)
directivesRowSet = directivesResults[0].getRowSet()
directivesRowCount = directivesRowSet.getRowCount()
|
该代码还捕获指令总数作为表中的行数。
directivesAll = [ ] 变量声明为持有从表输出捕获的列表中的每个指令。
随着脚本迭代表输出的每一行,下面的代码将系数和条件组装到一个指令中,该指令存储为一个包含两个元素的列表。
1
2
3
4
5
6
7
8
9
10
11
| # Iterate through the table output to read each directive
for ii in range(directivesRowCount):
directiveCurrent = []
# Get the factor
directiveFactor = directivesRowSet.getValueAt(ii, 0)
directiveCurrent.append(directiveFactor)
# Get the condition
directiveCondition = directivesRowSet.getValueAt(ii, 1)
directiveCurrent.append(directiveCondition)
# Append the directive into a list of lists
directivesAll.append(directiveCurrent)
|
使用下面的代码组装指令后,就可以将它们用作平衡节点中的指令。
1
2
3
| # Set the directives in the Balance node
balanceNode = diagram.findByType('balancenode', "Balance")
balanceNode.setPropertyValue('directives', directivesAll)
|
无论在执行脚本前平衡节点中的设置是什么,这些设置都会反映出执行脚本后的指令表节点输出的内容,如 所示。
脚本化的平衡节点指令 该数据集现在拥有均匀的男女分布,而且它将始终拥有均衡的分布,甚至在源数据中的基础分布发生改变时也是如此。
IDGENDER NUM_PAGES A Male 181 D Male 164 E Female 175 F Female 188 无论您喜欢 boost 不常见的类别还是 reduce 更常见的类别,此方法都适用,因为这取决于您对 Target_count 字段的计算结果。
也可以仅使用画布上的节点,按动态分配的系数来复制平衡节点的输出,而无需编写脚本。如果流脚本已很复杂,或者需要在多个属性间进行更复杂的平衡,您可能更喜欢此选项。
最好在减少更常见类别中的案例数量时使用动态平衡,因为这使您能够使用许多相同的基础节点来获得 示例 4 中演示的相同结果,而无需执行脚本。
示例 5:使用复杂采样的动态平衡 本示例中使用的流。
示例 5 的目的与示例 4 相同:创建一个具有均匀的男女分布的数据集。
通过采样执行动态平衡的流 该流的上分支几乎总是与示例 4 中使用的流相同,除非不再需要名为 Factor and Condition 的导出节点并已省略它。
第二个合并节点将源数据与上分支中计算的指令相合并,包括每个类别的目标数量和将用于采样更常见类别的系数。
GENDERIDNUM_PAGESTarget_count Female F 188 4 Female E 175 4 Male D 164 4 Male C 142 4 Male B 191 4 Male A 181 4 名为 Complex 的 将代替平衡节点来执行平衡。
将采样方法设置为 Complex,如 所示。选择 GENDER 字段作为用于对采样分层的字段。
样本节点的设置 然后选择计算的字段 Factor 作为按比例随机采样的变量。
IDGENDERNUM_PAGES A Male 181 D Male 164 E Female 175 F Female 188 同样地,结果数据集具有均匀的男女分布。
动态平衡方法的一个优势是,样本节点包含将随机种子设置为常量值的选项,这使得随机采样在每次执行时返回完全相同的记录。常规的平衡节点没有此功能,如 中所述。
选择最佳的平衡系数 |