如何避免在 Orange CN2 规则中使用相同的变量两次?
How to avoid same variable being used twice in an Orange CN2 rule?
我正在使用 Orange CN2 进行规则归纳。有时,一个变量在规则中使用两次。这是一个示例规则:"IF score > 40 and amount < 100 and score > 55 THEN status = bad"。有没有办法配置 CN2,使变量只能在规则中使用一次?此外,是否可以将 CN2 配置为仅允许“>”条件(即不允许“<”)用于连续变量?
我认为您无法阻止 CN2 多次使用同一属性。在某些情况下,您实际上确实需要两个条件,例如得分 > 40 且得分 < 50。
但是,在您的情况下,第一个条件(分数>40)是不必要的。我建议您编写一个运行通过规则条件 (rule.filter.conditions) 的后剪枝程序,尝试删除每个条件并查看新规则是否涵盖与以前相同的示例。
对于第二个问题,没有简单的方法来禁止特定条件,例如所有连续值的“<”。最好的办法可能是实施一个新的验证器 class (learner.rule_finder.validator),它会拒绝条件错误的规则。类似的东西:
class ConditionsValidator(Orange.core.RuleValidator):
""" prunes rules with 'isgreater' conditions """
def __call__(self, rule, data, weight_id, target_class, prior):
for c in rule.filter.conditions:
if c.oper == Orange.data.filter.ValueFilter.Greater:
return False
return True
然后,将此验证器的一个对象设置为规则学习器的新验证器:
learner.rule_finder.validator = ConditionsValidator()
我正在使用 Orange CN2 进行规则归纳。有时,一个变量在规则中使用两次。这是一个示例规则:"IF score > 40 and amount < 100 and score > 55 THEN status = bad"。有没有办法配置 CN2,使变量只能在规则中使用一次?此外,是否可以将 CN2 配置为仅允许“>”条件(即不允许“<”)用于连续变量?
我认为您无法阻止 CN2 多次使用同一属性。在某些情况下,您实际上确实需要两个条件,例如得分 > 40 且得分 < 50。
但是,在您的情况下,第一个条件(分数>40)是不必要的。我建议您编写一个运行通过规则条件 (rule.filter.conditions) 的后剪枝程序,尝试删除每个条件并查看新规则是否涵盖与以前相同的示例。
对于第二个问题,没有简单的方法来禁止特定条件,例如所有连续值的“<”。最好的办法可能是实施一个新的验证器 class (learner.rule_finder.validator),它会拒绝条件错误的规则。类似的东西:
class ConditionsValidator(Orange.core.RuleValidator):
""" prunes rules with 'isgreater' conditions """
def __call__(self, rule, data, weight_id, target_class, prior):
for c in rule.filter.conditions:
if c.oper == Orange.data.filter.ValueFilter.Greater:
return False
return True
然后,将此验证器的一个对象设置为规则学习器的新验证器:
learner.rule_finder.validator = ConditionsValidator()