xgboost如何强制单调性约束

时间:2017-05-29 06:42:16

标签: machine-learning xgboost gradient-descent ensemble-learning

我想知道xgboost在构建树模型时如何强制执行单调约束。到目前为止,通过阅读代码,我已经了解它与每个节点的权重有关,但我无法理解为什么这种方法有效。 提前感谢您的回答

1 个答案:

答案 0 :(得分:1)

这是LightGBM中相同功能的简单伪代码:

min_value = node.min_value
max_value = node.max_value

check(min_value <= split.left_output) 
check(min_value <= split.right_output)
check(max_value >= split.left_otput)
check(max_value >= split.right_output)
mid = (split.left_output + split.right_output) / 2;

if (split.feature is monotonic increasing) {
  check(split.left_output <= split.right_output)
  node.left_child.set_max_value(mid)
  node.right_child.set_min_value(mid)
}
if (split.feature is monotonic decreasing ) {
  check(split.left_output >= split.right_output)
  node.left_child.set_min_value(mid)
  node.right_child.set_max_value(mid)
}

参考:https://github.com/Microsoft/LightGBM/issues/14#issuecomment-359752223

我认为它与XGBoost中实现的算法基本相同。

对于每个分开的候选人:

  1. 根据从前辈传播的单调性约束检查两个叶子的值。
  2. 检查两片叶子之间的单调性。
  3. 如果单调性被打破,则拒绝拆分。