我正在使用 sklearn 的决策树将业务规则的混乱且难以维护的实现替换为长 if-elif-else 链。我使用所有标签的数千个测试用例来验证树,但有时我用作训练数据的规则表有错误,一些测试随机失败。
我需要一种方法来验证树,而不是结果的测试用例。假设如果所有叶节点的 gini = 0.0,那么使用不同随机种子生成的树之间的分类不会有随机变化,这是否正确?如果我需要在我的应用程序上强制执行,在更新训练数据时检查是否合理?
请注意,我的案例不是典型的分类问题,因为我已经在代码中实现了决策树,并且我想使用一种算法从精心定制的数据而不是真实世界的数据样本中生成等效树,仅仅是因为在我用业务规则维护数据集比维护代码更容易。
因此,在我的数据集中,这些特征将理想地涵盖所有可能的值范围,并为此提供一个明确的标签。例如,虽然现实世界的训练集可能类似于:
features = [[1], [1.1], [2], [2.3]]
labels = ['sativa', 'sativa', 'indica', 'indica']
一个算法可以随机产生一个 tree1,如:
if feature < 1.75:
return 'sativa'
else:
return 'indica'
还有一个 tree2 像:
if feature < 1.55:
return 'sativa'
else:
return 'indica'
但是,我的训练集不会出现随机性出现的间隙。就像:
features = [[1], [1.9], [2], [2.3]]
labels = ['sativa', 'sativa', 'indica', 'indica']
因此,无论初始随机状态如何,树总是(显然,忽略低于 0.1 的差异):
if feature < 1.95:
return 'sativa'
else:
return 'indica'
我的问题恰恰是我需要验证训练集是否有错误,是否存在随机变化的值差距,或者是否将同一组特征分配给不同的标签。修复随机状态并不能解决这个问题,它只能保证相同的数据总是会生成相同的树。
那么,除了在生成树之前验证这些问题的数据之外,还有什么方法可以确定这是否发生在树上,或者运行一次足够大的综合测试以排除随机变化?